From a303d02dcaf105fe42982c8dc75b885ae2e7752c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andrew=20Lee=20=28=E6=9D=8E=E5=81=A5=E7=A7=8B=29?= Date: Wed, 12 Aug 2015 05:25:46 +0800 Subject: [PATCH] Adding upstream version 0.9.0. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Andrew Lee (李健秋) --- .gitignore | 2 + AUTHORS | 10 + CMakeLists.txt | 169 +++++ COPYING | 461 +++++++++++++ commanditemmodel.cpp | 396 +++++++++++ commanditemmodel.h | 106 +++ configuredialog/configuredialog.cpp | 156 +++++ configuredialog/configuredialog.h | 76 +++ configuredialog/configuredialog.ui | 157 +++++ dialog.cpp | 445 ++++++++++++ dialog.h | 99 +++ dialog.ui | 170 +++++ main.cpp | 44 ++ man/lxqt-runner.1 | 49 ++ providers.cpp | 973 +++++++++++++++++++++++++++ providers.h | 374 ++++++++++ translations/lxqt-runner.ts | 98 +++ translations/lxqt-runner_ar.ts | 75 +++ translations/lxqt-runner_cs.ts | 75 +++ translations/lxqt-runner_cs_CZ.ts | 75 +++ translations/lxqt-runner_da.ts | 81 +++ translations/lxqt-runner_da_DK.ts | 75 +++ translations/lxqt-runner_de.ts | 81 +++ translations/lxqt-runner_de_DE.ts | 75 +++ translations/lxqt-runner_el_GR.ts | 75 +++ translations/lxqt-runner_eo.ts | 75 +++ translations/lxqt-runner_es.ts | 75 +++ translations/lxqt-runner_es_VE.ts | 75 +++ translations/lxqt-runner_eu.ts | 75 +++ translations/lxqt-runner_fi.ts | 75 +++ translations/lxqt-runner_fr_FR.ts | 75 +++ translations/lxqt-runner_hu.ts | 81 +++ translations/lxqt-runner_ia.ts | 81 +++ translations/lxqt-runner_id_ID.ts | 81 +++ translations/lxqt-runner_it_IT.ts | 75 +++ translations/lxqt-runner_ja.ts | 75 +++ translations/lxqt-runner_ko.ts | 81 +++ translations/lxqt-runner_lt.ts | 75 +++ translations/lxqt-runner_nl.ts | 75 +++ translations/lxqt-runner_pl_PL.ts | 75 +++ translations/lxqt-runner_pt.ts | 77 +++ translations/lxqt-runner_pt_BR.ts | 75 +++ translations/lxqt-runner_ro_RO.ts | 75 +++ translations/lxqt-runner_ru.ts | 98 +++ translations/lxqt-runner_ru_RU.ts | 98 +++ translations/lxqt-runner_sk_SK.ts | 75 +++ translations/lxqt-runner_sl.ts | 75 +++ translations/lxqt-runner_sr@latin.ts | 81 +++ translations/lxqt-runner_sr_BA.ts | 69 ++ translations/lxqt-runner_sr_RS.ts | 75 +++ translations/lxqt-runner_th_TH.ts | 75 +++ translations/lxqt-runner_tr.ts | 75 +++ translations/lxqt-runner_uk.ts | 75 +++ translations/lxqt-runner_zh_CN.ts | 75 +++ translations/lxqt-runner_zh_TW.ts | 75 +++ vbox-icons/os_archlinux.png | Bin 0 -> 2436 bytes vbox-icons/os_archlinux_64.png | Bin 0 -> 2571 bytes vbox-icons/os_debian.png | Bin 0 -> 2628 bytes vbox-icons/os_debian_64.png | Bin 0 -> 2731 bytes vbox-icons/os_dos.png | Bin 0 -> 2718 bytes vbox-icons/os_fedora.png | Bin 0 -> 2278 bytes vbox-icons/os_fedora_64.png | Bin 0 -> 2436 bytes vbox-icons/os_freebsd.png | Bin 0 -> 2323 bytes vbox-icons/os_freebsd_64.png | Bin 0 -> 2523 bytes vbox-icons/os_gentoo.png | Bin 0 -> 1966 bytes vbox-icons/os_gentoo_64.png | Bin 0 -> 2077 bytes vbox-icons/os_l4.png | Bin 0 -> 2104 bytes vbox-icons/os_linux.png | Bin 0 -> 2466 bytes vbox-icons/os_linux22.png | Bin 0 -> 2550 bytes vbox-icons/os_linux24.png | Bin 0 -> 2557 bytes vbox-icons/os_linux24_64.png | Bin 0 -> 2679 bytes vbox-icons/os_linux26.png | Bin 0 -> 2567 bytes vbox-icons/os_linux26_64.png | Bin 0 -> 2687 bytes vbox-icons/os_linux_other.png | Bin 0 -> 2545 bytes vbox-icons/os_mandriva.png | Bin 0 -> 2207 bytes vbox-icons/os_mandriva_64.png | Bin 0 -> 2403 bytes vbox-icons/os_netbsd.png | Bin 0 -> 2442 bytes vbox-icons/os_netbsd_64.png | Bin 0 -> 2499 bytes vbox-icons/os_netware.png | Bin 0 -> 2601 bytes vbox-icons/os_openbsd.png | Bin 0 -> 2442 bytes vbox-icons/os_openbsd_64.png | Bin 0 -> 2539 bytes vbox-icons/os_opensolaris.png | Bin 0 -> 3046 bytes vbox-icons/os_opensolaris_64.png | Bin 0 -> 2885 bytes vbox-icons/os_opensuse.png | Bin 0 -> 2640 bytes vbox-icons/os_opensuse_64.png | Bin 0 -> 2777 bytes vbox-icons/os_os2_other.png | Bin 0 -> 3073 bytes vbox-icons/os_os2ecs.png | Bin 0 -> 2313 bytes vbox-icons/os_os2warp3.png | Bin 0 -> 3073 bytes vbox-icons/os_os2warp4.png | Bin 0 -> 2632 bytes vbox-icons/os_os2warp45.png | Bin 0 -> 2649 bytes vbox-icons/os_other.png | Bin 0 -> 2271 bytes vbox-icons/os_qnx.png | Bin 0 -> 2968 bytes vbox-icons/os_redhat.png | Bin 0 -> 2661 bytes vbox-icons/os_redhat_64.png | Bin 0 -> 2780 bytes vbox-icons/os_solaris.png | Bin 0 -> 2116 bytes vbox-icons/os_solaris_64.png | Bin 0 -> 1993 bytes vbox-icons/os_ubuntu.png | Bin 0 -> 2298 bytes vbox-icons/os_ubuntu_64.png | Bin 0 -> 2328 bytes vbox-icons/os_win2k.png | Bin 0 -> 2760 bytes vbox-icons/os_win2k3.png | Bin 0 -> 2762 bytes vbox-icons/os_win2k3_64.png | Bin 0 -> 2819 bytes vbox-icons/os_win2k8.png | Bin 0 -> 2760 bytes vbox-icons/os_win2k8_64.png | Bin 0 -> 2806 bytes vbox-icons/os_win31.png | Bin 0 -> 2760 bytes vbox-icons/os_win7.png | Bin 0 -> 2727 bytes vbox-icons/os_win7_64.png | Bin 0 -> 2776 bytes vbox-icons/os_win95.png | Bin 0 -> 2765 bytes vbox-icons/os_win98.png | Bin 0 -> 2763 bytes vbox-icons/os_win_other.png | Bin 0 -> 2730 bytes vbox-icons/os_winme.png | Bin 0 -> 2738 bytes vbox-icons/os_winnt4.png | Bin 0 -> 2754 bytes vbox-icons/os_winvista.png | Bin 0 -> 2752 bytes vbox-icons/os_winvista_64.png | Bin 0 -> 2802 bytes vbox-icons/os_winxp.png | Bin 0 -> 2727 bytes vbox-icons/os_winxp_64.png | Bin 0 -> 2780 bytes vbox-icons/os_xandros.png | Bin 0 -> 2330 bytes vbox-icons/os_xandros_64.png | Bin 0 -> 2274 bytes vbox-icons/state_running_16px.png | Bin 0 -> 3489 bytes vbox-icons/vrdp_16px.png | Bin 0 -> 3358 bytes virtualbox-icons.qrc | 68 ++ widgets.cpp | 102 +++ widgets.h | 72 ++ yamlparser.cpp | 80 +++ yamlparser.h | 49 ++ 124 files changed, 7090 insertions(+) create mode 100644 .gitignore create mode 100644 AUTHORS create mode 100644 CMakeLists.txt create mode 100644 COPYING create mode 100644 commanditemmodel.cpp create mode 100644 commanditemmodel.h create mode 100644 configuredialog/configuredialog.cpp create mode 100644 configuredialog/configuredialog.h create mode 100644 configuredialog/configuredialog.ui create mode 100644 dialog.cpp create mode 100644 dialog.h create mode 100644 dialog.ui create mode 100644 main.cpp create mode 100644 man/lxqt-runner.1 create mode 100644 providers.cpp create mode 100644 providers.h create mode 100644 translations/lxqt-runner.ts create mode 100644 translations/lxqt-runner_ar.ts create mode 100644 translations/lxqt-runner_cs.ts create mode 100644 translations/lxqt-runner_cs_CZ.ts create mode 100644 translations/lxqt-runner_da.ts create mode 100644 translations/lxqt-runner_da_DK.ts create mode 100644 translations/lxqt-runner_de.ts create mode 100644 translations/lxqt-runner_de_DE.ts create mode 100644 translations/lxqt-runner_el_GR.ts create mode 100644 translations/lxqt-runner_eo.ts create mode 100644 translations/lxqt-runner_es.ts create mode 100644 translations/lxqt-runner_es_VE.ts create mode 100644 translations/lxqt-runner_eu.ts create mode 100644 translations/lxqt-runner_fi.ts create mode 100644 translations/lxqt-runner_fr_FR.ts create mode 100644 translations/lxqt-runner_hu.ts create mode 100644 translations/lxqt-runner_ia.ts create mode 100644 translations/lxqt-runner_id_ID.ts create mode 100644 translations/lxqt-runner_it_IT.ts create mode 100644 translations/lxqt-runner_ja.ts create mode 100644 translations/lxqt-runner_ko.ts create mode 100644 translations/lxqt-runner_lt.ts create mode 100644 translations/lxqt-runner_nl.ts create mode 100644 translations/lxqt-runner_pl_PL.ts create mode 100644 translations/lxqt-runner_pt.ts create mode 100644 translations/lxqt-runner_pt_BR.ts create mode 100644 translations/lxqt-runner_ro_RO.ts create mode 100644 translations/lxqt-runner_ru.ts create mode 100644 translations/lxqt-runner_ru_RU.ts create mode 100644 translations/lxqt-runner_sk_SK.ts create mode 100644 translations/lxqt-runner_sl.ts create mode 100644 translations/lxqt-runner_sr@latin.ts create mode 100644 translations/lxqt-runner_sr_BA.ts create mode 100644 translations/lxqt-runner_sr_RS.ts create mode 100644 translations/lxqt-runner_th_TH.ts create mode 100644 translations/lxqt-runner_tr.ts create mode 100644 translations/lxqt-runner_uk.ts create mode 100644 translations/lxqt-runner_zh_CN.ts create mode 100644 translations/lxqt-runner_zh_TW.ts create mode 100644 vbox-icons/os_archlinux.png create mode 100644 vbox-icons/os_archlinux_64.png create mode 100644 vbox-icons/os_debian.png create mode 100644 vbox-icons/os_debian_64.png create mode 100644 vbox-icons/os_dos.png create mode 100644 vbox-icons/os_fedora.png create mode 100644 vbox-icons/os_fedora_64.png create mode 100644 vbox-icons/os_freebsd.png create mode 100644 vbox-icons/os_freebsd_64.png create mode 100644 vbox-icons/os_gentoo.png create mode 100644 vbox-icons/os_gentoo_64.png create mode 100644 vbox-icons/os_l4.png create mode 100644 vbox-icons/os_linux.png create mode 100644 vbox-icons/os_linux22.png create mode 100644 vbox-icons/os_linux24.png create mode 100644 vbox-icons/os_linux24_64.png create mode 100644 vbox-icons/os_linux26.png create mode 100644 vbox-icons/os_linux26_64.png create mode 100644 vbox-icons/os_linux_other.png create mode 100644 vbox-icons/os_mandriva.png create mode 100644 vbox-icons/os_mandriva_64.png create mode 100644 vbox-icons/os_netbsd.png create mode 100644 vbox-icons/os_netbsd_64.png create mode 100644 vbox-icons/os_netware.png create mode 100644 vbox-icons/os_openbsd.png create mode 100644 vbox-icons/os_openbsd_64.png create mode 100644 vbox-icons/os_opensolaris.png create mode 100644 vbox-icons/os_opensolaris_64.png create mode 100644 vbox-icons/os_opensuse.png create mode 100644 vbox-icons/os_opensuse_64.png create mode 100644 vbox-icons/os_os2_other.png create mode 100644 vbox-icons/os_os2ecs.png create mode 100644 vbox-icons/os_os2warp3.png create mode 100644 vbox-icons/os_os2warp4.png create mode 100644 vbox-icons/os_os2warp45.png create mode 100644 vbox-icons/os_other.png create mode 100644 vbox-icons/os_qnx.png create mode 100644 vbox-icons/os_redhat.png create mode 100644 vbox-icons/os_redhat_64.png create mode 100644 vbox-icons/os_solaris.png create mode 100644 vbox-icons/os_solaris_64.png create mode 100644 vbox-icons/os_ubuntu.png create mode 100644 vbox-icons/os_ubuntu_64.png create mode 100644 vbox-icons/os_win2k.png create mode 100644 vbox-icons/os_win2k3.png create mode 100644 vbox-icons/os_win2k3_64.png create mode 100644 vbox-icons/os_win2k8.png create mode 100644 vbox-icons/os_win2k8_64.png create mode 100644 vbox-icons/os_win31.png create mode 100644 vbox-icons/os_win7.png create mode 100644 vbox-icons/os_win7_64.png create mode 100644 vbox-icons/os_win95.png create mode 100644 vbox-icons/os_win98.png create mode 100644 vbox-icons/os_win_other.png create mode 100644 vbox-icons/os_winme.png create mode 100644 vbox-icons/os_winnt4.png create mode 100644 vbox-icons/os_winvista.png create mode 100644 vbox-icons/os_winvista_64.png create mode 100644 vbox-icons/os_winxp.png create mode 100644 vbox-icons/os_winxp_64.png create mode 100644 vbox-icons/os_xandros.png create mode 100644 vbox-icons/os_xandros_64.png create mode 100644 vbox-icons/state_running_16px.png create mode 100644 vbox-icons/vrdp_16px.png create mode 100644 virtualbox-icons.qrc create mode 100644 widgets.cpp create mode 100644 widgets.h create mode 100644 yamlparser.cpp create mode 100644 yamlparser.h diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..384cad1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +build +nbproject diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..190d298 --- /dev/null +++ b/AUTHORS @@ -0,0 +1,10 @@ +Upstream Authors: + LXQt team: http://lxqt.org + Razor team: http://razor-qt.org + +Copyright: + Copyright (c) 2010-2012 Razor team + Copyright (c) 2012-2014 LXQt team + +License: GPL-2 and LGPL-2.1+ +The full text of the licenses can be found in the 'COPYING' file. diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..0e55887 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,169 @@ +cmake_minimum_required(VERSION 2.8.11) + +project(lxqt-runner) + +set(CMAKE_INCLUDE_CURRENT_DIR ON) +set(CMAKE_POSITION_INDEPENDENT_CODE ON) +set(CMAKE_AUTOMOC ON) + +option(UPDATE_TRANSLATIONS "Update source translation translations/*.ts files" OFF) + +find_package(KF5WindowSystem REQUIRED) +find_package(Qt5Widgets REQUIRED) +find_package(Qt5Xml REQUIRED) +find_package(Qt5Script REQUIRED) +find_package(Qt5LinguistTools REQUIRED QUIET) +find_package(lxqt REQUIRED) +find_package(Qt5Xdg REQUIRED) +find_package(lxqt-globalkeys REQUIRED) +find_package(lxqt-globalkeys-ui REQUIRED) +message(STATUS "Building with Qt${Qt5Core_VERSION_STRING}") +set(QTX_LIBRARIES Qt5::Widgets Qt5::Xml Qt5::Script) + +include(${LXQT_USE_FILE}) +include(${QTXDG_USE_FILE}) +include(${LXQT_GLOBALKEYS_USE_FILE}) +include(${LXQT_GLOBALKEYS_UI_USE_FILE}) + +# optionally use libmenu-cache from lxde to generate the application menu +find_package(PkgConfig) + +if (NOT WITHOUT_MENU_CACHE) + pkg_check_modules(MENU_CACHE + libmenu-cache>=0.3.3 + ) +endif(NOT WITHOUT_MENU_CACHE) + +# if libmenu-cache is available +if (MENU_CACHE_FOUND) + include_directories(${MENU_CACHE_INCLUDE_DIRS}) + add_definitions(-DHAVE_MENU_CACHE=1) +endif() + + +set(lxqt-runner_H_FILES + dialog.h + commanditemmodel.h + widgets.h + providers.h + yamlparser.h + configuredialog/configuredialog.h +) + +set(lxqt-runner_CPP_FILES + main.cpp + dialog.cpp + commanditemmodel.cpp + widgets.cpp + providers.cpp + yamlparser.cpp + configuredialog/configuredialog.cpp +) + +set(lxqt-runner_UI_FILES + dialog.ui + configuredialog/configuredialog.ui +) + +set(QRC_FILES + +) + +set(lxqt-runner_LIBRARIES + ${LXQT_LIBRARIES} + ${LXQT_GLOBALKEYS_LIBRARIES} + ${LXQT_GLOBALKEYS_UI_LIBRARIES} + ${QTXDG_LIBRARIES} + ${MENU_CACHE_LIBRARIES} + ${QTX_LIBRARIES} +) + + + +include(LXQtTranslate) + +lxqt_translate_ts(lxqt-runner_QM_FILES + UPDATE_TRANSLATIONS ${UPDATE_TRANSLATIONS} + SOURCES + ${lxqt-runner_H_FILES} + ${lxqt-runner_CPP_FILES} + ${lxqt-runner_UI_FILES} + INSTALL_DIR + "${LXQT_TRANSLATIONS_DIR}/${PROJECT_NAME}" +) + +lxqt_app_translation_loader(lxqt-runner_QM_LOADER ${PROJECT_NAME}) + +#************************************************ + +include_directories( + ${LXQT_INCLUDE_DIRS} + ${LXQT_GLOBALKEYS_INCLUDE_DIRS} + ${LXQT_GLOBALKEYS_UI_INCLUDE_DIRS} + ${QTXDG_INCLUDE_DIRS} +) + +if(NOT CMAKE_BUILD_TYPE) + set(CMAKE_BUILD_TYPE Release) +endif() + +add_definitions(-Wall) + +set(LXQT_SHARE_DIR "${CMAKE_INSTALL_PREFIX}/share/lxqt") +set(APP_SHARE_DIR "${LXQT_SHARE_DIR}/${PROJECT_NAME}") + +#************************************************ + +if(NOT DEFINED RUNNER_MATH) + set(RUNNER_MATH Yes) +endif() + +if(RUNNER_MATH) + add_definitions(-DMATH_ENABLED) +endif(RUNNER_MATH) + +# ******************************************************************* +# Optional: start VBOX machines in headless mode, +# instead of default window + +if(NOT DEFINED RUNNER_VBOX) + set(RUNNER_VBOX Yes) +endif() + +if(VBOXRUNNER_HEADLESS) + add_definitions(-DVBOXRUNNER_HEADLESS) +endif() + +if (RUNNER_VBOX) + set(QRC_FILES + ${QRC_FILES} + virtualbox-icons.qrc + ) + add_definitions(-DVBOX_ENABLED) +endif() + +qt5_wrap_ui(lxqt-runner_UI_HEADERS ${lxqt-runner_UI_FILES}) +qt5_add_resources(lxqt-runner_QRC_SOURCES ${QRC_FILES}) + +add_executable(${PROJECT_NAME} + ${lxqt-runner_CPP_FILES} + ${lxqt-runner_UI_FILES} + ${lxqt-runner_QRC_SOURCES} + ${lxqt-runner_QM_FILES} + ${lxqt-runner_QM_LOADER} +) + +target_link_libraries(${PROJECT_NAME} ${lxqt-runner_LIBRARIES} KF5::WindowSystem) + +install(TARGETS ${PROJECT_NAME} RUNTIME DESTINATION bin) +install(FILES ${CONFIG_FILES} DESTINATION ${APP_SHARE_DIR}) + +# building tarball with CPack ------------------------------------------------- +include(InstallRequiredSystemLibraries) +set(CPACK_PACKAGE_VERSION_MAJOR ${LXQT_MAJOR_VERSION}) +set(CPACK_PACKAGE_VERSION_MINOR ${LXQT_MINOR_VERSION}) +set(CPACK_PACKAGE_VERSION_PATCH ${LXQT_PATCH_VERSION}) +set(CPACK_GENERATOR TBZ2) +set(CPACK_SOURCE_GENERATOR TBZ2) +set(CPACK_SOURCE_IGNORE_FILES /build/;.gitignore;.*~;.git;.kdev4;temp) +include(CPack) diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..a8dd823 --- /dev/null +++ b/COPYING @@ -0,0 +1,461 @@ + + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin St, 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 diff --git a/commanditemmodel.cpp b/commanditemmodel.cpp new file mode 100644 index 0000000..5418929 --- /dev/null +++ b/commanditemmodel.cpp @@ -0,0 +1,396 @@ +/* BEGIN_COMMON_COPYRIGHT_HEADER + * (c)LGPL2+ + * + * LXDE-Qt - a lightweight, Qt based, desktop toolset + * http://razor-qt.org + * + * Copyright: 2010-2011 Razor team + * Authors: + * Alexander Sokoloff + * + * This program or 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 + * + * END_COMMON_COPYRIGHT_HEADER */ + +#include "commanditemmodel.h" +#include +#include +#include +#include +#include +#include + + +/************************************************ + + ************************************************/ +CommandItemModel::CommandItemModel(QObject *parent) : + QSortFilterProxyModel(parent), + mSourceModel(new CommandSourceItemModel(this)), + mOnlyHistory(false) +{ + setDynamicSortFilter(false); // required in Qt5 + setSourceModel(mSourceModel); +} + + +/************************************************ + + ************************************************/ +CommandItemModel::~CommandItemModel() +{ +} + + +/************************************************ + + ************************************************/ +bool CommandItemModel::isOutDated() const +{ + return mSourceModel->isOutDated(); +} + + +/************************************************ + + ************************************************/ +const CommandProviderItem *CommandItemModel::command(const QModelIndex &index) const +{ + if (!index.isValid()) + return 0; + + QModelIndex ind = mapToSource(index); + + return mSourceModel->command(ind); +} + + +/************************************************ + + ************************************************/ +void CommandItemModel::addHistoryCommand(const QString &command) +{ + mSourceModel->addHistoryCommand(command); +} + +void CommandItemModel::clearHistory() +{ + mSourceModel->clearHistory(); +} + + +/************************************************ + + ************************************************/ +bool CommandItemModel::filterAcceptsRow(int sourceRow, const QModelIndex &/*sourceParent*/) const +{ + QRegExp re(filterRegExp()); + + if (re.isEmpty() && !mOnlyHistory) + return false; + + const CommandProviderItem *item = mSourceModel->command(sourceRow); + + if (!item) + return false; + + return item->compare(re); +} + + +/************************************************ + + ************************************************/ +bool CommandItemModel::lessThan(const QModelIndex &left, const QModelIndex &right) const +{ + if (left == mSourceModel->customCommandIndex()) + return true; + + if (right == mSourceModel->customCommandIndex()) + return false; + + if (mOnlyHistory) + return left.row() < right.row(); + else + return QSortFilterProxyModel::lessThan(left, right); +} + + +/************************************************ + + ************************************************/ +int CommandItemModel::itemType(const QModelIndex &index) const +{ + if (index.row() == mSourceModel->customCommandIndex().row()) + return 1; + else if (index.row() < mSourceModel->externalProviderStartIndex().row()) + return 2; + else + return 3; +} + + +/************************************************ + + ************************************************/ +QModelIndex CommandItemModel::appropriateItem(const QString &pattern) const +{ + QModelIndex res; + unsigned int rank = 0; + + int cnt = rowCount(); + + for (int i=0; icustomCommandIndex()) + return ind; + + const CommandProviderItem *item = mSourceModel->command(srcIndex); + if (!item) + continue; + + unsigned int r = item->rank(pattern); + if (r > rank) + { + res = ind; + rank = r; + } + + if (rank >= MAX_RANK) + break; + } + + if (!res.isValid()) + res = index(0, 0); + + return res; +} + + +/************************************************ + + ************************************************/ +void CommandItemModel::rebuild() +{ + mSourceModel->rebuild(); +} + + +/************************************************ + + ************************************************/ +CommandSourceItemModel::CommandSourceItemModel(QObject *parent) : + QAbstractListModel(parent) +{ + mCustomCommandProvider = new CustomCommandProvider; + mProviders.append(mCustomCommandProvider); + rebuild(); + mCustomCommandIndex = index(0, 0); + + mHistoryProvider = new HistoryProvider(); + mProviders.append(mHistoryProvider); + mCustomCommandProvider->setHistoryProvider(mHistoryProvider); + + mProviders.append(new AppLinkProvider()); +#ifdef MATH_ENABLED + mProviders.append(new MathProvider()); +#endif +#ifdef VBOX_ENABLED + mProviders.append(new VirtualBoxProvider()); +#endif + + mProviders.append(new PowerProvider()); + + rebuild(); + mExternalProviderStartIndex = index(rowCount(), 0); + + LxQt::Settings settings("lxqt-runner"); + int numExternalProviders = settings.beginReadArray("external providers"); + for (int i = 0; i < numExternalProviders; i++) + { + settings.setArrayIndex(i); + qDebug() << "Adding external provider:" << settings.value("name") << settings.value("executable"); + ExternalProvider* externalProvider = new ExternalProvider(settings.value("name").toString(), + settings.value("executable").toString()); + mProviders.append(externalProvider); + mExternalProviders.append(externalProvider); + } + settings.endArray(); + + foreach(CommandProvider* provider, mProviders) + { + connect(provider, SIGNAL(changed()), this, SIGNAL(layoutChanged())); + connect(provider, SIGNAL(aboutToBeChanged()), this, SIGNAL(layoutAboutToBeChanged())); + } + + rebuild(); +} + + +/************************************************ + + ************************************************/ +CommandSourceItemModel::~CommandSourceItemModel() +{ + qDeleteAll(mProviders); + mHistoryProvider = 0; +} + + +/************************************************ + + ************************************************/ +int CommandSourceItemModel::rowCount(const QModelIndex& /*parent*/) const +{ + int ret=0; + foreach(CommandProvider* provider, mProviders) + ret += provider->count(); + + return ret; +} + + +/************************************************ + + ************************************************/ +QVariant CommandSourceItemModel::data(const QModelIndex &index, int role) const +{ + if (!index.isValid()) + return QVariant(); + + if (index.row() >= rowCount()) + return QVariant(); + + const CommandProviderItem *item = command(index); + if (!item) + return QVariant(); + + switch (role) + { + case Qt::DisplayRole: + return QString("%1
\n%2\n").arg(item->title(), item->comment()); + + case Qt::DecorationRole: + return item->icon(); + + case Qt::ToolTipRole: + return item->toolTip(); + + } + + return QVariant(); +} + + +/************************************************ + + ************************************************/ +bool CommandSourceItemModel::isOutDated() const +{ + QListIterator i(mProviders); + while (i.hasNext()) + { + if (i.next()->isOutDated()) + return true; + } + + return false; +} + + +/************************************************ + + ************************************************/ +void CommandSourceItemModel::rebuild() +{ + emit layoutAboutToBeChanged(); + // FIXME: is this implementation correct? + QListIterator i(mProviders); + while (i.hasNext()) + { + CommandProvider *p = i.next(); + if (p->isOutDated()) + p->rebuild(); + } + emit layoutChanged(); +} + + +/************************************************ + + ************************************************/ +void CommandSourceItemModel::clearHistory() +{ + beginResetModel(); + mHistoryProvider->clearHistory(); + endResetModel(); +} + + +/************************************************ + + ************************************************/ +const CommandProviderItem *CommandSourceItemModel::command(int row) const +{ + int n = row; + QListIterator i(mProviders); + while (i.hasNext()) + { + CommandProvider *p = i.next(); + if (n < p->count()) + return p->at(n); + else + n -=p->count(); + } + + return 0; +} + + +/************************************************ + + ************************************************/ +const CommandProviderItem *CommandSourceItemModel::command(const QModelIndex &index) const +{ + if (!index.isValid()) + return 0; + + return command(index.row()); +} + + +/************************************************ + + ************************************************/ +void CommandSourceItemModel::addHistoryCommand(const QString &command) +{ + mHistoryProvider->AddCommand(command); +} + + +/*********************************************** + + ***********************************************/ +void CommandSourceItemModel::setCommand(const QString& command) +{ + mCustomCommandProvider->setCommand(command); + foreach (ExternalProvider* externalProvider, mExternalProviders) + { + externalProvider->setSearchTerm(command); + } +} diff --git a/commanditemmodel.h b/commanditemmodel.h new file mode 100644 index 0000000..c65dd05 --- /dev/null +++ b/commanditemmodel.h @@ -0,0 +1,106 @@ +/* BEGIN_COMMON_COPYRIGHT_HEADER + * (c)LGPL2+ + * + * LXDE-Qt - a lightweight, Qt based, desktop toolset + * http://razor-qt.org + * + * Copyright: 2010-2011 Razor team + * Authors: + * Alexander Sokoloff + * + * This program or 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 + * + * END_COMMON_COPYRIGHT_HEADER */ + +#ifndef COMMANDITEMMODEL_H +#define COMMANDITEMMODEL_H + +#include +#include +#include +#include + + +class CommandSourceItemModel: public QAbstractListModel +{ + Q_OBJECT +public: + explicit CommandSourceItemModel(QObject *parent = 0); + virtual ~CommandSourceItemModel(); + + int rowCount(const QModelIndex &parent=QModelIndex()) const; + QVariant data(const QModelIndex &index, int role=Qt::DisplayRole) const; + + bool isOutDated() const; + const CommandProviderItem *command(const QModelIndex &index) const; + const CommandProviderItem *command(int row) const; + + void addHistoryCommand(const QString &command); + + QString command() const { return mCustomCommandProvider->command(); } + void setCommand(const QString &command); + + QPersistentModelIndex customCommandIndex() const { return mCustomCommandIndex; } + QPersistentModelIndex externalProviderStartIndex() const { return mExternalProviderStartIndex; } +public slots: + void rebuild(); + void clearHistory(); + +private: + QList mProviders; + HistoryProvider *mHistoryProvider; + CustomCommandProvider *mCustomCommandProvider; + QPersistentModelIndex mCustomCommandIndex; + QList mExternalProviders; + QPersistentModelIndex mExternalProviderStartIndex; +}; + + +class CommandItemModel: public QSortFilterProxyModel +{ + Q_OBJECT +public: + explicit CommandItemModel(QObject *parent = 0); + virtual ~CommandItemModel(); + + bool isOutDated() const; + const CommandProviderItem *command(const QModelIndex &index) const; + + void addHistoryCommand(const QString &command); + + QModelIndex appropriateItem(const QString &pattern) const; + + bool isShowOnlyHistory() const { return mOnlyHistory; } + void showOnlyHistory(bool onlyHistory) { mOnlyHistory = onlyHistory; } + + QString command() const { return mSourceModel->command(); } + void setCommand(const QString &command) { mSourceModel->setCommand(command); } + +public slots: + void rebuild(); + void clearHistory(); + +protected: + bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const; + bool lessThan(const QModelIndex &left, const QModelIndex &right) const; + +private: + int itemType(const QModelIndex &index) const; + CommandSourceItemModel *mSourceModel; + bool mOnlyHistory; +}; + +#endif // COMMANDITEMMODEL_H diff --git a/configuredialog/configuredialog.cpp b/configuredialog/configuredialog.cpp new file mode 100644 index 0000000..8a3cfc2 --- /dev/null +++ b/configuredialog/configuredialog.cpp @@ -0,0 +1,156 @@ +/* BEGIN_COMMON_COPYRIGHT_HEADER + * (c)LGPL2+ + * + * LXDE-Qt - a lightweight, Qt based, desktop toolset + * http://razor-qt.org + * + * Copyright: 2010-2011 Razor team + * Authors: + * Alexander Sokoloff + * + * This program or 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 + * + * END_COMMON_COPYRIGHT_HEADER */ + + +#include "configuredialog.h" +#include "ui_configuredialog.h" + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + + + +/************************************************ + + ************************************************/ +ConfigureDialog::ConfigureDialog(QSettings *settings, const QString &defaultShortcut, QWidget *parent) : + QDialog(parent), + ui(new Ui::ConfigureDialog), + mSettings(settings), + mOldSettings(new LxQt::SettingsCache(settings)), + mDefaultShortcut(defaultShortcut) +{ + ui->setupUi(this); + + connect(ui->buttonBox->button(QDialogButtonBox::Reset), SIGNAL(clicked()), this, SLOT(resetSettings())); + + // Position ................................. + ui->positionCbx->addItem(tr("Top edge of the screen"), QVariant(ConfigureDialog::PositionTop)); + ui->positionCbx->addItem(tr("Center of the screen"), QVariant(ConfigureDialog::PositionCenter)); + connect(ui->positionCbx, SIGNAL(currentIndexChanged(int)), this, SLOT(positionCbxChanged(int))); + + // Monitor .................................. + QDesktopWidget *desktop = qApp->desktop(); + + ui->monitorCbx->addItem(tr("Focused screen"), QVariant(-1)); + + int monCnt = desktop->screenCount(); + for (int i = 0; i < monCnt; ++i) + ui->monitorCbx->addItem(tr("Always on screen %1").arg(i + 1), QVariant(i)); + + ui->monitorCbx->setEnabled(monCnt > 1); + connect(ui->monitorCbx, SIGNAL(currentIndexChanged(int)), this, SLOT(monitorCbxChanged(int))); + + + // Shortcut ................................. + connect(ui->shortcutEd, SIGNAL(shortcutGrabbed(QString)), this, SLOT(shortcutChanged(QString))); + + connect(ui->shortcutEd->addMenuAction(tr("Reset")), SIGNAL(triggered()), this, SLOT(shortcutReset())); + + settingsChanged(); +} + + +/************************************************ + + ************************************************/ +void ConfigureDialog::settingsChanged() +{ + if (mSettings->value("dialog/show_on_top", true).toBool()) + ui->positionCbx->setCurrentIndex(0); + else + ui->positionCbx->setCurrentIndex(1); + + ui->monitorCbx->setCurrentIndex(mSettings->value("dialog/monitor", -1).toInt() + 1); + ui->shortcutEd->setText(mSettings->value("dialog/shortcut", "Alt+F2").toString()); +} + + +/************************************************ + + ************************************************/ +ConfigureDialog::~ConfigureDialog() +{ + delete mOldSettings; + delete ui; +} + + +/************************************************ + + ************************************************/ +void ConfigureDialog::shortcutChanged(const QString &text) +{ + ui->shortcutEd->setText(text); + mSettings->setValue("dialog/shortcut", text); +} + + +/************************************************ + + ************************************************/ +void ConfigureDialog::shortcutReset() +{ + shortcutChanged(mDefaultShortcut); +} + + +/************************************************ + + ************************************************/ +void ConfigureDialog::positionCbxChanged(int index) +{ + mSettings->setValue("dialog/show_on_top", index == 0); +} + + +/************************************************ + + ************************************************/ +void ConfigureDialog::monitorCbxChanged(int index) +{ + mSettings->setValue("dialog/monitor", index - 1); +} + + +/************************************************ + + ************************************************/ +void ConfigureDialog::resetSettings() +{ + mOldSettings->loadToSettings(); + ui->shortcutEd->clear(); + settingsChanged(); +} diff --git a/configuredialog/configuredialog.h b/configuredialog/configuredialog.h new file mode 100644 index 0000000..1959b42 --- /dev/null +++ b/configuredialog/configuredialog.h @@ -0,0 +1,76 @@ +/* BEGIN_COMMON_COPYRIGHT_HEADER + * (c)LGPL2+ + * + * LXDE-Qt - a lightweight, Qt based, desktop toolset + * http://razor-qt.org + * + * Copyright: 2010-2011 Razor team + * Authors: + * Alexander Sokoloff + * + * This program or 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 + * + * END_COMMON_COPYRIGHT_HEADER */ + + +#ifndef CONFIGUREDIALOG_H +#define CONFIGUREDIALOG_H + +#include + +namespace Ui { + class ConfigureDialog; +} + +class QSettings; + +namespace LxQt { + class SettingsCache; +} + +class ConfigureDialog : public QDialog +{ + Q_OBJECT + +public: + enum Position { + PositionTop, + PositionCenter + }; + + + explicit ConfigureDialog(QSettings *settings, const QString &defaultShortcut, QWidget *parent = 0); + ~ConfigureDialog(); + +protected: + // void closeEvent(QCloseEvent *event); + +private: + Ui::ConfigureDialog *ui; + QSettings *mSettings; + LxQt::SettingsCache *mOldSettings; + QString mDefaultShortcut; + +private slots: + void shortcutChanged(const QString &text); + void shortcutReset(); + void settingsChanged(); + void positionCbxChanged(int index); + void monitorCbxChanged(int index); + void resetSettings(); +}; + +#endif // CONFIGUREDIALOG_H diff --git a/configuredialog/configuredialog.ui b/configuredialog/configuredialog.ui new file mode 100644 index 0000000..1296f1d --- /dev/null +++ b/configuredialog/configuredialog.ui @@ -0,0 +1,157 @@ + + + ConfigureDialog + + + + 0 + 0 + 312 + 222 + + + + Runner Settings + + + + + + Appearance + + + + + + Positioning: + + + + + + + + + + Show on: + + + + + + + + + + + + + + + QFormLayout::ExpandingFieldsGrow + + + + + Shortcut: + + + + + + + + 81 + 0 + + + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + Qt::Vertical + + + + 20 + 38 + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Close|QDialogButtonBox::Reset + + + + + + + + ShortcutSelector + QToolButton +
LXQtGlobalKeysUi/ShortcutSelector
+
+
+ + + + buttonBox + accepted() + ConfigureDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + ConfigureDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + +
diff --git a/dialog.cpp b/dialog.cpp new file mode 100644 index 0000000..a3f7ef9 --- /dev/null +++ b/dialog.cpp @@ -0,0 +1,445 @@ +/* BEGIN_COMMON_COPYRIGHT_HEADER + * (c)LGPL2+ + * + * LXDE-Qt - a lightweight, Qt based, desktop toolset + * http://razor-qt.org + * + * Copyright: 2010-2011 Razor team + * Authors: + * Alexander Sokoloff + * Petr Vanek + * + * This program or 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 + * + * END_COMMON_COPYRIGHT_HEADER */ + +#include "dialog.h" +#include "ui_dialog.h" +#include "widgets.h" +#include "commanditemmodel.h" +#include "configuredialog/configuredialog.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#define DEFAULT_SHORTCUT "Alt+F2" + +/************************************************ + + ************************************************/ +Dialog::Dialog(QWidget *parent) : + QDialog(parent, Qt::Tool | Qt::WindowStaysOnTopHint | Qt::CustomizeWindowHint), + ui(new Ui::Dialog), + mSettings(new LxQt::Settings("lxqt-runner", this)), + mGlobalShortcut(0), + mLockCascadeChanges(false), + mConfigureDialog(0) +{ + ui->setupUi(this); + setWindowTitle("LXQt Runner"); + setAttribute(Qt::WA_TranslucentBackground); + + connect(LxQt::Settings::globalSettings(), SIGNAL(iconThemeChanged()), this, SLOT(update())); + connect(ui->closeButton, SIGNAL(clicked()), this, SLOT(hide())); + connect(mSettings, SIGNAL(settingsChanged()), this, SLOT(applySettings())); + + ui->commandEd->installEventFilter(this); + + connect(ui->commandEd, SIGNAL(textChanged(QString)), this, SLOT(setFilter(QString))); + connect(ui->commandEd, SIGNAL(returnPressed()), this, SLOT(runCommand())); + + mCommandItemModel = new CommandItemModel(this); + ui->commandList->installEventFilter(this); + ui->commandList->setModel(mCommandItemModel); + ui->commandList->setEditTriggers(QAbstractItemView::NoEditTriggers); + connect(ui->commandList, SIGNAL(clicked(QModelIndex)), this, SLOT(runCommand())); + setFilter(""); + dataChanged(); + + ui->commandList->setItemDelegate(new LxQt::HtmlDelegate(QSize(32, 32), ui->commandList)); + + // Popup menu ............................... + QAction *a = new QAction(XdgIcon::fromTheme("configure"), tr("Configure"), this); + connect(a, SIGNAL(triggered()), this, SLOT(showConfigDialog())); + addAction(a); + + a = new QAction(XdgIcon::fromTheme("edit-clear-history"), tr("Clear History"), this); + connect(a, SIGNAL(triggered()), mCommandItemModel, SLOT(clearHistory())); + addAction(a); + + mPowerManager = new LxQt::PowerManager(this); + addActions(mPowerManager->availableActions()); + mScreenSaver = new LxQt::ScreenSaver(this); + addActions(mScreenSaver->availableActions()); + + setContextMenuPolicy(Qt::ActionsContextMenu); + + QMenu *menu = new QMenu(this); + menu->addActions(actions()); + ui->actionButton->setMenu(menu); + ui->actionButton->setIcon(XdgIcon::fromTheme("configure")); + // End of popup menu ........................ + + applySettings(); + + connect(QApplication::desktop(), SIGNAL(screenCountChanged(int)), SLOT(realign())); + connect(QApplication::desktop(), SIGNAL(workAreaResized(int)), SLOT(realign())); + connect(mGlobalShortcut, SIGNAL(activated()), this, SLOT(showHide())); + connect(mGlobalShortcut, SIGNAL(shortcutChanged(QString,QString)), this, SLOT(shortcutChanged(QString,QString))); + + resize(mSettings->value("dialog/width", 400).toInt(), size().height()); + + // TEST + connect(mCommandItemModel, SIGNAL(layoutChanged()), this, SLOT(dataChanged())); +} + + +/************************************************ + + ************************************************/ +Dialog::~Dialog() +{ + delete ui; +} + + +/************************************************ + + ************************************************/ +void Dialog::closeEvent(QCloseEvent *event) +{ + hide(); + event->ignore(); +} + + +/************************************************ + + ************************************************/ +QSize Dialog::sizeHint() const +{ + QSize size = QDialog::sizeHint(); + size.setWidth(this->size().width()); + return size; +} + + +/************************************************ + + ************************************************/ +void Dialog::resizeEvent(QResizeEvent *event) +{ + mSettings->setValue("dialog/width", size().width()); +} + + +/************************************************ + + ************************************************/ +bool Dialog::eventFilter(QObject *object, QEvent *event) +{ + if (event->type() == QEvent::KeyPress) + { + QKeyEvent *keyEvent = static_cast(event); + + if (object == ui->commandEd) + return editKeyPressEvent(keyEvent); + + if (object == ui->commandList) + return listKeyPressEvent(keyEvent); + } + else if (event->type() == QEvent::FocusOut) + { + hide(); + return true; + } + + return QDialog::eventFilter(object, event); +} + + +/************************************************ + eventFilter for ui->commandEd + ************************************************/ +bool Dialog::editKeyPressEvent(QKeyEvent *event) +{ + switch (event->key()) + { + case Qt::Key_N: + if (event->modifiers().testFlag(Qt::ControlModifier)) + { + QKeyEvent ev(QEvent::KeyPress, Qt::Key_Down, Qt::NoModifier); + editKeyPressEvent(&ev); + return true; + } + return false; + + case Qt::Key_P: + if (event->modifiers().testFlag(Qt::ControlModifier)) + { + QKeyEvent ev(QEvent::KeyPress, Qt::Key_Up, Qt::NoModifier); + editKeyPressEvent(&ev); + return true; + } + return false; + + case Qt::Key_Up: + case Qt::Key_PageUp: + if (ui->commandEd->text().isEmpty() && + ui->commandList->isVisible() && + ui->commandList->currentIndex().row() == 0 + ) + { + setFilter("", false); + return true; + } + qApp->sendEvent(ui->commandList, event); + return true; + + case Qt::Key_Down: + case Qt::Key_PageDown: + if (ui->commandEd->text().isEmpty() && + ui->commandList->isHidden() + ) + { + setFilter("", true); + return true; + } + + qApp->sendEvent(ui->commandList, event); + return true; + + case Qt::Key_Tab: + const CommandProviderItem *command = mCommandItemModel->command(ui->commandList->currentIndex()); + if (command) + ui->commandEd->setText(command->title()); + return true; + } + + return QDialog::eventFilter(ui->commandList, event); +} + + +/************************************************ + eventFilter for ui->commandList + ************************************************/ +bool Dialog::listKeyPressEvent(QKeyEvent *event) +{ + switch (event->key()) + { + case Qt::Key_Up: + case Qt::Key_PageUp: + if (ui->commandList->currentIndex().row() == 0) + { + ui->commandEd->setFocus(); + return true; + } + break; + + case Qt::Key_Left: + case Qt::Key_Right: + ui->commandEd->setFocus(); + qApp->sendEvent(ui->commandEd, event); + return true; + + default: + // Alphabetical or number key ........... + if (!event->text().isEmpty()) + { + ui->commandEd->setFocus(); + qApp->sendEvent(ui->commandEd, event); + return true; + } + } + + return QDialog::eventFilter(ui->commandEd, event); +} + + +/************************************************ + + ************************************************/ +void Dialog::showHide() +{ + if (isVisible() && isActiveWindow()) + { + hide(); + } + else + { + realign(); + show(); + KWindowSystem::forceActiveWindow(windowHandle()->winId()); + ui->commandEd->setFocus(); + } +} + + +/************************************************ + + ************************************************/ +void Dialog::realign() +{ + QRect desktop; + + int screen = mMonitor; + if (mMonitor < 0 || mMonitor > QApplication::desktop()->screenCount() - 1) + screen = QApplication::desktop()->screenNumber(QCursor::pos()); + + desktop = QApplication::desktop()->availableGeometry(screen).intersected(KWindowSystem::workArea(screen)); + + QRect rect = this->geometry(); + rect.moveCenter(desktop.center()); + + if (mShowOnTop) + rect.moveTop(desktop.top()); + else + rect.moveTop(desktop.center().y() - ui->panel->sizeHint().height()); + + setGeometry(rect); +} + + +/************************************************ + + ************************************************/ +void Dialog::applySettings() +{ + if (mLockCascadeChanges) + return; + + // Shortcut ................................. + QString shortcut = mSettings->value("dialog/shortcut", DEFAULT_SHORTCUT).toString(); + if (shortcut.isEmpty()) + shortcut = DEFAULT_SHORTCUT; + + if (!mGlobalShortcut) + mGlobalShortcut = GlobalKeyShortcut::Client::instance()->addAction(shortcut, "/runner/show_hide_dialog", tr("Show/hide runner dialog"), this); + else if (mGlobalShortcut->shortcut() != shortcut) + mGlobalShortcut->changeShortcut(shortcut); + + mShowOnTop = mSettings->value("dialog/show_on_top", true).toBool(); + + mMonitor = mSettings->value("dialog/monitor", -1).toInt(); + + realign(); + mSettings->sync(); +} + + +/************************************************ + + ************************************************/ +void Dialog::shortcutChanged(const QString &/*oldShortcut*/, const QString &newShortcut) +{ + if (!newShortcut.isEmpty()) + { + mLockCascadeChanges = true; + + mSettings->setValue("dialog/shortcut", newShortcut); + mSettings->sync(); + + mLockCascadeChanges = false; + } +} + + +/************************************************ + + ************************************************/ +void Dialog::setFilter(const QString &text, bool onlyHistory) +{ + qDebug() << "Ind i setFilter..."; + if (mCommandItemModel->isOutDated()) + mCommandItemModel->rebuild(); + + QString trimmedText = text.simplified(); + mCommandItemModel->setCommand(trimmedText); + mCommandItemModel->showOnlyHistory(onlyHistory); + mCommandItemModel->setFilterWildcard(trimmedText); + mCommandItemModel->sort(0); +} + +/************************************************ + + ************************************************/ +void Dialog::dataChanged() +{ + if (mCommandItemModel->rowCount()) + { + ui->commandList->setCurrentIndex(mCommandItemModel->appropriateItem(mCommandItemModel->command())); + ui->commandList->scrollTo(ui->commandList->currentIndex()); + ui->commandList->show(); + } + else + { + ui->commandList->hide(); + } + + adjustSize(); + +} + + +/************************************************ + + ************************************************/ +void Dialog::runCommand() +{ + bool res =false; + const CommandProviderItem *command = mCommandItemModel->command(ui->commandList->currentIndex()); + + if (command) + res = command->run(); + + if (res) + { + hide(); + ui->commandEd->clear(); + } + +} + + +/************************************************ + + ************************************************/ +void Dialog::showConfigDialog() +{ + if (!mConfigureDialog) + mConfigureDialog = new ConfigureDialog(mSettings, DEFAULT_SHORTCUT, this); + mConfigureDialog->exec(); +} + +#undef DEFAULT_SHORTCUT diff --git a/dialog.h b/dialog.h new file mode 100644 index 0000000..9a7de61 --- /dev/null +++ b/dialog.h @@ -0,0 +1,99 @@ +/* BEGIN_COMMON_COPYRIGHT_HEADER + * (c)LGPL2+ + * + * LXDE-Qt - a lightweight, Qt based, desktop toolset + * http://razor-qt.org + * + * Copyright: 2010-2011 Razor team + * Authors: + * Alexander Sokoloff + * + * This program or 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 + * + * END_COMMON_COPYRIGHT_HEADER */ + +#ifndef DIALOG_H +#define DIALOG_H + +#include + +namespace Ui { + class Dialog; +} + +namespace LxQt { + class Settings; + class PowerManager; + class ScreenSaver; +} + +class CommandListView; +class CommandItemModel; +class ConfigureDialog; + +namespace GlobalKeyShortcut +{ +class Action; +} + + +class Dialog : public QDialog +{ + Q_OBJECT + +public: + explicit Dialog(QWidget *parent = 0); + ~Dialog(); + + QSize sizeHint() const; + +protected: + void closeEvent(QCloseEvent *event); + void resizeEvent(QResizeEvent *event); + bool eventFilter(QObject *object, QEvent *event); + bool editKeyPressEvent(QKeyEvent *event); + bool listKeyPressEvent(QKeyEvent *event); + +private: + Ui::Dialog *ui; + LxQt::Settings *mSettings; + GlobalKeyShortcut::Action *mGlobalShortcut; + CommandItemModel *mCommandItemModel; + bool mShowOnTop; + int mMonitor; + LxQt::PowerManager *mPowerManager; + LxQt::ScreenSaver *mScreenSaver; + + bool mLockCascadeChanges; + + ConfigureDialog *mConfigureDialog; + + //! \brief handle various additional behaviours (math only for now) + bool editEnterPressed(); + +private slots: + void realign(); + void applySettings(); + void showHide(); + void setFilter(const QString &text, bool onlyHistory=false); + void dataChanged(); + void runCommand(); + void showConfigDialog(); + void shortcutChanged(const QString &oldShortcut, const QString &newShortcut); +}; + +#endif // DIALOG_H + diff --git a/dialog.ui b/dialog.ui new file mode 100644 index 0000000..a215d2d --- /dev/null +++ b/dialog.ui @@ -0,0 +1,170 @@ + + + Dialog + + + + 0 + 0 + 342 + 236 + + + + + 0 + 0 + + + + + 300 + 0 + + + + Application launcher + + + false + + + + 0 + + + 0 + + + + + QFrame::NoFrame + + + QFrame::Raised + + + + -1 + + + 0 + + + 0 + + + + + + 0 + 0 + + + + + 3 + 0 + + + + + 3 + 16777215 + + + + SizeHorCursor + + + + + + + + + + + + + QToolButton::InstantPopup + + + true + + + Qt::NoArrow + + + + + + + X + + + true + + + + + + + + 0 + 0 + + + + + 3 + 0 + + + + + 3 + 16777215 + + + + SizeHorCursor + + + + + + + + + + + + + + + + Qt::ScrollBarAlwaysOff + + + true + + + + + + + + + HorizSizeGrip + QWidget +
widgets.h
+ 1 +
+
+ + closeButton + + + +
diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..b290df0 --- /dev/null +++ b/main.cpp @@ -0,0 +1,44 @@ +/* BEGIN_COMMON_COPYRIGHT_HEADER + * (c)LGPL2+ + * + * LXDE-Qt - a lightweight, Qt based, desktop toolset + * http://razor-qt.org + * + * Copyright: 2010-2011 Razor team + * Authors: + * Alexander Sokoloff + * + * This program or 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 + * + * END_COMMON_COPYRIGHT_HEADER */ + + +#include +#include "dialog.h" + + +int main(int argc, char *argv[]) +{ + LxQt::Application a(argc, argv); + a.setQuitOnLastWindowClosed(false); + + QWidget *hiddenPreviewParent = new QWidget(0, Qt::Tool); + Dialog d(hiddenPreviewParent); + //d.show(); + + return a.exec(); + +} diff --git a/man/lxqt-runner.1 b/man/lxqt-runner.1 new file mode 100644 index 0000000..4606d47 --- /dev/null +++ b/man/lxqt-runner.1 @@ -0,0 +1,49 @@ +.TH lxqt-runner "1" "September 2012" "LXQt\ 0.7.0" "LXQt\ Module" +.SH NAME +lxqt-runner \- Application runner module of \fBLXQt\fR, the Lightweight Desktop Environment +.SH SYNOPSIS +.B lxqt-runner +.br +.SH DESCRIPTION +This module will allow you to launch an application by typing Alt+F2 its pressed on the keyboard. +.P +The \fBLXQt modules\fR are desktop independent tools, +and operate as daemons for the local user for desktop specific operations. +.P +\fBLXQt\fR is an advanced, easy-to-use, and fast desktop environment based on Qt +technologies, ships several core desktop components, all of which are optional: +.P + * Panel + * Desktop + * Application launcher \fI(this)\fR + * Settings center + * Session handler + * Polkit handler + * Display manager handler +.P +These components perform similar actions to those available in other desktop +environments, and their names are self-descriptive. They are usually not launched +by hand but automatically, when choosing a \fBLxQt\-qt\fR session in the Display +Manager. +.SH BEHAVIOR +As you type, suggestions will appear. Once you see the application you wish to run you can navigate +to it using the mouse or arrow keys on your keyboard. Pressing enter or clicking it will launch +the application. The activation key can be changed using the window manager or shortcut daemon +such as \fBlxqt-globalkeyshortcuts\fR. +.SH AUTOSTART +This module only shows at \fBLXQt\fR desktop environment, but you can use in others desktops, by +setting an configuring into session startup. +.SH "REPORTING BUGS" +Report bugs to https://github.com/lxde/lxde-qt/issues +.SH "SEE ALSO" +\fBLXQt\fR it has been tailored for users who value simplicity, speed, and +an intuitive interface, also intended for less powerful machines. See also: +.\" any module must refers to session app, for more info on start it +.P +\fBlxqt-session.1\fR LXQt for manage LXQt complete environment +.P +\fBlxqt-config-session.1\fR LXQt application for config modules on desktop +.P +.SH AUTHOR +This manual page was created by \fBPICCORO Lenz McKAY\fR \fI\fR +for \fBLXQt\fR project and VENENUX GNU/Linux but can be used by others. diff --git a/providers.cpp b/providers.cpp new file mode 100644 index 0000000..b9fd929 --- /dev/null +++ b/providers.cpp @@ -0,0 +1,973 @@ +/* BEGIN_COMMON_COPYRIGHT_HEADER + * (c)LGPL2+ + * + * LXDE-Qt - a lightweight, Qt based, desktop toolset + * http://razor-qt.org + * + * Copyright: 2010-2013 Razor team + * Authors: + * Alexander Sokoloff + * Aaron Lewis + * Petr Vanek + * Hong Jen Yee (PCMan) + * + * This program or 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 + * + * END_COMMON_COPYRIGHT_HEADER */ + + +#include "providers.h" +#include "yamlparser.h" +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "providers.h" +#include +#include +#include + +#define MAX_HISTORY 100 + + +/************************************************ + + ************************************************/ +QString expandCommand(const QString &command, QStringList *arguments=0) +{ + QString program; + wordexp_t words; + + if (wordexp(command.toLocal8Bit().data(), &words, 0) != 0) + return ""; + + char **w; + w = words.we_wordv; + program = QString::fromLocal8Bit(w[0]); + + if (arguments) + { + for (size_t i = 1; i < words.we_wordc; i++) + *arguments << QString::fromLocal8Bit(w[i]); + } + + wordfree(&words); + return program; +} + + +/************************************************ + + ************************************************/ +bool startProcess(QString command) +{ + QStringList args; + QString program = expandCommand(command, &args); + if (program.isEmpty()) + return false; + + return QProcess::startDetached(program, args); +} + + +/************************************************ + + ************************************************/ +unsigned int CommandProviderItem::stringRank(const QString str, const QString pattern) const +{ + int n = str.indexOf(pattern, 0, Qt::CaseInsensitive); + if (n<0) + return 0; + + return MAX_RANK - ((str.length() - pattern.length()) + n * 5); +} + + +/************************************************ + + ************************************************/ +CommandProvider::CommandProvider(): + QObject(), + QList() +{ +} + + +/************************************************ + + ************************************************/ +CommandProvider::~CommandProvider() +{ +// qDebug() << "*****************************************"; +// qDebug() << hex << this; +// qDebug() << "DESTROY"; + qDeleteAll(*this); +// qDebug() << "*****************************************"; +} + + +/************************************************ + + ************************************************/ +AppLinkItem::AppLinkItem(const QDomElement &element): + CommandProviderItem() +{ + mIconName = element.attribute("icon"); + mTitle = element.attribute("title"); + mComment = element.attribute("genericName"); + mToolTip = element.attribute("comment"); + mCommand = element.attribute("exec"); + mProgram = QFileInfo(element.attribute("exec")).baseName().section(" ", 0, 0); + mDesktopFile = element.attribute("desktopFile"); + QMetaObject::invokeMethod(this, "updateIcon", Qt::QueuedConnection); +} + +#ifdef HAVE_MENU_CACHE +AppLinkItem::AppLinkItem(MenuCacheApp* app): + CommandProviderItem() +{ + MenuCacheItem* item = MENU_CACHE_ITEM(app); + mIconName = QString::fromUtf8(menu_cache_item_get_icon(item)); + mTitle = QString::fromUtf8(menu_cache_item_get_name(item)); + mComment = QString::fromUtf8(menu_cache_item_get_comment(item)); + mToolTip = mComment; + mCommand = menu_cache_app_get_exec(app); + mProgram = QFileInfo(mCommand).baseName().section(" ", 0, 0); + char* path = menu_cache_item_get_file_path(MENU_CACHE_ITEM(app)); + mDesktopFile = QString::fromLocal8Bit(path); + g_free(path); + QMetaObject::invokeMethod(this, "updateIcon", Qt::QueuedConnection); + // qDebug() << "FOUND: " << mIconName << ", " << mCommand; +} +#endif + +/************************************************ + + ************************************************/ +void AppLinkItem::updateIcon() +{ +// qDebug() << "*****************************************"; +// qDebug() << hex << this; +// qDebug() << Q_FUNC_INFO; + if (mIcon.isNull()) + mIcon = XdgIcon::fromTheme(mIconName); +// qDebug() << "*****************************************"; +} + + +/************************************************ + + ************************************************/ +void AppLinkItem::operator=(const AppLinkItem &other) +{ + mTitle = other.title(); + mComment = other.comment(); + mToolTip = other.toolTip(); + + mCommand = other.mCommand; + mProgram = other.mProgram; + mDesktopFile = other.mDesktopFile; + + mIconName = other.mIconName; + mIcon = other.icon(); +} + + +/************************************************ + + ************************************************/ +unsigned int AppLinkItem::rank(const QString &pattern) const +{ + unsigned int result = qMax(stringRank(mProgram, pattern), + stringRank(mTitle, pattern) + ); + return result; +} + + +/************************************************ + + ************************************************/ +bool AppLinkItem::run() const +{ + XdgDesktopFile desktop; + if (desktop.load(mDesktopFile)) + return desktop.startDetached(); + else + return false; +} + + +/************************************************ + + ************************************************/ +bool AppLinkItem::compare(const QRegExp ®Exp) const +{ + if (regExp.isEmpty()) + return false; + + QRegExp re(regExp); + + re.setCaseSensitivity(Qt::CaseInsensitive); + return mProgram.contains(re) || + mTitle.contains(re) ; +} + + + + +/************************************************ + + ************************************************/ +AppLinkProvider::AppLinkProvider(): + CommandProvider() +{ +#ifdef HAVE_MENU_CACHE + menu_cache_init(0); + mMenuCache = menu_cache_lookup(XdgMenu::getMenuFileName().toLocal8Bit()); + if(mMenuCache) + mMenuCacheNotify = menu_cache_add_reload_notify(mMenuCache, (MenuCacheReloadNotify)menuCacheReloadNotify, this); + else + mMenuCacheNotify = 0; +#else + mXdgMenu = new XdgMenu(); + mXdgMenu->setEnvironments(QStringList() << "X-LXQT" << "LxQt"); + connect(mXdgMenu, SIGNAL(changed()), this, SLOT(update())); + mXdgMenu->read(XdgMenu::getMenuFileName()); + update(); +#endif +} + + +/************************************************ + + ************************************************/ +AppLinkProvider::~AppLinkProvider() +{ +#ifdef HAVE_MENU_CACHE + if(mMenuCache) + { + menu_cache_remove_reload_notify(mMenuCache, mMenuCacheNotify); + menu_cache_unref(mMenuCache); + } +#else + delete mXdgMenu; +#endif +} + + +/************************************************ + + ************************************************/ + #ifdef HAVE_MENU_CACHE + +void AppLinkProvider::menuCacheReloadNotify(MenuCache* cache, gpointer user_data) +{ + // qDebug() << Q_FUNC_INFO; + reinterpret_cast(user_data)->update(); +} + + #else // without menu-cache, use libqtxdg + + void doUpdate(const QDomElement &xml, QHash &items) +{ + DomElementIterator it(xml, ""); + while (it.hasNext()) + { + QDomElement e = it.next(); + + // Build submenu ........................ + if (e.tagName() == "Menu") + doUpdate(e, items); + + //Build application link ................ + else if (e.tagName() == "AppLink") + { + AppLinkItem *item = new AppLinkItem(e); + delete items[item->command()]; // delete previous item; + items.insert(item->command(), item); + } + } +} +#endif + +/************************************************ + + ************************************************/ +void AppLinkProvider::update() +{ + emit aboutToBeChanged(); + QHash newItems; + +#ifdef HAVE_MENU_CACHE + // libmenu-cache is available, use it to get cached app list + GSList* apps = menu_cache_list_all_apps(mMenuCache); + for(GSList* l = apps; l; l = l->next) + { + MenuCacheApp* app = MENU_CACHE_APP(l->data); + AppLinkItem *item = new AppLinkItem(app); + AppLinkItem *prevItem = newItems[item->command()]; + if(prevItem) + delete prevItem; // delete previous item; + newItems.insert(item->command(), item); + menu_cache_item_unref(MENU_CACHE_ITEM(app)); + } + g_slist_free(apps); +#else + // use libqtxdg XdgMenu to get installed apps + doUpdate(mXdgMenu->xml().documentElement(), newItems); +#endif + { + QMutableListIterator i(*this); + while (i.hasNext()) { + AppLinkItem *item = static_cast(i.next()); + AppLinkItem *newItem = newItems.take(item->command()); + if (newItem) + { + *(item) = *newItem; // Copy by value, not pointer! + // After the item is copied, the original "updateIcon" call queued + // on the newItem object is never called since the object iss going to + // be deleted. Hence we need to call it on the copied item manually. + // Otherwise the copied item will have no icon. + // FIXME: this is a dirty hack and it should be made cleaner later. + if(item->icon().isNull()) + QMetaObject::invokeMethod(item, "updateIcon", Qt::QueuedConnection); + delete newItem; + } + else + { + i.remove(); + delete item; + } + } + } + + { + QHashIterator i(newItems); + while (i.hasNext()) + { + append(i.next().value()); + } + } + + emit changed(); +} + + + + +/************************************************ + + ************************************************/ +HistoryItem::HistoryItem(const QString &command): + CommandProviderItem() +{ + mIcon = XdgIcon::defaultApplicationIcon(); + mTitle = command; + mComment = QObject::tr("History"); + mCommand = command; +} + + +/************************************************ + + ************************************************/ +bool HistoryItem::run() const +{ + return startProcess(mCommand); +} + + +/************************************************ + + ************************************************/ +bool HistoryItem::compare(const QRegExp ®Exp) const +{ + QRegExp re(regExp); + + re.setCaseSensitivity(Qt::CaseSensitive); + return mCommand.contains(re); +} + + +/************************************************ + + ************************************************/ +unsigned int HistoryItem::rank(const QString &pattern) const +{ + return stringRank(mCommand, pattern); +} + + +/************************************************ + + ************************************************/ +HistoryProvider::HistoryProvider(): + CommandProvider() +{ + QString fileName = (XdgDirs::cacheHome() + "/lxqt-runner.history"); + mHistoryFile = new QSettings(fileName, QSettings::IniFormat); + mHistoryFile->beginGroup("commands"); + for (uint i=0; icontains(key)) + { + HistoryItem *item = new HistoryItem(mHistoryFile->value(key).toString()); + append(item); + } + } +} + + +/************************************************ + + ************************************************/ +HistoryProvider::~HistoryProvider() +{ + delete mHistoryFile; +} + + +/************************************************ + + ************************************************/ +void HistoryProvider::AddCommand(const QString &command) +{ + bool commandExists = false; + for (int i=0; !commandExists && i(at(i))->command()) + { + move(i, 0); + commandExists = true; + } + } + + if (!commandExists) + { + HistoryItem *item = new HistoryItem(command); + insert(0, item); + } + + mHistoryFile->clear(); + for (int i=0; isetValue(key, static_cast(at(i))->command()); + } +} + +void HistoryProvider::clearHistory() +{ + clear(); + mHistoryFile->clear(); +} + +/************************************************ + + ************************************************/ +CustomCommandItem::CustomCommandItem(CustomCommandProvider *provider): + CommandProviderItem(), + mProvider(provider) +{ + mIcon = XdgIcon::fromTheme("utilities-terminal"); +} + + +/************************************************ + + ************************************************/ +QString which(const QString &progName) +{ + if (progName.isEmpty()) + return ""; + + if (progName.startsWith(QDir::separator())) + { + QFileInfo fileInfo(progName); + if (fileInfo.isExecutable() && fileInfo.isFile()) + return fileInfo.absoluteFilePath(); + } + + QStringList dirs = QString(getenv("PATH")).split(":"); + + foreach (QString dir, dirs) + { + QFileInfo fileInfo(QDir(dir), progName); + if (fileInfo.isExecutable() && fileInfo.isFile()) + return fileInfo.absoluteFilePath(); + } + + return ""; +} + + +/************************************************ + + ************************************************/ +void CustomCommandItem::setCommand(const QString &command) +{ + mCommand = command; + mTitle = mCommand; + + QString program = which(expandCommand(command)); + + if (!program.isEmpty()) + mComment = QString("%1 %2").arg(program, command.section(' ', 1)); + else + mComment = ""; + +} + + +/************************************************ + + ************************************************/ +bool CustomCommandItem::run() const +{ + bool ret = startProcess(mCommand); + if (ret && mProvider->historyProvider()) + mProvider->historyProvider()->AddCommand(mCommand); + + return ret; +} + + +/************************************************ + + ************************************************/ +bool CustomCommandItem::compare(const QRegExp ®Exp) const +{ + return !mComment.isEmpty(); +} + + +/************************************************ + + ************************************************/ +unsigned int CustomCommandItem::rank(const QString &pattern) const +{ + return 0; +} + + +/************************************************ + + ************************************************/ +CustomCommandProvider::CustomCommandProvider(): + CommandProvider(), + mHistoryProvider(0) +{ + mItem = new CustomCommandItem(this); + append(mItem); +} + +#ifdef VBOX_ENABLED +VirtualBoxItem::VirtualBoxItem(const QString & MachineName , const QIcon & Icon): + CommandProviderItem() +{ + mTitle = MachineName; + mIcon = Icon; +} + +void VirtualBoxItem::setRDEPort(const QString & portNum) +{ + m_rdePortNum = portNum; +} + +bool VirtualBoxItem::run() const +{ + QStringList arguments; +#ifdef VBOXRUNNER_HEADLESS + arguments << "-startvm" << title(); + return QProcess::startDetached ("VBoxHeadless" , arguments); +#else + arguments << "startvm" << title(); + return QProcess::startDetached ("VBoxManage" , arguments); +#endif + +} + +bool VirtualBoxItem::compare(const QRegExp ®Exp) const +{ + QRegExp re(regExp); + re.setCaseSensitivity(Qt::CaseInsensitive); + return (! regExp.isEmpty() && -1 != re.indexIn (title ())); +} + +unsigned int VirtualBoxItem::rank(const QString &pattern) const +{ + return stringRank(mTitle, pattern); +} + +inline QString homeDir() { + return QStandardPaths::writableLocation(QStandardPaths::HomeLocation); +} + +/////// +VirtualBoxProvider::VirtualBoxProvider(): + virtualBoxConfig ( homeDir() + "/.VirtualBox/VirtualBox.xml") +{ + fp.setFileName (virtualBoxConfig); + + static const char *kOSTypeIcons [][2] = + { + {"Other", ":/vbox-icons/os_other.png"}, + {"DOS", ":/vbox-icons/os_dos.png"}, + {"Netware", ":/vbox-icons/os_netware.png"}, + {"L4", ":/vbox-icons/os_l4.png"}, + {"Windows31", ":/vbox-icons/os_win31.png"}, + {"Windows95", ":/vbox-icons/os_win95.png"}, + {"Windows98", ":/vbox-icons/os_win98.png"}, + {"WindowsMe", ":/vbox-icons/os_winme.png"}, + {"WindowsNT4", ":/vbox-icons/os_winnt4.png"}, + {"Windows2000", ":/vbox-icons/os_win2k.png"}, + {"WindowsXP", ":/vbox-icons/os_winxp.png"}, + {"WindowsXP_64", ":/vbox-icons/os_winxp_64.png"}, + {"Windows2003", ":/vbox-icons/os_win2k3.png"}, + {"Windows2003_64", ":/vbox-icons/os_win2k3_64.png"}, + {"WindowsVista", ":/vbox-icons/os_winvista.png"}, + {"WindowsVista_64", ":/vbox-icons/os_winvista_64.png"}, + {"Windows2008", ":/vbox-icons/os_win2k8.png"}, + {"Windows2008_64", ":/vbox-icons/os_win2k8_64.png"}, + {"Windows7", ":/vbox-icons/os_win7.png"}, + {"Windows7_64", ":/vbox-icons/os_win7_64.png"}, + {"WindowsNT", ":/vbox-icons/os_win_other.png"}, + {"OS2Warp3", ":/vbox-icons/os_os2warp3.png"}, + {"OS2Warp4", ":/vbox-icons/os_os2warp4.png"}, + {"OS2Warp45", ":/vbox-icons/os_os2warp45.png"}, + {"OS2eCS", ":/vbox-icons/os_os2ecs.png"}, + {"OS2", ":/vbox-icons/os_os2_other.png"}, + {"Linux22", ":/vbox-icons/os_linux22.png"}, + {"Linux24", ":/vbox-icons/os_linux24.png"}, + {"Linux24_64", ":/vbox-icons/os_linux24_64.png"}, + {"Linux26", ":/vbox-icons/os_linux26.png"}, + {"Linux26_64", ":/vbox-icons/os_linux26_64.png"}, + {"ArchLinux", ":/vbox-icons/os_archlinux.png"}, + {"ArchLinux_64", ":/vbox-icons/os_archlinux_64.png"}, + {"Debian", ":/vbox-icons/os_debian.png"}, + {"Debian_64", ":/vbox-icons/os_debian_64.png"}, + {"OpenSUSE", ":/vbox-icons/os_opensuse.png"}, + {"OpenSUSE_64", ":/vbox-icons/os_opensuse_64.png"}, + {"Fedora", ":/vbox-icons/os_fedora.png"}, + {"Fedora_64", ":/vbox-icons/os_fedora_64.png"}, + {"Gentoo", ":/vbox-icons/os_gentoo.png"}, + {"Gentoo_64", ":/vbox-icons/os_gentoo_64.png"}, + {"Mandriva", ":/vbox-icons/os_mandriva.png"}, + {"Mandriva_64", ":/vbox-icons/os_mandriva_64.png"}, + {"RedHat", ":/vbox-icons/os_redhat.png"}, + {"RedHat_64", ":/vbox-icons/os_redhat_64.png"}, + {"Ubuntu", ":/vbox-icons/os_ubuntu.png"}, + {"Ubuntu_64", ":/vbox-icons/os_ubuntu_64.png"}, + {"Xandros", ":/vbox-icons/os_xandros.png"}, + {"Xandros_64", ":/vbox-icons/os_xandros_64.png"}, + {"Linux", ":/vbox-icons/os_linux_other.png"}, + {"FreeBSD", ":/vbox-icons/os_freebsd.png"}, + {"FreeBSD_64", ":/vbox-icons/os_freebsd_64.png"}, + {"OpenBSD", ":/vbox-icons/os_openbsd.png"}, + {"OpenBSD_64", ":/vbox-icons/os_openbsd_64.png"}, + {"NetBSD", ":/vbox-icons/os_netbsd.png"}, + {"NetBSD_64", ":/vbox-icons/os_netbsd_64.png"}, + {"Solaris", ":/vbox-icons/os_solaris.png"}, + {"Solaris_64", ":/vbox-icons/os_solaris_64.png"}, + {"OpenSolaris", ":/vbox-icons/os_opensolaris.png"}, + {"OpenSolaris_64", ":/vbox-icons/os_opensolaris_64.png"}, + {"QNX", ":/vbox-icons/os_qnx.png"}, + }; + + for (size_t n = 0; n < sizeof (kOSTypeIcons) / sizeof(kOSTypeIcons[0]); ++ n) + { + osIcons.insert (kOSTypeIcons [n][0], (kOSTypeIcons [n][1])); + } +} + +void VirtualBoxProvider::rebuild() +{ + QDomDocument d; + if ( !d.setContent( &fp ) ) + { + qDebug() << "Unable to parse: " << fp.fileName(); + return; + } + + QDomNodeList _dnlist = d.elementsByTagName( "MachineEntry" ); + for ( int i = 0; i < _dnlist.count(); i++ ) + { + const QDomNode & node = _dnlist.at( i ); + const QString & ref = node.toElement().attribute( "src" ); + if ( ref.isEmpty() ) + { + qDebug() << "MachineEntry with no src attribute"; + continue; + } + + QFile m( ref ); + + QDomDocument mspec; + if ( !mspec.setContent( &m ) ) + { + qDebug() << "Could not parse machine file " << m.fileName(); + continue; + } + + QDomNodeList _mlist = mspec.elementsByTagName( "Machine" ); + for ( int j = 0; j < _mlist.count(); j++ ) + { + QDomNode mnode = _mlist.at( j ); + + QString type = mnode.toElement().attribute( "OSType" ); + VirtualBoxItem *virtualBoxItem = new VirtualBoxItem + ( + mnode.toElement().attribute( "name" ) , + QIcon ( osIcons.value (type , ":/vbox-icons/os_other.png") ) + ); + + const QDomNodeList & rdeportConfig = mnode.toElement().elementsByTagName("VRDEProperties"); + if ( ! rdeportConfig.isEmpty() ) + { + QDomNode portNode = rdeportConfig.at(0).firstChild(); + virtualBoxItem->setRDEPort( portNode.toElement().attribute("value") ); + } + + append ( virtualBoxItem ); + } + } + + timeStamp = QDateTime::currentDateTime(); + +} + +bool VirtualBoxProvider::isOutDated() const +{ + return fp.exists() && ( timeStamp < QFileInfo ( virtualBoxConfig ).lastModified () ); +} +#endif + + +#ifdef MATH_ENABLED +#include +#include + +/************************************************ + + ************************************************/ +MathItem::MathItem(): + CommandProviderItem() +{ + mToolTip =QObject::tr("Mathematics"); + mIcon = XdgIcon::fromTheme("accessories-calculator"); +} + + +/************************************************ + + ************************************************/ +bool MathItem::run() const +{ + return false; +} + + +/************************************************ + + ************************************************/ +bool MathItem::compare(const QRegExp ®Exp) const +{ + QString s = regExp.pattern().trimmed(); + + if (s.endsWith("=")) + { + s.chop(1); + QScriptEngine myEngine; + QScriptValue res = myEngine.evaluate(s); + if (res.isNumber()) + { + MathItem *self=const_cast(this); + self->mTitle = s + " = " + res.toString(); + return true; + } + } + + return false; +} + +/************************************************ + + ************************************************/ +unsigned int MathItem::rank(const QString &pattern) const +{ + return stringRank(mTitle, pattern); +} + + +/************************************************ + + ************************************************/ +MathProvider::MathProvider() +{ + append(new MathItem()); +} + + +PowerProviderItem::PowerProviderItem(QAction *action) + : CommandProviderItem(), + m_action(action) +{ + mIcon = action->icon(); + mTitle = action->text(); + mComment = QObject::tr("Power Management"); + mToolTip = mComment; +} + +bool PowerProviderItem::run() const +{ + m_action->activate(QAction::Trigger); + return true; +} + +bool PowerProviderItem::compare(const QRegExp ®Exp) const +{ + if (regExp.isEmpty()) + return false; + + QRegExp re(regExp); + + re.setCaseSensitivity(Qt::CaseInsensitive); + return mTitle.contains(re) ; +} + +unsigned int PowerProviderItem::rank(const QString &pattern) const +{ + return stringRank(mTitle, pattern); +} + +PowerProvider::PowerProvider() : CommandProvider() +{ + m_power = new LxQt::PowerManager(this); + foreach (QAction *a, m_power->availableActions()) + { + append(new PowerProviderItem(a)); + } + + m_screensaver = new LxQt::ScreenSaver(this); + foreach (QAction *a, m_screensaver->availableActions()) + { + append(new PowerProviderItem(a)); + } +} + +ExternalProviderItem::ExternalProviderItem() +{ +} + +bool ExternalProviderItem::setData(QMap & data) +{ + if (! (data.contains("title") && data.contains("command"))) + { + return false; + } + + mTitle = data["title"]; + mComment = data["comment"]; + mToolTip = data["tooltip"]; + mCommand = data["command"]; + if (data.contains("icon")) + mIcon = XdgIcon::fromTheme(data["icon"]); + + return true; +} + + + +bool ExternalProviderItem::run() const +{ + return startProcess(mCommand); +} + +unsigned int ExternalProviderItem::rank(const QString& pattern) const +{ + return stringRank(title(), pattern); +} + +ExternalProvider::ExternalProvider(const QString name, const QString externalProgram) : +CommandProvider(), mName(name) +{ + mExternalProcess = new QProcess(this); + mYamlParser = new YamlParser(); + connect(mYamlParser, SIGNAL(newListOfMaps(QList >)), + this, SLOT(newListOfMaps(QList >))); + + connect(mExternalProcess, SIGNAL(readyRead()), this, SLOT(readFromProcess())); + mExternalProcess->start(externalProgram); +} + +void ExternalProvider::setSearchTerm(const QString searchTerm) +{ + mExternalProcess->write(searchTerm.toUtf8()); + mExternalProcess->write(QString("\n").toUtf8()); +} + +void ExternalProvider::newListOfMaps(QList > maps) +{ + emit aboutToBeChanged(); + + qDeleteAll(*this); + clear(); + + QMap map; + foreach(map, maps) + { + ExternalProviderItem *item = new ExternalProviderItem(); + if (item->setData(map)) + this->append(item); + else + delete item; + } + + emit changed(); +} + +void ExternalProvider::readFromProcess() +{ + char ch; + while (mExternalProcess->getChar(&ch)) + { + if (ch == '\n') + { + QString textLine = QString::fromLocal8Bit(mBuffer); + mYamlParser->consumeLine(textLine); + mBuffer.clear(); + } + else + { + mBuffer.append(ch); + } + } +} + +#endif diff --git a/providers.h b/providers.h new file mode 100644 index 0000000..14f7cf6 --- /dev/null +++ b/providers.h @@ -0,0 +1,374 @@ +/* BEGIN_COMMON_COPYRIGHT_HEADER + * (c)LGPL2+ + * + * LXDE-Qt - a lightweight, Qt based, desktop toolset + * http://razor-qt.org + * + * Copyright: 2010-2011 Razor team + * Authors: + * Alexander Sokoloff + * Petr Vanek + * + * This program or 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 + * + * END_COMMON_COPYRIGHT_HEADER */ + + +#ifndef PROVIDERS_H +#define PROVIDERS_H + +#include +#include +#include +#include +#include + +#ifdef HAVE_MENU_CACHE +#include +#endif + +#define MAX_RANK 0xFFFF + +/*! The CommandProviderItem class provides an item for use with CommandProvider. + Items usually contain title, comment, toolTip and icon. + */ +class CommandProviderItem: public QObject +{ + Q_OBJECT +public: + CommandProviderItem(): QObject() {} + virtual ~CommandProviderItem() {} + + virtual bool run() const = 0; + virtual bool compare(const QRegExp ®Exp) const = 0; + + /// Returns the item's icon. + QIcon icon() const { return mIcon; } + + /// Returns the item's title. + QString title() const { return mTitle; } + + /// Returns the item's comment. + QString comment() const { return mComment; } + + /// Returns the item's tooltip. + QString toolTip() const { return mToolTip; } + + /*! The result of this function is used when searching for a apropriate item. + The item with the highest rank will be highlighted. + 0 - not suitable. + MAX_RANK - an exact match. + In the most cases you can yse something like: + return stringRank(mTitle, pattern); + */ + virtual unsigned int rank(const QString &pattern) const = 0; + +protected: + /// Helper function for the CommandProviderItem::rank + unsigned int stringRank(const QString str, const QString pattern) const; + QIcon mIcon; + QString mTitle; + QString mComment; + QString mToolTip; +}; + + +/*! The CommandProvider class provides task for the lxqt-runner. + */ +class CommandProvider: public QObject, public QList +{ + Q_OBJECT +public: + CommandProvider(); + virtual ~CommandProvider(); + + virtual void rebuild() {} + virtual bool isOutDated() const { return false; } + +signals: + void aboutToBeChanged(); + void changed(); +}; + + +/************************************************ + * Application desktop files + ************************************************/ + +class AppLinkItem: public CommandProviderItem +{ + Q_OBJECT +public: + AppLinkItem(const QDomElement &element); + +#ifdef HAVE_MENU_CACHE + AppLinkItem(MenuCacheApp* app); +#endif + + bool run() const; + bool compare(const QRegExp ®Exp) const; + QString command() const { return mCommand; } + + void operator=(const AppLinkItem &other); + + virtual unsigned int rank(const QString &pattern) const; +private slots: + void updateIcon(); +private: + QString mDesktopFile; + QString mIconName; + QString mCommand; + QString mProgram; +}; + + +class XdgMenu; +class AppLinkProvider: public CommandProvider +{ + Q_OBJECT +public: + AppLinkProvider(); + virtual ~AppLinkProvider(); + +private slots: + void update(); + +private: +#ifdef HAVE_MENU_CACHE + MenuCache* mMenuCache; + MenuCacheNotifyId mMenuCacheNotify; + static void menuCacheReloadNotify(MenuCache* cache, gpointer user_data); +#else + XdgMenu *mXdgMenu; +#endif +}; + + +/************************************************ + * History + ************************************************/ + +class HistoryItem: public CommandProviderItem +{ +public: + HistoryItem(const QString &command); + + bool run() const; + bool compare(const QRegExp ®Exp) const; + + QString command() const { return mCommand; } + virtual unsigned int rank(const QString &pattern) const; + +private: + QString mCommand; +}; + + + +class QSettings; +class HistoryProvider: public CommandProvider +{ +public: + HistoryProvider(); + virtual ~HistoryProvider(); + + void AddCommand(const QString &command); + void clearHistory(); + +private: + QSettings *mHistoryFile; +}; + + + +/************************************************ + * Custom command + ************************************************/ +class CustomCommandProvider; + +class CustomCommandItem: public CommandProviderItem +{ +public: + CustomCommandItem(CustomCommandProvider *provider); + + bool run() const; + bool compare(const QRegExp ®Exp) const; + + QString command() const { return mCommand; } + void setCommand(const QString &command); + + virtual unsigned int rank(const QString &pattern) const; +private: + QString mCommand; + CustomCommandProvider *mProvider; +}; + + + +class QSettings; +class CustomCommandProvider: public CommandProvider +{ +public: + CustomCommandProvider(); + + QString command() const { return mItem->command(); } + void setCommand(const QString &command) { mItem->setCommand(command); } + + HistoryProvider* historyProvider() const { return mHistoryProvider; } + void setHistoryProvider(HistoryProvider *historyProvider) { mHistoryProvider = historyProvider; } + +private: + CustomCommandItem *mItem; + HistoryProvider *mHistoryProvider; +}; + + + +/************************************************ + * Mathematics + ************************************************/ +class MathItem: public CommandProviderItem +{ +public: + MathItem(); + + bool run() const; + bool compare(const QRegExp ®Exp) const; + virtual unsigned int rank(const QString &pattern) const; +}; + + + +class MathProvider: public CommandProvider +{ +public: + MathProvider(); + //virtual ~MathProvider(); +}; + +#ifdef VBOX_ENABLED +#include +#include +#include +#include + +class VirtualBoxItem: public CommandProviderItem +{ +public: + VirtualBoxItem(const QString & MachineName , const QIcon & Icon); + + void setRDEPort (const QString & portNum); + bool run() const; + bool compare(const QRegExp ®Exp) const; + virtual unsigned int rank(const QString &pattern) const; +private: + QString m_rdePortNum; +}; + +class VirtualBoxProvider: public CommandProvider +{ +public: + VirtualBoxProvider (); + void rebuild(); + bool isOutDated() const; + +private: + QFile fp; + QMap osIcons; + QString virtualBoxConfig; + QDateTime timeStamp; +}; +#endif + + +class QAction; +/*! Power management built in into runner + */ +class PowerProviderItem : public CommandProviderItem +{ +public: + PowerProviderItem(QAction *action); + + bool run() const; + bool compare(const QRegExp ®Exp) const; + unsigned int rank(const QString &pattern) const; +private: + QAction *m_action; +}; + +namespace LxQt { + class PowerManager; + class ScreenSaver; +} + +/*! Power management built in into runner + */ +class PowerProvider: public CommandProvider +{ + Q_OBJECT +public: + PowerProvider(); + +private: + LxQt::PowerManager *m_power; + LxQt::ScreenSaver *m_screensaver; +}; + +class ExternalProviderItem: public CommandProviderItem +{ + Q_OBJECT + +public: + ExternalProviderItem(); + + bool setData(QMap & data); + + bool run() const; + bool compare(const QRegExp ®Exp) const {return true;} // We leave the decision to the external process + unsigned int rank(const QString &pattern) const; + + QString mCommand; +}; + +class QProcess; +class YamlParser; +class ExternalProvider: public CommandProvider +{ + Q_OBJECT + +public: + ExternalProvider(const QString name, const QString externalProgram); + + void setSearchTerm(const QString searchTerm); + +signals: + void dataChanged(); + +private slots: + void readFromProcess(); + void newListOfMaps(QList > maps); + +private: + QString mName; + QProcess *mExternalProcess; + QTextStream *mDataToProcess; + YamlParser *mYamlParser; + + QByteArray mBuffer; +}; + + +#endif // PROVIDERS_H diff --git a/translations/lxqt-runner.ts b/translations/lxqt-runner.ts new file mode 100644 index 0000000..c59a439 --- /dev/null +++ b/translations/lxqt-runner.ts @@ -0,0 +1,98 @@ + + + + + ConfigureDialog + + + Runner Settings + + + + + Appearance + + + + + Positioning: + + + + + Show on: + + + + + Shortcut: + + + + + Top edge of the screen + + + + + Center of the screen + + + + + Focused screen + + + + + Always on screen %1 + + + + + Reset + + + + + Dialog + + + Application launcher + + + + + Configure + + + + + Clear History + + + + + Show/hide runner dialog + + + + + QObject + + + History + + + + + Mathematics + + + + + Power Management + + + + diff --git a/translations/lxqt-runner_ar.ts b/translations/lxqt-runner_ar.ts new file mode 100644 index 0000000..4aa9c42 --- /dev/null +++ b/translations/lxqt-runner_ar.ts @@ -0,0 +1,75 @@ + + + ConfigureDialog + + LxQt-runner Settings + إعدادات مُطلق ريزر + + + Appearance + المظهر + + + Positioning: + تحديد الموضع: + + + Show on: + إظهارٌ على: + + + Shortcut: + رابطٌ مختصر: + + + Top edge of screen + الحافَّة العليا للشَّاشة + + + Center of screen + مركز الشَّاشة + + + Monitor where the mouse + المراقبة عند مؤشر الفأرة + + + Always on %1 monitor + دوماً في شاشة العرض %1 + + + + Dialog + + Application launcher + بادئ التطبيقات + + + Configure lxqt-runner + تهيئة مُطلق نظام ريزر + + + Clear lxqt-runner History + مسح ذاكرة مُنفِّذ برامج ريزر + + + Press "%1" to see dialog. + اضغط "%1" لمشاهدة لوحة الحوار. + + + + QObject + + History + سجلُّ السوابق + + + Mathematics + الرِّياضيَّات + + + LxQt Power Management + إدارة الطاقة لبيئة ريزر + + + \ No newline at end of file diff --git a/translations/lxqt-runner_cs.ts b/translations/lxqt-runner_cs.ts new file mode 100644 index 0000000..ba9a7da --- /dev/null +++ b/translations/lxqt-runner_cs.ts @@ -0,0 +1,75 @@ + + + ConfigureDialog + + LxQt-runner Settings + Nastavení spouštěče programů + + + Appearance + Vzhled + + + Positioning: + Umístění: + + + Show on: + Ukázat na: + + + Shortcut: + Klávesová zkratka: + + + Top edge of screen + Horní okraj obrazovky + + + Center of screen + Střed obrazovky + + + Monitor where the mouse + Tam, kde je myš + + + Always on %1 monitor + Vždy na %1 obrazovce + + + + Dialog + + Application launcher + Spouštěč programů + + + Configure lxqt-runner + Nastavit spouštěč programů + + + Clear lxqt-runner History + Smazat historii spouštěče programů + + + Press "%1" to see dialog. + Stiskněte "%1" pro zobrazení dialogu. + + + + QObject + + History + Historie + + + Mathematics + Matematika + + + LxQt Power Management + Správa energie + + + \ No newline at end of file diff --git a/translations/lxqt-runner_cs_CZ.ts b/translations/lxqt-runner_cs_CZ.ts new file mode 100644 index 0000000..55e3624 --- /dev/null +++ b/translations/lxqt-runner_cs_CZ.ts @@ -0,0 +1,75 @@ + + + ConfigureDialog + + LxQt-runner Settings + Nastavení spouštěče programů + + + Appearance + Vzhled + + + Positioning: + Umístění: + + + Show on: + Ukázat na: + + + Shortcut: + Klávesová zkratka: + + + Top edge of screen + Horní okraj obrazovky + + + Center of screen + Střed obrazovky + + + Monitor where the mouse + Tam, kde je myš + + + Always on %1 monitor + Vždy na %1 obrazovce + + + + Dialog + + Application launcher + Spouštěč programů + + + Configure lxqt-runner + Nastavit spouštěč programů + + + Clear lxqt-runner History + Smazat historii spouštěče programů + + + Press "%1" to see dialog. + Stiskněte "%1" pro zobrazení dialogu. + + + + QObject + + History + Historie + + + Mathematics + Matematika + + + LxQt Power Management + Správa energie + + + \ No newline at end of file diff --git a/translations/lxqt-runner_da.ts b/translations/lxqt-runner_da.ts new file mode 100644 index 0000000..2eff5d9 --- /dev/null +++ b/translations/lxqt-runner_da.ts @@ -0,0 +1,81 @@ + + + ConfigureDialog + + + LxQt-runner Settings + + + + + Appearance + + + + + Positioning: + + + + + Show on: + + + + + Shortcut: + + + + + Top edge of screen + + + + + Center of screen + + + + + Monitor where the mouse + + + + + Always on %1 monitor + + + + + Dialog + + + Application launcher + + + + + Configure lxqt-runner + + + + + Press "%1" to see dialog. + + + + + QObject + + + History + + + + + Mathematics + + + + \ No newline at end of file diff --git a/translations/lxqt-runner_da_DK.ts b/translations/lxqt-runner_da_DK.ts new file mode 100644 index 0000000..2be790c --- /dev/null +++ b/translations/lxqt-runner_da_DK.ts @@ -0,0 +1,75 @@ + + + ConfigureDialog + + LxQt-runner Settings + Programstarter Indstillinger + + + Appearance + Udseende + + + Positioning: + Position: + + + Show on: + Vis på: + + + Shortcut: + Genvej: + + + Top edge of screen + Skærmens topkant + + + Center of screen + Skærmens midte + + + Monitor where the mouse + Skærmen, hvor musen + + + Always on %1 monitor + Altid på skærm %1 + + + + Dialog + + Application launcher + Programstarter + + + Configure lxqt-runner + Indstil LxQt programstarter + + + Clear lxqt-runner History + Nulstil lxqt programstarter historik + + + Press "%1" to see dialog. + Tryk "%1" for at se dialog. + + + + QObject + + History + Historie + + + Mathematics + Matematik + + + LxQt Power Management + LxQt Strømstyring + + + \ No newline at end of file diff --git a/translations/lxqt-runner_de.ts b/translations/lxqt-runner_de.ts new file mode 100644 index 0000000..332ca61 --- /dev/null +++ b/translations/lxqt-runner_de.ts @@ -0,0 +1,81 @@ + + + ConfigureDialog + + + LxQt-runner Settings + + + + + Appearance + + + + + Positioning: + + + + + Show on: + + + + + Shortcut: + + + + + Top edge of screen + + + + + Center of screen + + + + + Monitor where the mouse + + + + + Always on %1 monitor + + + + + Dialog + + + Application launcher + + + + + Configure lxqt-runner + + + + + Press "%1" to see dialog. + + + + + QObject + + + History + + + + + Mathematics + + + + \ No newline at end of file diff --git a/translations/lxqt-runner_de_DE.ts b/translations/lxqt-runner_de_DE.ts new file mode 100644 index 0000000..f12f6c7 --- /dev/null +++ b/translations/lxqt-runner_de_DE.ts @@ -0,0 +1,75 @@ + + + ConfigureDialog + + LxQt-runner Settings + LxQt-runner-Einstellungen + + + Appearance + Aussehen + + + Positioning: + Positionierung: + + + Show on: + Anzeigen auf: + + + Shortcut: + Tastenkürzel: + + + Top edge of screen + Bildschirmoberkante + + + Center of screen + Bildschirmmitte + + + Monitor where the mouse + Anzeigen, wo die Maus ist + + + Always on %1 monitor + Immer auf Monitor %1 + + + + Dialog + + Application launcher + Anwendungsstarter + + + Configure lxqt-runner + Konfiguriere lxqt-runner + + + Clear lxqt-runner History + LxQt-runner Verlauf löschen + + + Press "%1" to see dialog. + Klicke "%1" für Dialogsansicht. + + + + QObject + + History + Verlauf + + + Mathematics + Mathematik + + + LxQt Power Management + LxQt Energieverwaltung + + + \ No newline at end of file diff --git a/translations/lxqt-runner_el_GR.ts b/translations/lxqt-runner_el_GR.ts new file mode 100644 index 0000000..e408886 --- /dev/null +++ b/translations/lxqt-runner_el_GR.ts @@ -0,0 +1,75 @@ + + + ConfigureDialog + + LxQt-runner Settings + Ρυθμίσεις εκτελεστή LxQt + + + Appearance + Εμφάνιση + + + Positioning: + Θέση: + + + Show on: + Εμφάνιση σε: + + + Shortcut: + Συντόμευση: + + + Top edge of screen + Επάνω άκρη της οθόνης + + + Center of screen + Κέντρο της οθόνης + + + Monitor where the mouse + Οθόνη όπου βρίσκεται το ποντίκι + + + Always on %1 monitor + Πάντα στην οθόνη %1 + + + + Dialog + + Application launcher + Εκκινητής εφαρμογής + + + Configure lxqt-runner + Διαμόρφωση εκτελεστή lxqt + + + Clear lxqt-runner History + Εκκαθάριση ιστορικού εκτελεστή lxqt + + + Press "%1" to see dialog. + Πιέστε "%1" για εμφάνιση διαλόγου. + + + + QObject + + History + Ιστορία + + + Mathematics + Μαθηματικά + + + LxQt Power Management + Διαχείριση ενέργειας LxQt + + + \ No newline at end of file diff --git a/translations/lxqt-runner_eo.ts b/translations/lxqt-runner_eo.ts new file mode 100644 index 0000000..7b47ba6 --- /dev/null +++ b/translations/lxqt-runner_eo.ts @@ -0,0 +1,75 @@ + + + ConfigureDialog + + LxQt-runner Settings + Agordoj de lxqt-runner + + + Appearance + Apero + + + Positioning: + Loko: + + + Show on: + Montri en: + + + Shortcut: + Klavkombino: + + + Top edge of screen + Supra bordo de la ekrano + + + Center of screen + Centro de la ekrano + + + Monitor where the mouse + + + + Always on %1 monitor + Ĉiam en %1 monitoro + + + + Dialog + + Application launcher + Lanĉilo de aplikaĵoj + + + Configure lxqt-runner + Agordi lxqt-runner + + + Clear lxqt-runner History + Vakigi kronologion de lxqt-runner + + + Press "%1" to see dialog. + Alkalku "%1" por montri dialogon. + + + + QObject + + History + Historio + + + Mathematics + Matematiko + + + LxQt Power Management + Kurentmastrumilo de LxQt + + + \ No newline at end of file diff --git a/translations/lxqt-runner_es.ts b/translations/lxqt-runner_es.ts new file mode 100644 index 0000000..041b48b --- /dev/null +++ b/translations/lxqt-runner_es.ts @@ -0,0 +1,75 @@ + + + ConfigureDialog + + LxQt-runner Settings + Configuración de LxQt-runner + + + Appearance + Apariencia + + + Positioning: + Posición: + + + Show on: + Mostrar en: + + + Shortcut: + Acceso directo + + + Top edge of screen + Extremo superior de la pantalla + + + Center of screen + Centro de la pantalla + + + Monitor where the mouse + Monitor donde esté el ratón + + + Always on %1 monitor + Siempre en el monitor %1 + + + + Dialog + + Application launcher + Lanzador de aplicaciones + + + Configure lxqt-runner + Configurar lxqt-runner + + + Clear lxqt-runner History + Limpiar historial de LxQt-Runner + + + Press "%1" to see dialog. + Presione "%1" para ver la pantalla. + + + + QObject + + History + Historial + + + Mathematics + Matemáticas + + + LxQt Power Management + Administrador de energía de LxQt + + + \ No newline at end of file diff --git a/translations/lxqt-runner_es_VE.ts b/translations/lxqt-runner_es_VE.ts new file mode 100644 index 0000000..e1f4033 --- /dev/null +++ b/translations/lxqt-runner_es_VE.ts @@ -0,0 +1,75 @@ + + + ConfigureDialog + + LxQt-runner Settings + Configuraciones de LxQt-Ejecutor + + + Appearance + Apariencia + + + Positioning: + Posicionamiento: + + + Show on: + Mostrar en: + + + Shortcut: + Acceso de tecla: + + + Top edge of screen + En el tope de pantalla + + + Center of screen + Centrar en la pantalla + + + Monitor where the mouse + Pantalla donde este el raton + + + Always on %1 monitor + Siempre en la pantalla %1 + + + + Dialog + + Application launcher + Lanzador de palicaciones + + + Configure lxqt-runner + Configurar lanzador de LxQt + + + Clear lxqt-runner History + Limpiar historial de lxqt-runner + + + Press "%1" to see dialog. + Presiona %1 para ver el dialogo + + + + QObject + + History + Historial + + + Mathematics + Matematicas + + + LxQt Power Management + Manejador de energia de LxQt + + + \ No newline at end of file diff --git a/translations/lxqt-runner_eu.ts b/translations/lxqt-runner_eu.ts new file mode 100644 index 0000000..335c41a --- /dev/null +++ b/translations/lxqt-runner_eu.ts @@ -0,0 +1,75 @@ + + + ConfigureDialog + + LxQt-runner Settings + LxQt-runner ezarpenak + + + Appearance + Itxura + + + Positioning: + Posizioa: + + + Show on: + Erakutsi hemen: + + + Shortcut: + Lasterbidea: + + + Top edge of screen + Pantailaren goiko ertza + + + Center of screen + Pantailaren erdia + + + Monitor where the mouse + Monitorea sagua dagoen lekuan + + + Always on %1 monitor + Beti %1 monitorean + + + + Dialog + + Application launcher + Aplikazio-abiarazlea + + + Configure lxqt-runner + Konfiguratu lxqt-runner + + + Clear lxqt-runner History + Garbitu lxqt-runner historia + + + Press "%1" to see dialog. + Sakatu "%1" elkarrizketa-koadroa ikusteko. + + + + QObject + + History + Historia + + + Mathematics + Matematikak + + + LxQt Power Management + LxQt energia-kudeaketa + + + \ No newline at end of file diff --git a/translations/lxqt-runner_fi.ts b/translations/lxqt-runner_fi.ts new file mode 100644 index 0000000..4bfb6dd --- /dev/null +++ b/translations/lxqt-runner_fi.ts @@ -0,0 +1,75 @@ + + + ConfigureDialog + + LxQt-runner Settings + LxQtin käynnistimen asetukset + + + Appearance + Ulkoasu + + + Positioning: + Sijainti: + + + Show on: + Näytä: + + + Shortcut: + Pikanäppäin: + + + Top edge of screen + Näytön ylälaidassa + + + Center of screen + Keskellä näyttöä + + + Monitor where the mouse + Näytöllä, jossa hiiren osoitin on + + + Always on %1 monitor + Aina näytöllä %1 + + + + Dialog + + Application launcher + Sovelluskäynnistin + + + Configure lxqt-runner + Hallitse LxQtin käynnistintä + + + Clear lxqt-runner History + Tyhjennä LxQt-käynnistimen historia + + + Press "%1" to see dialog. + Paina "%1" nähdäksesi ikkunan. + + + + QObject + + History + Historia + + + Mathematics + Matematiikka + + + LxQt Power Management + LxQtin virranhallinta + + + \ No newline at end of file diff --git a/translations/lxqt-runner_fr_FR.ts b/translations/lxqt-runner_fr_FR.ts new file mode 100644 index 0000000..255b202 --- /dev/null +++ b/translations/lxqt-runner_fr_FR.ts @@ -0,0 +1,75 @@ + + + ConfigureDialog + + LxQt-runner Settings + Paramètres du lanceur de commandes + + + Appearance + Apparence + + + Positioning: + Position : + + + Show on: + Montrer au : + + + Shortcut: + Raccourci : + + + Top edge of screen + Bord supérieur de l'écran + + + Center of screen + Centre de l'écran + + + Monitor where the mouse + Moniteur où se trouve la souris + + + Always on %1 monitor + Toujours sur le moniteur %1 + + + + Dialog + + Application launcher + Lanceur d'application + + + Configure lxqt-runner + Configurer le lanceur de commandes + + + Clear lxqt-runner History + Effacer l'historique du lanceur de commandes + + + Press "%1" to see dialog. + Appuyer sur "%1" pour voir le dialogue + + + + QObject + + History + Histoire + + + Mathematics + Mathématiques + + + LxQt Power Management + Gestion de l'énergie + + + \ No newline at end of file diff --git a/translations/lxqt-runner_hu.ts b/translations/lxqt-runner_hu.ts new file mode 100644 index 0000000..b568296 --- /dev/null +++ b/translations/lxqt-runner_hu.ts @@ -0,0 +1,81 @@ + + + ConfigureDialog + + + LxQt-runner Settings + + + + + Appearance + + + + + Positioning: + + + + + Show on: + + + + + Shortcut: + + + + + Top edge of screen + + + + + Center of screen + + + + + Monitor where the mouse + + + + + Always on %1 monitor + + + + + Dialog + + + Application launcher + + + + + Configure lxqt-runner + + + + + Press "%1" to see dialog. + + + + + QObject + + + History + + + + + Mathematics + + + + \ No newline at end of file diff --git a/translations/lxqt-runner_ia.ts b/translations/lxqt-runner_ia.ts new file mode 100644 index 0000000..613b71e --- /dev/null +++ b/translations/lxqt-runner_ia.ts @@ -0,0 +1,81 @@ + + + ConfigureDialog + + + LxQt-runner Settings + + + + + Appearance + + + + + Positioning: + + + + + Show on: + + + + + Shortcut: + + + + + Top edge of screen + + + + + Center of screen + + + + + Monitor where the mouse + + + + + Always on %1 monitor + + + + + Dialog + + + Application launcher + + + + + Configure lxqt-runner + + + + + Press "%1" to see dialog. + + + + + QObject + + + History + + + + + Mathematics + + + + \ No newline at end of file diff --git a/translations/lxqt-runner_id_ID.ts b/translations/lxqt-runner_id_ID.ts new file mode 100644 index 0000000..d442441 --- /dev/null +++ b/translations/lxqt-runner_id_ID.ts @@ -0,0 +1,81 @@ + + + ConfigureDialog + + + LxQt-runner Settings + + + + + Appearance + + + + + Positioning: + + + + + Show on: + + + + + Shortcut: + + + + + Top edge of screen + + + + + Center of screen + + + + + Monitor where the mouse + + + + + Always on %1 monitor + + + + + Dialog + + + Application launcher + + + + + Configure lxqt-runner + + + + + Press "%1" to see dialog. + + + + + QObject + + + History + + + + + Mathematics + + + + \ No newline at end of file diff --git a/translations/lxqt-runner_it_IT.ts b/translations/lxqt-runner_it_IT.ts new file mode 100644 index 0000000..7c03390 --- /dev/null +++ b/translations/lxqt-runner_it_IT.ts @@ -0,0 +1,75 @@ + + + ConfigureDialog + + LxQt-runner Settings + Impostazioni di LxQt-runner + + + Appearance + Aspetto + + + Positioning: + Posizione: + + + Show on: + Mostra su: + + + Shortcut: + Scorciatoia: + + + Top edge of screen + Bordo superiore dello schermo + + + Center of screen + Centro dello schermo + + + Monitor where the mouse + Vedi dove è il mouse + + + Always on %1 monitor + Sempre sul monitor %1 + + + + Dialog + + Application launcher + Lanciatore di applicazioni + + + Configure lxqt-runner + Configura LxQt-runner + + + Clear lxqt-runner History + Cancella la cronologia di lxqt-runner + + + Press "%1" to see dialog. + Premi "%1" per vedere la finestra di dialogo. + + + + QObject + + History + Cronologia + + + Mathematics + Matematica + + + LxQt Power Management + Gestione energetica di LxQt + + + \ No newline at end of file diff --git a/translations/lxqt-runner_ja.ts b/translations/lxqt-runner_ja.ts new file mode 100644 index 0000000..08bf568 --- /dev/null +++ b/translations/lxqt-runner_ja.ts @@ -0,0 +1,75 @@ + + + ConfigureDialog + + LxQt-runner Settings + LxQt-runnerの設定 + + + Appearance + 外観 + + + Positioning: + 配置: + + + Show on: + 表示: + + + Shortcut: + ショートカット: + + + Top edge of screen + スクリーンの上辺 + + + Center of screen + スクリーンの中央 + + + Monitor where the mouse + マウスの位置を観察 + + + Always on %1 monitor + 常に%1モニタに + + + + Dialog + + Application launcher + アプリケーションランチャ + + + Configure lxqt-runner + lxqt-runnerを設定 + + + Clear lxqt-runner History + LxQt-runnerの履歴を消去 + + + Press "%1" to see dialog. + ダイアログを見るには"%1"を押してください。 + + + + QObject + + History + 履歴 + + + Mathematics + 計算 + + + LxQt Power Management + LxQt電源管理 + + + \ No newline at end of file diff --git a/translations/lxqt-runner_ko.ts b/translations/lxqt-runner_ko.ts new file mode 100644 index 0000000..1d3a135 --- /dev/null +++ b/translations/lxqt-runner_ko.ts @@ -0,0 +1,81 @@ + + + ConfigureDialog + + + LxQt-runner Settings + + + + + Appearance + + + + + Positioning: + + + + + Show on: + + + + + Shortcut: + + + + + Top edge of screen + + + + + Center of screen + + + + + Monitor where the mouse + + + + + Always on %1 monitor + + + + + Dialog + + + Application launcher + + + + + Configure lxqt-runner + + + + + Press "%1" to see dialog. + + + + + QObject + + + History + + + + + Mathematics + + + + \ No newline at end of file diff --git a/translations/lxqt-runner_lt.ts b/translations/lxqt-runner_lt.ts new file mode 100644 index 0000000..e77d88d --- /dev/null +++ b/translations/lxqt-runner_lt.ts @@ -0,0 +1,75 @@ + + + ConfigureDialog + + LxQt-runner Settings + LxQt paleidiklio nuostatos + + + Appearance + Išvaizda + + + Positioning: + Padėtis: + + + Show on: + Rodyti: + + + Shortcut: + Nuoroda: + + + Top edge of screen + Viršutiniame ekrano krašte + + + Center of screen + Ekrano centre + + + Monitor where the mouse + Ties pele + + + Always on %1 monitor + Visada „%1“ vaizduoklyje + + + + Dialog + + Application launcher + Programų paleidiklis + + + Configure lxqt-runner + Konfigūruoti lxqt paleidiklį + + + Clear lxqt-runner History + Išvalyti lxqt paleidiklio istoriją + + + Press "%1" to see dialog. + Norėdami matyti dialogą, spauskite „%1“ + + + + QObject + + History + Istorija + + + Mathematics + Matematika + + + LxQt Power Management + LxQt energijos valdymas + + + \ No newline at end of file diff --git a/translations/lxqt-runner_nl.ts b/translations/lxqt-runner_nl.ts new file mode 100644 index 0000000..e55c363 --- /dev/null +++ b/translations/lxqt-runner_nl.ts @@ -0,0 +1,75 @@ + + + ConfigureDialog + + LxQt-runner Settings + LxQt-uitvoeren Instellingen + + + Appearance + Uiterlijk + + + Positioning: + Positionering: + + + Show on: + Toon op: + + + Shortcut: + Snelkoppeling: + + + Top edge of screen + Bovenkant van het scherm + + + Center of screen + Midden van het scherm + + + Monitor where the mouse + Check positie van de muis + + + Always on %1 monitor + Altijd op %1 monitor + + + + Dialog + + Application launcher + Programma starter + + + Configure lxqt-runner + Configureer LxQt-uitvoeren + + + Clear lxqt-runner History + Wis lxqt-runner Geschiedenis + + + Press "%1" to see dialog. + Toets "%1" om dialoog te zien. + + + + QObject + + History + Geschiedenis + + + Mathematics + Wiskundig + + + LxQt Power Management + LxQt Energiebeheer + + + \ No newline at end of file diff --git a/translations/lxqt-runner_pl_PL.ts b/translations/lxqt-runner_pl_PL.ts new file mode 100644 index 0000000..de03b5e --- /dev/null +++ b/translations/lxqt-runner_pl_PL.ts @@ -0,0 +1,75 @@ + + + ConfigureDialog + + LxQt-runner Settings + Ustawienia LxQt-runner + + + Appearance + Wygląd + + + Positioning: + Pozycja: + + + Show on: + Pokaż na: + + + Shortcut: + Skrót: + + + Top edge of screen + Góra ekranu + + + Center of screen + Środek ekranu + + + Monitor where the mouse + Tam, gdzie mysz + + + Always on %1 monitor + Zawsze na %1 ekranie + + + + Dialog + + Application launcher + Wyzwalacz programu + + + Configure lxqt-runner + Konfiguruj lxqt-runner + + + Clear lxqt-runner History + Wyczyść historię lxqt-runnera + + + Press "%1" to see dialog. + Naciśnij "%1", aby zobaczyć okno. + + + + QObject + + History + Historia + + + Mathematics + Matematyka + + + LxQt Power Management + Zarządzanie zasilaniem LxQt + + + diff --git a/translations/lxqt-runner_pt.ts b/translations/lxqt-runner_pt.ts new file mode 100644 index 0000000..170a8d0 --- /dev/null +++ b/translations/lxqt-runner_pt.ts @@ -0,0 +1,77 @@ + + + + + ConfigureDialog + + LxQt-runner Settings + Definições do LxQt-runner + + + Appearance + Aparência + + + Positioning: + Posição: + + + Show on: + Mostrar: + + + Shortcut: + Atalho: + + + Top edge of screen + Margem superior do ecrã + + + Center of screen + Centro do ecrã + + + Monitor where the mouse + Monitor em que está o rato + + + Always on %1 monitor + Sempre no monitor %1 + + + + Dialog + + Application launcher + Lançador de aplicações + + + Configure lxqt-runner + Configurar lxqt-runner + + + Clear lxqt-runner History + Limpar histórico do lxqt-runner + + + Press "%1" to see dialog. + Prima "%1" para abrir a caixa de diálogo. + + + + QObject + + History + Histórico + + + Mathematics + Matemática + + + LxQt Power Management + Gestão de energia do LxQt + + + diff --git a/translations/lxqt-runner_pt_BR.ts b/translations/lxqt-runner_pt_BR.ts new file mode 100644 index 0000000..a63d2e3 --- /dev/null +++ b/translations/lxqt-runner_pt_BR.ts @@ -0,0 +1,75 @@ + + + ConfigureDialog + + LxQt-runner Settings + Configurações do executor do LxQt + + + Appearance + Aparência + + + Positioning: + Posicionamento: + + + Show on: + Exibir em: + + + Shortcut: + Atalho: + + + Top edge of screen + Borda superior da tela + + + Center of screen + Centro da tela + + + Monitor where the mouse + Onde o mouse estiver no monitor + + + Always on %1 monitor + Sempre no monitor %1 + + + + Dialog + + Application launcher + Lançador de aplicativo + + + Configure lxqt-runner + Configurar o executor do LxQt + + + Clear lxqt-runner History + Limpar o histórico do executor do LxQt + + + Press "%1" to see dialog. + Pressione "%1" para ver o diálogo. + + + + QObject + + History + Histórico + + + Mathematics + Matemática + + + LxQt Power Management + Gerenciamento de energia do LxQt + + + \ No newline at end of file diff --git a/translations/lxqt-runner_ro_RO.ts b/translations/lxqt-runner_ro_RO.ts new file mode 100644 index 0000000..e401d04 --- /dev/null +++ b/translations/lxqt-runner_ro_RO.ts @@ -0,0 +1,75 @@ + + + ConfigureDialog + + LxQt-runner Settings + Setări lxqt-runner + + + Appearance + Aspect + + + Positioning: + Poziție: + + + Show on: + Afișează pe: + + + Shortcut: + Scurtătură: + + + Top edge of screen + Marginea superioară a ecranului + + + Center of screen + Centrul ecranului + + + Monitor where the mouse + Monitorizează unde este mausul + + + Always on %1 monitor + Întotdeauna pe monitorul %1 + + + + Dialog + + Application launcher + Lansator de aplicații + + + Configure lxqt-runner + Configurare lxqt-runner + + + Clear lxqt-runner History + Curăță istoricul lxqt-runner + + + Press "%1" to see dialog. + Apăsați "%1" pentru a afișa dialogul. + + + + QObject + + History + Istoric + + + Mathematics + Matematică + + + LxQt Power Management + Gestiune alimentare LxQt + + + \ No newline at end of file diff --git a/translations/lxqt-runner_ru.ts b/translations/lxqt-runner_ru.ts new file mode 100644 index 0000000..d1d93cd --- /dev/null +++ b/translations/lxqt-runner_ru.ts @@ -0,0 +1,98 @@ + + + + + ConfigureDialog + + + Runner Settings + Настройки ускорителя запуска + + + + Appearance + Внешний вид + + + + Positioning: + Позиция: + + + + Show on: + Показывать на: + + + + Shortcut: + Сочетание клавиш: + + + + Top edge of the screen + Верхней границе экрана + + + + Center of the screen + В центре экрана + + + + Focused screen + Активном экране + + + + Always on screen %1 + Всегда на %1 экране + + + + Reset + Сброс + + + + Dialog + + + Application launcher + Ускоритель запуска программ + + + + Configure + Настроить + + + + Clear History + Очистить историю + + + + Show/hide runner dialog + Показать/скрыть окно ускорителя + + + + QObject + + + History + Из истории + + + + Mathematics + Математика + + + + Power Management + Управление энергопотреблением + + + diff --git a/translations/lxqt-runner_ru_RU.ts b/translations/lxqt-runner_ru_RU.ts new file mode 100644 index 0000000..d003239 --- /dev/null +++ b/translations/lxqt-runner_ru_RU.ts @@ -0,0 +1,98 @@ + + + + + ConfigureDialog + + + Runner Settings + Настройки ускорителя запуска + + + + Appearance + Внешний вид + + + + Positioning: + Позиция: + + + + Show on: + Показывать на: + + + + Shortcut: + Сочетание клавиш: + + + + Top edge of the screen + Верхней границе экрана + + + + Center of the screen + В центре экрана + + + + Focused screen + Активном экране + + + + Always on screen %1 + Всегда на %1 экране + + + + Reset + Сброс + + + + Dialog + + + Application launcher + Ускоритель запуска программ + + + + Configure + Настроить + + + + Clear History + Очистить историю + + + + Show/hide runner dialog + Показать/скрыть окно ускорителя + + + + QObject + + + History + Из истории + + + + Mathematics + Математика + + + + Power Management + Управление энергопотреблением + + + diff --git a/translations/lxqt-runner_sk_SK.ts b/translations/lxqt-runner_sk_SK.ts new file mode 100644 index 0000000..78f9e5b --- /dev/null +++ b/translations/lxqt-runner_sk_SK.ts @@ -0,0 +1,75 @@ + + + ConfigureDialog + + LxQt-runner Settings + Nastavenia Spúšťača LxQt + + + Appearance + Vzhľad + + + Positioning: + Pozícia: + + + Show on: + Kde zobrazovať: + + + Shortcut: + Skratka: + + + Top edge of screen + Horný okraj obrazovky + + + Center of screen + Stred obrazovky + + + Monitor where the mouse + Monitor, kde je myš + + + Always on %1 monitor + Vždy na monitore %1 + + + + Dialog + + Application launcher + Spúšťač aplikácií + + + Configure lxqt-runner + Nastaviť Spúšťač LxQt + + + Clear lxqt-runner History + + + + Press "%1" to see dialog. + Stlačením „%1“ zobrazte dialóg. + + + + QObject + + History + História + + + Mathematics + Matematika + + + LxQt Power Management + + + + \ No newline at end of file diff --git a/translations/lxqt-runner_sl.ts b/translations/lxqt-runner_sl.ts new file mode 100644 index 0000000..baa79d1 --- /dev/null +++ b/translations/lxqt-runner_sl.ts @@ -0,0 +1,75 @@ + + + ConfigureDialog + + LxQt-runner Settings + Nastavitve za LxQt-runner + + + Appearance + Videz + + + Positioning: + Položaj: + + + Show on: + Pokaži na: + + + Shortcut: + Bližnjica: + + + Top edge of screen + Vrhnjem robu zaslona + + + Center of screen + Sredini zaslona + + + Monitor where the mouse + Zaslonu, kjer je miška + + + Always on %1 monitor + Vedno na zaslonu %1 + + + + Dialog + + Application launcher + Zaganjalnik programov + + + Configure lxqt-runner + Nastavitve za LxQt-runner + + + Clear lxqt-runner History + Počisti zgodovino za LxQt-runner + + + Press "%1" to see dialog. + Za prikaz pogovornega okna pritisnite »%1«. + + + + QObject + + History + Zgodovina + + + Mathematics + Matematika + + + LxQt Power Management + Upravljanje z energijo + + + \ No newline at end of file diff --git a/translations/lxqt-runner_sr@latin.ts b/translations/lxqt-runner_sr@latin.ts new file mode 100644 index 0000000..d6818f6 --- /dev/null +++ b/translations/lxqt-runner_sr@latin.ts @@ -0,0 +1,81 @@ + + + ConfigureDialog + + + LxQt-runner Settings + + + + + Appearance + + + + + Positioning: + + + + + Show on: + + + + + Shortcut: + + + + + Top edge of screen + + + + + Center of screen + + + + + Monitor where the mouse + + + + + Always on %1 monitor + + + + + Dialog + + + Application launcher + + + + + Configure lxqt-runner + + + + + Press "%1" to see dialog. + + + + + QObject + + + History + + + + + Mathematics + + + + \ No newline at end of file diff --git a/translations/lxqt-runner_sr_BA.ts b/translations/lxqt-runner_sr_BA.ts new file mode 100644 index 0000000..d0b4527 --- /dev/null +++ b/translations/lxqt-runner_sr_BA.ts @@ -0,0 +1,69 @@ + + + + + ConfigureDialog + + LxQt-runner Settings + Подешавања Рејзор-покретача + + + Appearance + Изглед + + + Positioning: + Позиција: + + + Show on: + Прикажи на: + + + Shortcut: + Пречица: + + + Top edge of screen + горња ивица екрана + + + Center of screen + центар екрана + + + Monitor where the mouse + екрану на ком је миш + + + Always on %1 monitor + увијек на екрану %1 + + + + Dialog + + Application launcher + Покретач програма + + + Configure lxqt-runner + Подеси Рејзор-покретача + + + Press "%1" to see dialog. + Притисните „%1“ да бисте видјели дијалог. + + + + QObject + + History + Историјат + + + Mathematics + Математика + + + diff --git a/translations/lxqt-runner_sr_RS.ts b/translations/lxqt-runner_sr_RS.ts new file mode 100644 index 0000000..3a58130 --- /dev/null +++ b/translations/lxqt-runner_sr_RS.ts @@ -0,0 +1,75 @@ + + + ConfigureDialog + + LxQt-runner Settings + Подешавања Рејзор-покретача + + + Appearance + Изглед + + + Positioning: + Позиција: + + + Show on: + Прикажи на: + + + Shortcut: + Пречица: + + + Top edge of screen + горња ивица екрана + + + Center of screen + центар екрана + + + Monitor where the mouse + екрану на ком је миш + + + Always on %1 monitor + увек на екрану %1 + + + + Dialog + + Application launcher + Покретач програма + + + Configure lxqt-runner + Подеси Рејзор-покретача + + + Clear lxqt-runner History + + + + Press "%1" to see dialog. + Притисните „%1“ да бисте видели дијалог. + + + + QObject + + History + Историјат + + + Mathematics + Математика + + + LxQt Power Management + + + + \ No newline at end of file diff --git a/translations/lxqt-runner_th_TH.ts b/translations/lxqt-runner_th_TH.ts new file mode 100644 index 0000000..b43a455 --- /dev/null +++ b/translations/lxqt-runner_th_TH.ts @@ -0,0 +1,75 @@ + + + ConfigureDialog + + LxQt-runner Settings + ค่าตั้งกล่องป้อนคำสั่ง-lxqt + + + Appearance + รูปลักษณ์ + + + Positioning: + ตำแหน่ง: + + + Show on: + แสดงบน: + + + Shortcut: + ปุ่มลัด: + + + Top edge of screen + บริเวณขอบบนของจอภาพ + + + Center of screen + บริเวณส่วนกลางของจอภาพ + + + Monitor where the mouse + จอภาพที่เมาส์อยู่ + + + Always on %1 monitor + ประจำอยู่ที่จอภาพ %1 เสมอ + + + + Dialog + + Application launcher + ปุ่มเรียกใช้งานโปรแกรม + + + Configure lxqt-runner + ปรับแต่งกล่องป้อนคำสั่ง-lxqt + + + Clear lxqt-runner History + ล้างประวัติกล่องป้อนคำสั่ง-lxqt + + + Press "%1" to see dialog. + กด "%1" เพื่อดูกล่องโต้ตอบ + + + + QObject + + History + ประวัติ + + + Mathematics + การคำนวณเลข + + + LxQt Power Management + การจัดการพลังงานของ LxQt + + + \ No newline at end of file diff --git a/translations/lxqt-runner_tr.ts b/translations/lxqt-runner_tr.ts new file mode 100644 index 0000000..6f4957c --- /dev/null +++ b/translations/lxqt-runner_tr.ts @@ -0,0 +1,75 @@ + + + ConfigureDialog + + LxQt-runner Settings + LxQt-çalıştırıcı Ayarları + + + Appearance + Görünüm + + + Positioning: + Konumlandırma: + + + Show on: + Şunda Göster: + + + Shortcut: + Kısayol: + + + Top edge of screen + Ekranın üst köşesi + + + Center of screen + Ekranın merkezi + + + Monitor where the mouse + Fare konumunda görüntüle + + + Always on %1 monitor + Her zaman %1 ekranında + + + + Dialog + + Application launcher + Uygulama başlatıcı + + + Configure lxqt-runner + LxQt-çalıştırıcıyı yapılandır + + + Clear lxqt-runner History + LxQt-çalıştırıcı geçmişini temizle + + + Press "%1" to see dialog. + Diyaloğu görmek için "%1" üzerine basın + + + + QObject + + History + Geçmiş + + + Mathematics + İşlemler + + + LxQt Power Management + LxQt Güç Yönetimi + + + \ No newline at end of file diff --git a/translations/lxqt-runner_uk.ts b/translations/lxqt-runner_uk.ts new file mode 100644 index 0000000..6b7de33 --- /dev/null +++ b/translations/lxqt-runner_uk.ts @@ -0,0 +1,75 @@ + + + ConfigureDialog + + LxQt-runner Settings + Налаштування запускача програм LxQt + + + Appearance + Вигляд + + + Positioning: + Розташування: + + + Show on: + Монітор: + + + Shortcut: + Клавіатурне скорочення: + + + Top edge of screen + Зверху екрану + + + Center of screen + Посередині екрану + + + Monitor where the mouse + Де курсор миші + + + Always on %1 monitor + Завжди №%1 + + + + Dialog + + Application launcher + Запускач програм + + + Configure lxqt-runner + Налаштувати запускач програм LxQt + + + Clear lxqt-runner History + Стерти історію lxqt-runner + + + Press "%1" to see dialog. + Натисніть "%1" для відкриття діалогу. + + + + QObject + + History + Історія + + + Mathematics + Математика + + + LxQt Power Management + Керування живленням LxQt + + + \ No newline at end of file diff --git a/translations/lxqt-runner_zh_CN.ts b/translations/lxqt-runner_zh_CN.ts new file mode 100644 index 0000000..4cf0084 --- /dev/null +++ b/translations/lxqt-runner_zh_CN.ts @@ -0,0 +1,75 @@ + + + ConfigureDialog + + LxQt-runner Settings + LxQt启动器设置 + + + Appearance + 外观 + + + Positioning: + 位置: + + + Show on: + 显示在: + + + Shortcut: + 快捷键: + + + Top edge of screen + 屏幕顶部 + + + Center of screen + 屏幕中部 + + + Monitor where the mouse + 鼠标所在的显示器 + + + Always on %1 monitor + 总是在 %1 显示器 + + + + Dialog + + Application launcher + 应用程序启动器 + + + Configure lxqt-runner + 配置LxQt启动器 + + + Clear lxqt-runner History + 清空 lxqt-runner 历史 + + + Press "%1" to see dialog. + 按下 "%1" 以查看对话框。 + + + + QObject + + History + 历史 + + + Mathematics + 数学 + + + LxQt Power Management + LxQt 电源管理 + + + \ No newline at end of file diff --git a/translations/lxqt-runner_zh_TW.ts b/translations/lxqt-runner_zh_TW.ts new file mode 100644 index 0000000..2f46360 --- /dev/null +++ b/translations/lxqt-runner_zh_TW.ts @@ -0,0 +1,75 @@ + + + ConfigureDialog + + LxQt-runner Settings + LxQt快速執行設定 + + + Appearance + 外觀 + + + Positioning: + 位於: + + + Show on: + 顯示在: + + + Shortcut: + 快捷鍵: + + + Top edge of screen + 螢幕頂端 + + + Center of screen + 螢幕中間 + + + Monitor where the mouse + 在滑鼠所在的顯示器 + + + Always on %1 monitor + 總是在%1顯示器 + + + + Dialog + + Application launcher + 應用程式啟動器 + + + Configure lxqt-runner + 設定LxQt快速執行 + + + Clear lxqt-runner History + 清除LxQt快速執行的歷史紀錄 + + + Press "%1" to see dialog. + 按下"%1"檢視對話。 + + + + QObject + + History + 歷史記錄 + + + Mathematics + 數學 + + + LxQt Power Management + LxQt電源管理 + + + \ No newline at end of file diff --git a/vbox-icons/os_archlinux.png b/vbox-icons/os_archlinux.png new file mode 100644 index 0000000000000000000000000000000000000000..01e1708d6223b8f3a0104689815f74631c1ce745 GIT binary patch literal 2436 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 literal 0 HcmV?d00001 diff --git a/vbox-icons/os_debian.png b/vbox-icons/os_debian.png new file mode 100644 index 0000000000000000000000000000000000000000..4ca21f3ab92ed41f9cdd76ec02b876eed8e73052 GIT binary patch literal 2628 zcmV-K3cK}*P)9mt((xlBy(zKmSk~VuX#>OR!8d0Og zXcWaQ#$8;&pdunJsK}zAhyr0>!w#~;Ws^m?td}eMa=BcVdoSGO({nE=SEp&4PG{O5 zzBBK<@AIDXdCqy>bI$w3tFOHN>Vo-;uAMr5mj9(}K5f3AuwC5COr*83;D0KcPn+*2 zY&7jn#s9sUZ7TUeKkXfxZ#zI|OWA*})^b$s6?DjTYkdJtm02{Fr`y$3nN4d$q5YYv zt-`+c$85|2sM-`iSzR4fVz7ex!ek0UE|TH7pG>!{a!jtIle>f$Hz0NI$V(9BoG#d=^b!9L5JlSX5P5)zw(L z6j<7eFx*dLI5UK%YsblRb0O{cZYq+(=~R}_*_;D-*je*0)!lWUW<@p`rw&oTaMs<|aA&HZfk21=?O{%EcPz#q{2#OuYR9 zV=w-Ki8r1{zwC94n?7WE=VH+!jGO0SSo=1H_3tus)Cp_Uw*nmx-8l@$pCNJc3I{-M zcjG^(ueXV+6?+uK-^h?Iy_$`*pu9!=& zP#1KN8=ueT?E7!wyXYe>uUbyPx-|rfuB~?B>XJp=UcH$5fPml`=17K*NV^)J5 z4D_^+<-V7(q7(_eXsV2IvW)z75P-A#S(LPAGs&K#$0(D^Nnw?isk@DhE#TGM%1*F=TqXbM|LmH zTM97yxS)ORDfztqEV(>~;=(S@zV{|KTsM$@*@wE^RMg5E>a&uF*zy&LM-R}~)x=PL zyM0rGeQor1HVQ}q2}kzP8si5!m#_qGa{$;J+oaX@P!<*_hv(XC?(?prU-2em0${ng z2~F-rt}b|&fVHbhyWmY@K_<^00G z5bJS-nv6u*X){%^cPPKKpJJbH$T)w7s?<1I6@>!O%Ba};yKUR`U{4#F-kxYH;;<%o zH~_{*`xw*qG1%QEpOX*@JuQWDV!uTDtDiBw$0Qau?p=m6Ff=dp73EeQ06C%i9H+m%nQZUVj44Z{RSQJ;UI&1Ekzt&krh3Xw9~6UiQv1U(9bSRXmV&ci(IP1b zUAu;wlms+=YV@+cHZBTf;C`u=(a;)2%WZd(_qtN~-CcT>jcEG28R%@KJ~feSDOi1F za`;*jAod7EA94T~^g27haJPyADMA*NP*%#f>bsF~Nr7qiXY?nY=H_2l+9ROp6##js z=RrMr``2TxmO(@j1ouPH75Pi;ccbX^E(*QfDE2)<T=)EyEv9h2i)Im|vN{iMUy z%M_I54H;e_jmlaXgt_Vl)>^r*kfxUIHS0J=c5izo&1nu`+Bj*K(Ktnk|3&(fr4qKL zOQ_s2I=#Wld@|ws!-{0jbZlIYj+YUsf-du z9+m*&rN0L;u7evnaWkeb{>+nK44l~7*C8ngrbTQ6XE|3yqGr%2tij?%DOX#0EZ z0MkZ26Qjelmz9!o^bj#?mr~^BOv}~X^xQr|x0LhN%R4FAznaLUA8`4Dw+UP+gUi7K z4giyBdQLWjCAMM{E;C%SK*Sx#By--Rv}22W6+JPY#O`#ZtGWuqgbtHH&rBPb&$BPJBzMNYdHxhTqjU2yA+)qw&0GQ1)kEy3YPWJ&9 zOm#9k66vYw+rN5koCYkq>PhdH< z27}Ck(*k0Oai{R)c8UV8F+MbCcW!&nY&Kz`o^~ mHFo>T2hFoTr~mKY^S=Q>40z=-LBpf~0000aQ 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 literal 0 HcmV?d00001 diff --git a/vbox-icons/os_dos.png b/vbox-icons/os_dos.png new file mode 100644 index 0000000000000000000000000000000000000000..a4cd90c9c94eccd8b1f6d218af7c72bda82f2123 GIT binary patch literal 2718 zcmV;P3Ssq$P)(pgf6+HzFa2i24@N;zp>h14&~j?I7ik-p&($-iY585D<i*eE|bHXh{b9S{ICWX71i@T@au; zV1g>p7*&7~DnCP1z8g^OGvLJD^_07>r^wZq9B*gxgB7GWE68@uqAH+ANbkv1PQ^t~85}~*AvbQ;`1A2;rEF3#Q4X*3^#qJZ3xP97jlN*-$|VG> z|BfJoZ`u3RYASuJnCZ~1J<;`!+sgaoY|9|@A11giU5DGUm2_8z&+oW}>5)dt0z*hL z&qcYjnPQhq?EKP|oy(R`d2kb-o|OrCv1GYWPk^@WosOg!FDAsvilhJ!;(a^_GY;ln z-7qt4lEDjbr*fEdn$h?-ekQAU(5_AYMZtMAXLE=(O=lormSM5ceIH2K zQpN7I7Wm1g?w$4(zT?b3&eId{_yAn8C*61nioMPhCmtfnGmv8*WxQ*gWvXG8iMmeF*OTSCR!_kFAZXkwC0IggkQa3YDa5;kaW1NzN%73vnpqy@Op#_D!^<)` zA?IY}Dtqe8zQJqVN}AGzWvW7qTrCDGM-`VqzD*NDjxcB=*0KCdz^W(?ZL=qN|8CL` zc#|eP3j+EjS1Kzq4404@x}Q_WGf>z?(wVB!`Q;egh#V!)$eo$$0EyiRH9Kf`T|?kT z1LADg@w!)gij?qk3Aaw?62Gw&jisDoQ|J{$8{`sYx*CP;_ayG#jxs4qPryw{Yn3?} z2LB-YkUy%T3}UUL8Bn}pJWozzreuBJBT9_yph9A6WXBadxVhhiPzz&XTLr>8`#@qa8jyEG^yOExNE8bA@Bbh%eCObTU`uw9r zTf{ODHNlAZ>xG2W`lu;3*$PT=mC{+_o#+eMLYN3BQiPJ?y_2-+oQNP)g&86shTa2jc`kR-(=e#^ z?51>!6gA%pikzU(5ly%y5nDG=o)#-*%aXLl5bwH`aMOPiy&;vJ6;l5%1Ybg~m5QsS zk<1;9hmysI-g*L>_lQJO5wMut$OD`y&LLWy+~qmOlRyzHnJsl`r`Ewm1XxR~1LQc+ z6K28TZI;yJBy+J=N%M&^PRrcHJ$@u@ETLzyB=>J}H~t+mEy`#~+bzdJxbAzx&@Mdz zXLre>8_8V%HF=Q-Iag80k?m15+CSo_y%O&(3s{}vqL@&r8-EtCL zEXne;C1;N%NzzvA2%^a10$oDh`4{;|kSxS)Ol9wirCdxF9}T&|U1vQ3_2TO6&14$= zll;TMvYQg}f)nM~)iNaI?v)M47^X9HM2=so_#j@8XG`jqWgK%`#_$;rMlSg>*&Rr! zmjOX*{Apb=L;Ihh^-rK)4xvUt1lw8?X)cbuE+rhW*Aq}Bsm(DXYtwfWM1@K!m7FJ7IO_}GElWo3>Z(>w_>e7 z2>z(OGFk~RaYo^>gLnr+ITj+I&r(l7$#xN7PMXP5VqF|Lb~qGe++qCJxe>DF2w8T1 zy0pg$d4#!~DO-7m*v76EtBKh79g|nZr9aL8eGht|KD?V8yCN=a7@^zbJ<&!n_!^oL zw#9%eB~t$ZS?ktjJpl#c?mTO59Wv*Fk15UmKhkp00(H1OgUMooOi6jH1%#PNEi8C= z{2+=gk;Is!613Wv)>Jvh55-*f1Vdt&0arBDA*iAbQ63mghKm!`;kMjskV~vz$ZwiR z88+w%$g+nFTOE$t=<1v-NRX6A%Z@{ZIONB<-%raz$a0J1yum14;_mt_17tZK;lY^@ z$$-{elFd6}nnA%`LH{-pB)B7MYc|ahbNzeiv(^_Nⅆ`Nl>x~NSrrXoCrv;){Px^ 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 literal 0 HcmV?d00001 diff --git a/vbox-icons/os_freebsd_64.png b/vbox-icons/os_freebsd_64.png new file mode 100644 index 0000000000000000000000000000000000000000..a0bbe1a2e5fa70a7d19e854a80c0edf0f7fd6214 GIT binary patch literal 2523 zcmV<12_*K3P)OQ zVx77j?6`v925M0jiFK)41;nK&iXeyxiXh4+J0!A72t-5J0!bhcNPr~l-`w{eCgy18 zOy`do&iM|Iy!XEE-uvBqe~+0tWA@A?iU0sd;^oPB6uk!(9 zrNls9kz<9b7kNm%Ai#64-vd$a0T&n;1q^Pk_!Hs-PeGiQfXec0?%K?hI8Fq^s(JZi zFc{$D}=TB*kJD5x$yM#L{3f);^N}q;NZZ0KY8+G(k(|Pjj z)xgaWFdkvh=D|Sk$spA3eZ-zS4v8okbwtkIYb8J=5^=RwtJQFJc7{M8Kyh&~a&vPz z3>!9#yXI8^$_5EUQNhS{nS_C;sT9RhdeCMPu>!clKzE2i%K-)*-VCCaj6;;b6XNVg zT=WffVrv0x2LuNPW8S=ZoEfE3so4vx5xu;;pi-%<1c=k)k-TFTOd%fv$qRtIjX?2k zAn6m}9Ho9A1C2XnfCSuIJ{sX3ZYW8QBLO8))=Mk`{@Xe5*kvJF1F78-=Th3gA@V&y z3E}R$=sC(j<;tLGFJ*#!@L=U=gzj@iamsxX@C>Sk3X1^tfxiSn7lV+za{+Yc#sQBg z+N`gELRUcI13aZHT&1YVcnW6*jeE!ktqq|;ET6$W9N1hB-|wdVl=5`76F>Zs(*`S zO${2Al@NvhglwlNFkSvFpZ2UZgOPg!FHQquH{kZKVe(;6?_?3sN&;e*k3op5GYTJ( zd21!~T)9O+3lY2t+Lk)B5M%|}ND(+e;zsj5f*mxAsOD>d0*YLG7Zg6FPEV#aCBJOy4pe!R1O_WV- zbDc#%tG2-k1+L_gR8I!eEk z{tvLT#bduSs45Ynm9oq7nFZ)|jaJZVDE);(WQT1_YpsM_FAH6XFxMW-cCa(ef3aWT)hez!B|GkU;mErkisTD^2wiIr`E_!C`S(-~D$8Z+d#bZy$6)GR z2F>Te523I{;}NoBJMv>9(O4%#yH3M#nFVxqXsyuE-U5AF6Iz?djLI5l>Zu*;t5K1j zg81FvqArBUE2!r)$dK3Gf`OuJpp@59+o^W(sn-tffEvm~!2Icm@%BVH-QU_&&pn^z zF$*wsw!RUa9rWAKMmK07c^rpScSkhG>?d+^e&!P3`cRl?->Y1B!)eHHE$;jR(o^jX zG>(((e}#*yzC>!EKkCFqXm8V)pKlgmH0WN3Q4dpB2byZ-$oBgIPd(Selt}}pocca( zJ`ik!E+SV`gjH1ccsm|KbB!NM;@8Rl(4M+_*kD9`KbhI@SDFxbPfmuMN z*A5h)_$O46Zs^UY$yVV@#M`OGXyHVR0nSrez4#5sE}47>27#YUVQ z?P>O8TfUvv>XPB`n>&q*F3#5ng)w)b5Q~v^a21pkdGzw%An@}QoUp=ZGG4VDCPN2$ zdQ7juA|Q`WzA1m_YfSED&-3g`)zDU}qjXnNZF9eQ3)en#i27BthaaKrD3v%ecw%pZoAW2o6q}8pHUGd}_x*Sh;E%FL2~a5gl z2r}3Q2w1!T!Rt2?u{)jn&!Q+g8g+$*(9y}b+h{<4Umper`Z@IX_oJuFgibAu@s{S- lzJC*5NM-!X>Hqun{9n`CzJN;&$V>nL002ovPDHLkV1gP(#eDz( literal 0 HcmV?d00001 diff --git a/vbox-icons/os_gentoo.png b/vbox-icons/os_gentoo.png new file mode 100644 index 0000000000000000000000000000000000000000..1f8e8d8af9842b9b5b746bc0b56f9a4d4f22abfa GIT binary patch literal 1966 zcmV;f2T}NmP)0PpYc^gONt_vETY9I{h#s+DdIj5;aTPkanVO zO4221rNw3;s+OOFJyeb0H$d7ksW zzVPN7Z@u}~zx?gPPe1t#e`X0xfqg;zVVR#q#Ao?aOJEA@3xZ8-*Y-bEG;n@J0#-!) z#?s%51zvrQz*Y(Dg&coa@sWxI>~Om*ur8S}`(hr?Ctu>l)JrVREnv-VhS$AJ@~IOyZg}w3S3Z3Cr5D$) zyKwpPGOk^l#g9MCz-%&+j13__N$;)^+=;!@XAKD?$(Rap2nZY0S)+u(RVpIJlt`Nbh@IsZ_$PmU+>Nk3Tl!r=K$HRz|A@wA(OpbFUx`27Kay%-QBfncByzqgNd zXB)Tg1aa~5tWF@C_Uo1MQ9>Wq98Pw=Ozs(@xgA`ZkN0|I{U0Nl0C+K_bugyPt$0N~e30|*+P*CQ~^o9h&LBQ|p!$So&Hx#U`8VD5g5w!}e9ghbWFWRxZ zT&L9ia|tMlZiBF3ceji6^){;or?Ux{tBvjL4tzd|1E>rM1dIe61_I?`obtu!UlhOn zX2-2tF@Cv=^IoF_YBfI8-ND92n=4x3{+CGp5O(_sHaA-c1SB;Zh6LQ_5U7+A9H0a; znJ8}FT*0G96?V~~*T1ho>r{bYuuHHuUc5+g)#7;mJc+rvED4pcwNu+(xOXpsg@t3v*hVTP6Hr$|(XxPH)NBm4K!i~y!_GGA z1b5(_cOK&HxBrc?v6pNli+D^K*#a4k)vivUc9`QHXSs4IJb38D)oU)sXO4c>u)5mj zkVy=io|*y5$OfDk;<%9SBhIvRI1ZTowBvCCK5tVULJ>qF2e!8qYzP8&1A*gOkq;@L zRLa8R3*(b<6D17c!Gje2EW&21)5{Lmva1pi;93S8i6mqORLiGHm>VRaI1fY)h#-oD zxGDZVydDzRRG5Y`R&53XC&y)mNts;~kYt2S&u?RlUVi_52*3Wir`FtDkt^0vcRZ1h zX<1JVpfiWjX$p>pkhTFkVgp z|6YuTQ3${M62a_jj{AP1+Ooedv+KTk5E;8y&w#>vSM%9Sc&`#IeH(TRzhE_&Z0 z=xe}*^rx2){SIL0UJM_n-?A+6uF=s6bUKY!tKHzb)luV~J$|x-ufOro^NtFtT|DyH zv*5-HNa!?rcMRSeyI+_$5RjzSE7j>VX+@nm;AbXy5s64DxEMCkwHP?fbFFg$uC1LW zy?g6)@-^>8_X`~oXzK*J-S(N1q&6*R@Nn7X)cX;OcGVRd0&78&)IA>sAKZSFq4Xkn z#N?Yz9V{<()WjSTkY#CD-EN0-(8BagkU`{C!H1yf0kGD!kX#!$A-fS=_1!f{JrTQ_ z^v*SjiQ7}pmmvW~>8d5mT@oP6r5L{b*28mLQbE(Fpklv8#~QHKwH7vkA-IAq4gA!1 z(Y@c_rLBD`++(aC4G4%Ih~Z#_H(rG#WZv0xypU{RH_#pe4nc*_8nB^jG3{dDRL_O% z25^yh&b6)@SmG3|)jB*^N_hCdIrwq<|NeRYU#(EQb!tX!5dZ)H07*qoM6N<$g3w91 A#Q*>R literal 0 HcmV?d00001 diff --git a/vbox-icons/os_gentoo_64.png b/vbox-icons/os_gentoo_64.png new file mode 100644 index 0000000000000000000000000000000000000000..14eb242443c41890b3458e47904dc5985b2e058d GIT binary patch literal 2077 zcmV+&2;%pNP)(`m{yUxA74s_+HFJ@1 zTU#53hlg?c^ywx7ckc|~+O<*K_}GNox2>#@1D}3s$E{mtT)#e!n>YLM)#E;lj*O7Z zB)m=|{O)Ojo3P}cL5R^rz+f=oz<~oebLI>#UAly+sVVgI^x)jNbMo&ePMm<*Y*q=p zdSQZPp@5~u3RYKY3}87_gWp%h!n}mR!7X%l`blO2pM27bpMM_W^#*ucCIq~*2nEc| z1V%?karEd>`Td0p7tqnsf#b)IalPXdV; zD;WXSNG7}tECxW(5?;NE;l>RkZrA%W$kItjlIuv*G^`7*+a=y3nD zK1@#On+b>sc>MS=&YnFhH>200*LdH z$Qt`6Tqm#;1Og=Ban<0o*Dzx$p!1;zSFiUs2>co!5CpPW$W=(EH8RBOGKiiChZ+RD z?iw7nDkTw7!9ahaK|tK_zlqMzI}!A+v1&kOw_b(KO;#XYBX~`&fFeU^5xllez-h08 zn`aoaAq^c6|c>t%Q1}iHtH(TMoH3SkdzZ`Lf&1%Kfs|JjZXCO(nwKDKdKNxWTevp4Iy|V}Q z6G*3dQ%e!EvjvWFiu0c&`7Qd&F6QR)aJeMe8&m?8cMwP=Lu{ZB*46^Jdv^jaUZj{s z5v9_rX4kH{6&`Nda z>RM+Od44XxO`t0F22d=LK(5{cv1nB;cXxLfAAK~8_I4e<_+o*H__)-P2>9y+#25+! z=KVdewXsGLtE|8hZr{=2$&(Ow!Vb$=z{*OQfQ?Fs>`PRqSfF=g>r)`iXl;#|&1DE~ z#0MWd$NTSpkJi>VOeBKEU}fJFlwq7IH3+1)qMYLhU2p}@o}2LZn`YW)lzOJQ6AElH ziDpwpg_(Wy*#^DKs@MG63{!9%! zIxKklB#5uS_Tt-b{pjzHa^81kS(cZ}%(^BoB5n5a9@uZgivDy!(SVZ^8UnfOmK>SP zCg(bZ2$zoCvxJxZ^Y~l)8~mkpgoh0a9zAm6;X^yV`Nj#IF2RK*@z7GCk2J4hC3|@j z?koSSC_nX|&`Avf`P{Y~x$HJcY*FV8tVQD_5yGI}iGM!Qb~qXJ3yI#ld)cY-I#_zA-|(WKDWayx6MjyAr?=<6I_L1&W{)U3;5$- zU!$Ei?Q-S0nrqGAYmE)~&g_-$=lJPa{;^RlfkLJ^^1JNv9qjIIV?DKj;Bpk5Uzu>{ zu9@2B3Hl4*qV#)*kj5E6lf7s@cE4_1!pLy3L7-U7z8!@u$1Q_2=j^AKHhlKEm6{i2 zQ03qei!_644>$PdL*JeL7s39Op`M082%u$LAeZWaiu*2_{WN^`JB5Tobisnk@ z0$dq8rSz8hz0Oy(7ugRLNubamP%0IgLXrxUAj{?AX4g9r43y*%Q-Kwu2{$y~4_-h0 zRMgT7;}M-dI#R^=SW$LNl|Z>HsZlBw*#~*__IYSTb{Sj+U9AHvS&Nb@4JXR31($U< z*IiH8u2Oo_v_!|P%KJqnP^pyUD3?nlK$c@cJa}N`9+za$)jd!#-y&lLSjk#38~jm;M2fn*+TS3w0-L50o=uqJEK z?V{mi%|+QY;KK1t(7bi`*+oJbz}YKb-!*AJ6{<{h)q<6tC&a00000NkvXX Hu0mjf%!uXM literal 0 HcmV?d00001 diff --git a/vbox-icons/os_l4.png b/vbox-icons/os_l4.png new file mode 100644 index 0000000000000000000000000000000000000000..e51f9058f8b22c732c644eb4acc9956039856eec GIT binary patch literal 2104 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≧`7d2djFYoI59f&Okd9afmN zwMYqD0hgLN_h^8DGDZ+h`&sqn%w_K?=#nNPXVVkNSp6ij){cWE{{@KFx8Tcs6+*#m zNF>+XS%U116S(GQ$X@?Tw3VD4xg)w*3%3110fVmI0Avw;z3nKxatf+z>quO{DaRD_ z+yhJ;t#$0>Vzyj&2s*3AqenFs9c51=d(|_jIzADCV?KnU*$_(>P{226FOPs-eG#n% z2avhqS=5~k;SgmoU7Rhp(4c^!K?l(n5YVD;Kt|YNc(hbIkpGX?yF6mQVof0bqGBq< z_9xjHV=-VEkNmacp}PDANjH#u9;EVRfbjtLb65$q7D}R*p=_xc_pMa8$ z6Vaz$$qR_>S;Dbf#h$O{C~n^bVel3jqvxaai^*^rIJWyaw%fN*#P*;7_wWFQhx-Ep zYSQ9Sd!7;4u5!^e9?GK8GWrKRymS%7oHrnpKMm127A?uop?uRMbQZGBJZvvrC?9Jf1LX6(rO-xAL-qRCp$vTs^@c1n$`sc_n4hq=-$r;J0 zPr{}93Ing+UG?u|EqSzo2nz7~ zy@ZD%-0TJ?Z$lGm6j``^YA-IYoWrp>6WVKYF;Ki_WU^V9$4(Yz$5+fHQ)K3ZH1VcW zGgW536ST7)%q+AHwrvMTa2qcz3%kP<0n~@gkhEkLkB_a84G_IZ4jk9Y* z5VPuS)SdefL%f!uXL_{kZ4CvfSzv04YFx*Wy&O^v=SIa$l5;}lO@fg9BEfft+;>I< z$UhLZ8XY7_3_=tk%0hgeK#TTMh|SuJX2Sz0Yx9to{WsjcbO=#v=i%nk-?Pfu`??(? zLRhSUG-+sm{VG~b7s}>9EPN9}&Pxz7UWAxF6}oR0j{G?NfB!uHJHyws%nc$u=l}o! M07*qoM6N<$f_O@}QUCw| literal 0 HcmV?d00001 diff --git a/vbox-icons/os_linux24.png b/vbox-icons/os_linux24.png new file mode 100644 index 0000000000000000000000000000000000000000..c403ba78b2a7801b9a3c003d5ab59d2ebe74b83f GIT binary patch literal 2557 zcmVf|1_+LWg6uD=KA1Vsdp_Y}QLn@;5zl<_J zm&hq{&l1&W6_wD4kbhTH_@S1Se*<6t=6{b|BB#jh7obztd}nCetGQ_v)ZDoJdI_YB zxsXcoplBGeG1ax(_{actjTVXb|`UMzC zZqP}frG+XMR#Ry*az2Pc;k#Qgt|6H)L1GKwB)Ox6&ul(ZfXM`mw?-pz>oR105d&#U z0rdZzf^L)aU!u!+odVimG&G~Vr3BSUpCJFkgUC9(3mNZ(p@77yYbW6zkOMvk$*q8$ z1k{PE@X4DYs4V>g9g2#8fF85_8|XI6`~vjMaru>4WFJ@y zN$eXi<;Gx8k_?-^4!&^{;APZaJMA81q-`Wk2P`BuodAr7fF8nnltNCzYluQ}_+ng( zJB(IIPC!6!cl$TcO%X=gU-I#B)E*CoL!HLx^duXn)lNoiBPk%82W? z0u`%)q97pm3F2o!>BB(FGN$8At~<_khmpQ_DK4LWJ0M`7Uv~pU5oVJNxySdRzb1~h zk4;BzV~&TIif%@$`73RvwT-m7YAuA4mm%aYhA-zy2pJ?!y$eXY9mu;Es9OlAHvt1& zGkOw|3(FC^drd%qb)fSG4D{*Hsc%I#C)${TMdf3mIXjudd=}M5%kx|m z0&ngg;LUs(p0ppsn{p?-$+tpCzKH_nQosXD#WQqi1JE1I4mpLc!Z4g!_k2LWu+=<+ zA*%_4{RS8`&B!_!hDm)99T1~ud-W&K^20#$P6*{8@a8RqJL4ftrTze}lsT9psXKW# zJSn%pmwE?;Oh#Y$7*NBM$mxKYsTw|kNmV4`);t{$Ff!a7z)+Xp1+B6HIh^ON9#*%9 zxgRa#2JC71enzyO&G50+eI3E~5KOG!74qfv4fPnF_ z{uziO1}UK8%6UlR_b~TLj#CAzmy@l7t<pD_b0du7rZm4_} z&>!=Ym+t>1vP0*>TouD%mPHpL*b#>U0w!(4euyGQhI>#McLs|1?If>OMc&WwSGfB^gCC^6y}VAje}5V;yI^*IVC|3~XxnzmmO=Fh)RLW_I8$Ih68 zans!>4f`Qvmli-6-2q?Ca^`(4NzP)V<2-62=A*0p5Gr=f{#gy&~2yocP zVYiP_z!2mW1!y?6k_yGsjFI@KHHV3AxpP+8%L+GtwzFllD4aasLtKFWD ziOxjShW`r6kAk83EEF}{9)bMKaySNfehhJvcI^rXaJeSoblUs^6m_L2ihd0~J@aKI zxt?vKVbLhwg3!DgzWS#i4E+L@vis4n{SoLB7Qx=T2hRQrJgXF}jZ-jJ#_&5ObP4OA zj$008>`SQM_8Z8K1;O6K3(6qR5W~)ZfT=0FU&N$sgvW3P(vKa0xZd(monD>II^AyLH zj(i4#HQdXY071KhHMKn;!0mRzJ>~GbFg(-?X>&OeBetU8?WGthWZQM@r4UXr-98H0 z0bwi#j^5Ll(7aE4KzxKr!)0EI|_q)icq!v@wWdb1~HMuVSK_=e(L?OgxM%EX>~bnMLr+9s*a}PC7y{Dz=n7oJGpH(MCuK#WtpE6S0bs zz6f8-pW$tI65i_Ha!xFOuWBK?<%NI%pU*o3uh-*uL`=un=m2j|1#`6mZ4>O)SQwk3Q}@>D=DgdJIU8`AaQOqEG9W8WZA>;7SAJi zXDEGcT7dWmQLWNI5PSjneDH}v+%A8Mj#J1$Une?s*CA~!Ls{{cxcbQv#BN)Tgf)MJ z@fxpOntjtkSgigusW>%dn`!k*2z5c6j!$t!KMHTbJotE4XueuG{pa-m{rCLuP5Q7T Tj~3g400000NkvXXu0mjf8cfTZ literal 0 HcmV?d00001 diff --git a/vbox-icons/os_linux24_64.png b/vbox-icons/os_linux24_64.png new file mode 100644 index 0000000000000000000000000000000000000000..ce98c403f7f6f53e8e70c7794de83cfd0c5288c7 GIT binary patch literal 2679 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
bSVOjxdfW;yTI-t{?)V`$LP0 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 literal 0 HcmV?d00001 diff --git a/vbox-icons/os_linux_other.png b/vbox-icons/os_linux_other.png new file mode 100644 index 0000000000000000000000000000000000000000..f770ed6193ec6e54549bf12497ec463f088b391b GIT binary patch literal 2545 zcmV`MYvmar3`WeEf!g+c<^$iD9+lXa3wX3I<_`!?Ap$!z!D$LCJkj2zSt?NL9x z=T4G)@AG?~cll3-O!)Q02{YfCeetmGar`es)|9n}$RE<;!=Noqfkr7u@_#u}Tw1cG ztUW}g(W}y-lcVhGMw%_LQW^}v09U*zY6LqjKIarxOnfNEpme-6W!QQ!(wWxfl*$d~BVS;z>!govGM z(D?8!;H(8C6R$;pBOS0sqgQ(l;ok2c*nb}iawDK)8RX{&0cxv?|83M%6`{sh!K}l@Op9CSw803zLu;d>OH4eGz%+BZTi;k2nge?;eMvr3?`JDQ*V( zDBcwXbOZtImw5FDI?n)Y$Dj>bg3BK+LVEHoXjEx#fcl!U$D*#L)CFK*jZ<&<

K zQ21{`b@XYpDnei})^lL+zoq=NAwA#vyEfi(OR@S?h4s>TwCdL(c+WoGe*%``tq52< z9iey5x&fLSb&o_-gBEoJNWOL&6+wI0$?R;AS=*Z^Tu7T)xB4+&1 z3rJfEB+Le)$1{EmB##9OXR;h0@;N^~cL-tIX5iYX9d3Y@=E_GxhN!77MYP{`G-n0S z_O5}-qL`zd8stiSVz>U_WVpEB1G;0-W7|W*mly&t5^52J)z6?^r zpCCm44no9OI77b&;ofivAx}XH8A^a>2=F78;!V1=3TW`*gq%Qa{Cb>OIm->uZmt=O zHgh#vn~gB)3J~eL9=(PHIv{7y@oK(F%MSqsA3#c71R-V;9N|BO{r-1gyEhEhyF+1* zcnZ##;c!O1NT`>9_+J58EJ+z1s9~wvkD*t+2La39a07I-*SVvu*5!h}A{SBI=eBxw zx0AK+OyLVS(`7rEktc-MDX@o);hy;>`a_<8m0>Sr#4y4kz*#lG98w&;| zqKXaLdIVDQ5kzmB>IUfQXdH~r_6C?+O;F_~BH`d_h@Ay|8SOWR4>VjMtxxuVBl4FN ze;R!uLtxJx24@9p?)(YV5u=c}{Tb-uC@dT&G{;YWkl>pD!!|Y{KX>?{GQ`sj(B0KM z7&1gF0n%<GGTzd(3 zW(|SrHnT?(EKR`>Y&l#`+=j-F*h9OS%*Sw;eB1z*99IS+MJ~=}PP**g~J915a>2d>f@#pGEBI5oj)+jN0_+2>a`kXvpbM~Z>{6<${85Ndb-fe(QY~52I#f4yF!NOXs<_lz!|6lH&Qr_TaG0#N06SYwU{qp z=L<0t3Ggi!fYUw_*}gB}!Mx#!UH)Atj=qZcRnH^eZ!%(*jzHA>VaPl5M~H%g<@kUA zbfJ;Xw(NET^!0W!I$QuX`ZC1rSqhu>JONU_7`-b4_AAyyO7Va*`WLW;v+F~jgxLNA zh|V|BTKZ=c9)At-%SIy6^F_ojeI7-pCc|8Q7=lwi8QDX1G60ikAVkx4H$Z=1H~RXz z2+)SIv^eCRSWH6sG-KvXH<&#)SSdGM_9{q;(+Myd_Q;{IMGWJC^a}dh=Ab_DFUa>D zkK`4jk+SNCNLeuo1qWY8L+Tb-+j%70qY1G23kcbTZEgT-e-HZmyIlZhL8j&lvqi0X|4rKsKN2C&(BVYOOZ0IHm1B={_VXkg82C~n~5(Xn$? zTObuIg_!kQI8$DLBZ12%ZWJ@~M0NNA6zuo|dTXzuDcu)o3&)@}Z#TM)2axYQ0d+CV zSh~YKz-?&cLNXAdYKt4dZtrtJ^jbQ23~LZ}bQct-JRqsLIt}|d$Gaivc0j6F53zU- zgxm=bGJg&s^%Y3vi`WC#;k5EpLVctO%HVlQ!h zYu3=!O>O{(!wQGJ-{nGkTLY8@sR-Kbg}5Cv&=yZ(4M)eo4OmGC%?5~Niy;=yftdF; zr)w_zgO=)8CPyS%GEYKx-V^3r9?gPW#*L7)yiYwFl1ko=??NhB%naD2)ulW`&j@ zYPwRoj#jhYIkO?A{~kipI0$hsbCr*W?#|+Ye@_43|DOK?!%3tU|B$Xj00000NkvXX Hu0mjf4xqpc literal 0 HcmV?d00001 diff --git a/vbox-icons/os_mandriva.png b/vbox-icons/os_mandriva.png new file mode 100644 index 0000000000000000000000000000000000000000..8af984c191c8ac77d10d2926a600f98610b1d13f GIT binary patch literal 2207 zcmV;Q2w?Y#P)nl_oq1Zc`MluQE|5=fdr zF{D7kmKd6a)hq_%uXI=bm%_La7Z7a#6nrjT_#3GI0_pES%9|d5d%yH} zzzy)67ogTq@C?ewsLP=^D~8BTOEIUNh5mZ5-i2~M3B_^=!+Z}w@)St;jR3qf4Dh0a z;RP>1y|M6_R991oQ9PoKy+VxNB6_Ohpw9%RF-Np>Luu@fXW?^vj|l0iu?ZnNv{dOuLa=cVf_kXCwT!H>q?(l zP4yZys#wzYu4bsM9GY)P4y^FR-<^O{JS!mK713`+0+ZnK$m?E!ruwpHRzqzm%EMbR ztFM8xSmM7$R=`4;{cK46qX0~n5WFE05Tzuea+*l)Cr*0|prM@Rh6OSpxB=$8w-f02(VXH&u;YV!Xblgrq%d zaa1Njr__PcbuxP&PXS7wDH4M!InR(}RLhFUlDtsM^K`jRndt>E8Z|Pg7E7~k%xY~h zkb5%(&6Pc#%r~Bp0<=_&eC)}7wN%0^F_tU$3Vj7`y;RDt<(*~25Oci%dc8<)|tY zADhH@ZDl^myT78ZsSxZ+D3S`8^NA<>U6rut?@-|{V8GQ%rE{Dssf?zJ7~QrV0XmuRh*im44I@* zwFrbZ&{M8+mUscGv>KU}kv41XkILRwkG>#-^n>ep&|wfGiC{Pc4N?Qz?ny4BN;Oo_ zU3v!XwJ*81`9040OeKBqM?7+QqFJCTwh8bTUVw^94c1oA;6J9e);dy;@4}oTvwLXw zEWMs0=>r)!E3Tlsxrw-~b2-0c8b?2y!3n>Qxp;6D7gv8kMVRym+ZBO54Vq0}08M$R z0MyfNZ~CutILuU}#gTVLV%u8_U0R$~QRr?35a%z3K7EUzzTj4fKk<>r zP$ga_Ga;PYo0ia=Bz2>OYGWt7|ch8cQave=UqO|6G%ne$1j<`J5W;Nsc%`N z&n))>>^~NTzQ#aDhZSeH{Rh?E-G)t)wMLtdt}FwSz7R`OHFjHrgh;&Pg6(Rf*J7c*YL2_~_OOI#ab2^XEa3w{WasgkwkuR8CF}1`@7!Z?_J>- z0VwE%6H(P{`Bot{p~f?~4A?go^>r~g(2d31LU5Rxug~S;uN!1dx|QYYuM!cHLTQCo z!rS)5m@bGB0EJE3csE>3tYuwb97)O&iK(4|0Vf0f-Sqc8Dc8NhL8lmYN(Hr|h%IL8 z;S_eq8Q53*hz(Mm7X@XqZFe||q)cjR>%{fqrN_o_osR$nYGvQh0X2QHPpIr<^QjyH zkE9TvsKI1x7I%ruon3BqIvld5Tgl7Q6M8k59mnpoKcbv)Qx6AZPx`s+$TsBIndckE z+0ZC5a*JuTT4mNQaOV>m0hp)44RNnsn%967sUF!ombSD1S~>p5)$BQ;;>Z~l$IfPO z=(LJ`XVe5;E9P2u6LFRSuD8KP`F_#Az~AtQ1-p{i7!XE;B8{qQqvTbm80-~~KB*Ca z$qJY&Tl%#n5Zol~TEbB~B#rEWY;t-Zp|cNA*3wIo!>v|` z6hk-UcuB5|DUlXrQmg9n4I4H6A zQyBPgWhi@s{y{{nin1yrj?ON(p$88JN0l4E^@F(ZmVsZ${^2?K&-_W4=lFa$Zm{v< zo$&%TK{Qd`c_|WJ6~Ng7wOKrIs-~aS7xI|DDujI}Be)rpPGOmzwswcOd60(>AB-wp hRki2m^#A>P{%=#8_kZB3Hgy01002ovPDHLkV1nE`I(`5E literal 0 HcmV?d00001 diff --git a/vbox-icons/os_mandriva_64.png b/vbox-icons/os_mandriva_64.png new file mode 100644 index 0000000000000000000000000000000000000000..04b614229025ff5832e031ecdec247f99d29beff GIT binary patch literal 2403 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 VvXLk@3H$&6002ovPDHLkV1gL_gI)jt literal 0 HcmV?d00001 diff --git a/vbox-icons/os_netbsd.png b/vbox-icons/os_netbsd.png new file mode 100644 index 0000000000000000000000000000000000000000..bf680387896a11274ff6c100d9ea0c84d519e6f9 GIT binary patch literal 2442 zcmV;533c{~P)|P~^S12T?#TaAil^eOQeLRf2UD08M?t2d*#Ei|FU3>w zRw*<^Iq~QeW&cvC2W7oiQLbh{IzY6{JN8*k2p8K5{X@fRw=e3lewDb7!%AR~^e z>QIt`Jcv8t#QB4}h}yq{^9Obk>$(qZfGg>-f#hAeATXLifYQQCKTieLQ+L^XGmY;t zf;QQ6^0k?qn)e7HuZ-iuKmLqn{nKbS+o0Jzj|=PP5V~>}zHiLH`^~uoY+OAEP+pYs z(^Z^8nVcCCY3TNk@p^7D;WO_g(|!sK9&71IcEwZ{1+{Ua7^pcXiiUbEv=m^tc9q6N zcXIbG83d>(P5W_`SXGuzw)QMR8`t7F>0uJ4ji&-kG#GO4c2GOM&88Lht?-t%n;fAB%-Hf^FWH5G%eC!I@Y(>3cRdKaqbU#Y^h zQ2@MOfWkoZ7d=VXumm@o$sAqyEI#X35WaUSaUS217;u#2F!w=#jM!lEQ)4O0N-!%g zIfm45Kcc?fhR?j&gx-HIrM9nNjE$u?EDXKP^EBT+68(KDI;W~I%u~^~=1z$C3}bpA zX`jD^%k0N-wOdH|o-L@o_se9skQ(XD)tJ*{X+p`pbaoIRz-}(5md)ps-OHR>IuHNF zPZ4hW5XsBNQum1+{gGjiltj2|AFZO}F#)g}193;uM>rF-@JWum zG@CGoPh~m|m?Kq8bCMz`OpB#BJAu;tOO)$U1_Am?wRC4j(Vi4YhxRmv^Z;}HxON3e z52nvP#Q4Aibcpc{kr`m5ik7p zFnK+3G)CVeRBf>3_+Q84zu6v*k3=2fK}L)$oJ(S!nLvdujhc#V>T2?-t1aMKO@W++ zLjbe~;PMeU4@2xe2$2r>6xG$QCm+cIE7SF(U$t)?U4Ss)LMBoQ2iT-XU8S)IMD$bz(2LK5Y?WOMp;E>c( zUPtTzzh!V#Mr+G3OwUV`{Z>V{7`Ivh+LkY;WA_fC?i_*l_`8W;G?m;>7E^ureVRgc zp^rO6YvKu7;@xOC>r9#3CXzpWm7v$3;na%Ph<80W1VFt<0K_~=AmSw(QQyciv4<0n z!LE^*mI%Q8DtZ)Sr3_=nU^si0_N|-IA3umub5^bo7kD>_6!?%e5d0>Di{jpgG`WA7 zG;%{aePsz$`F%sgiWi0e#O##l4_dO2AZN5(5WEq*X2HJSV0uRYCP}xCP|+>`UF+A= zm!D7faThw*t)kaAkBJcYtiZer`R=lk3o$j9 z3;~GxT#TJ80EvezeGn#}`P#zw_h9;1`e3?>-dn_c_;A{%Pp4(V1R6&Sr|D*uc^`B< zE*Y{B&{el$+Vcbit&pI;k|~maa-_eqkILG35GVs7f9J5c-j|3`!q})Xs4B zYd9@8IX(f?7sKhFFO4{Aunf)rI*!kc!RWXO&K?ArF$6gt~4(m87 z0L`O+Pv^#U7=2_B?N~*Q?Kr}px)qP<_v5zUX?#|_LGYIKoOAqwxWjwUxH+TsJdD=s z$PfUJMbbQ5r3}v2J`j+Yy_Ru2`63*+!!nMt^^7A2r=e}m9D0r&qhZb4T%7PbPCO#A zokQ3c8%cCONP6f=a-svtS4W`J%1*c(OG&Dl(liZa=?Oys4o{PsNwn(kEEyOW$1i0Z zm%=gYIL?wRNFNw(z6Ha&b#ys7k@Ck$93OoTUUrKmLIRw%p&)uV>zRO7Qb0IG#gwhl> zwFMaxVKFV&t7*G&osQOKI@??5>d@2Gsi@Vg?k6+vyolhebVu z8q9!3c0h_e2XaE7G*SMClc(Ud3^_AoX4TZ4aX`Cv3SKitbJFe=5~Y*#E(B91QP=6R zX{oCe<3@9Iiix48(;~x;>2jGvr;7LBH9}3=xWznj167%8oKH2{b?EiP#@S!FcK-E3;??ZIeNWcbM%0H`m@ zp(gtZmFY=Tq-rP^DQ9I`B2^iesm)0<|4nmc39Z*_EykTzW4TeEv6sHSpRWOcj^+m1 zqPLcC=#X?lecMnD+M>>F@9R#WDjZKM)IY^6BmF!q6qn z(J8f*=**|QS3Wly#IRQ)wHliG`!SjRGwBM7EI&^F-#^d)397dqe~>W}tN;K207*qo IM6N<$f&mGwg#Z8m literal 0 HcmV?d00001 diff --git a/vbox-icons/os_netbsd_64.png b/vbox-icons/os_netbsd_64.png new file mode 100644 index 0000000000000000000000000000000000000000..83b9932d5b71e7738e09126d8a8e123be61f362d GIT binary patch literal 2499 zcmV;!2|V_RP)Ab=bpP^ZWeHnbC|L^VHZEr%vCu*>x-bODQ%L+Ztt~w6v7F{VC_JbpD*g zm|zMo#r`Z6<-`$xE<}aUC^WZ!CXRfXf%u-J(}B* zx(#sUa-t}StA#qQ6eLlY9Y5@O&WzyNi7@#4j}ySp=Z@L)!b8pXhY1L@ztKMoEK zc7ULHGe{gif|{)^Sh7yRH8GIs3um0+0dXnN6EEk(HH2a&oe&zJ2?u=iCNJdv_6*oK(8BL3H}9!m{RfSXTFf zuQYIQxPg!@|Je7_?pa6hTxKHUI6XAYz|K92Dr4W@A#%+ob=E*}VyU(%5oM8>+e@qA`9 zUJGXuv26|U{yU^IJV`(0Pgcwcal7dbVYhn;o*$WWJmnoTR@!8Hc~xnl`ij%D}rbj=@1hZLwu)F7%8)%KF@Cx*~* zbRUM5vpM+Z5gcFbgf>9D4)rBFMh4CWF@7nL>-r4Jujf)#UO-hvA(iEYvKI9K(Cw0W zyHD1=(vRCAR4UkiD(oD94oKaDY9Q{XcfbaHh^1;7SX(ABWDIW;6LI45@wAf|Fb!i?fsCt(9Ia* z_RyH*O+&&VYEFAldPs)X7jp@o|1>`=d5r|G-8}%}w+Vn4PZo#-iN=|4WtcdD_bAxh z2g^JGcvwT5VpvJT(4m-5pQdT;YK#YW)1f^r*GCBaAvh)Qq01rUEr<}seFzzH|I%=% z$)vM15yP=>iCpqR4}h3&#QWXWC?v`nB^QLOg2Pi_dw(qN3V@?jyMu-%0ccsVf;K-t zS`T_+a#=?6D}SP8>Ojo1deON==D`XXMr%b|WG?I(1inu|(6a*b9u)YHd9*}m zs(>!L7t6LMA$W;6wF$Dtp**Rt+!`I`jB_9ONwW$q`|{h2Lck~Zf(aSFT$?-tnDaMucJ?QH{6;wjkW^^s9F9F=SL34 z`!Uh%X@qZBMUu~MGQ*CL7ZpT7d?b3E%!HI!uBOLRlA)zEGqDH2-tm$%@izWDYXt1= z_?5Kd0yto6$0-s8sRMJrdoa7W(6VzUX@79!;E)G7yl{?q=tfqUKbK?Wtx6X~X@*pM zUOE-}OH`NSbMtx;wT5D9%dS#aUeW_#o6Pc~izE$Otj3dVb)d9k;QO|AbikrK^`3kb zzTHCO>eYlja6g`Zok+}188G1i6r7KsBt3z$%NbOc7N|xVstp+HDrx+&np+JuG#P7Y zYOGV$4e-^kz)M0M>1xftS_euy%74L9pngwFlpX<38BWIzP&IcB0S^q4{JufjF;6bX zgi?|gPeoz2czA_|n`PYk@g~iU^_ZF(XlXXmVp7zos+#tb%zR?*UAv>Gg;Hzv-79R z4$xd*!!5b7vC=?8`E}7XbyfBigH3hSR-?_0m|IP%w~EoO&JMb|I)AoQ0ObR*Ft332 z))veyQXD49rFf^VvacNPFpI%<@ziF}($$5<^502cSZw_`{eOR+{}Ui+`+V0i9?$>) N002ovPDHLkV1l*D$fN)O literal 0 HcmV?d00001 diff --git a/vbox-icons/os_netware.png b/vbox-icons/os_netware.png new file mode 100644 index 0000000000000000000000000000000000000000..5475ea47a3b8eead1eac50928f39781c08ae261c GIT binary patch literal 2601 zcmV+^3fA?BP)Wd9 z-0AN&GtYdc%Uv2?{ehGxV1IfO%2-*J!Qv$_b~#+M|gg#KkQWLG}NV#8G+dKK{CSIGYC z_b3pBqve%!NserG8EPR7yMo5YL2wnEhAQw+5QhYE5~~;+MdEkRmgk_`RL6-hh04tP zNcdtKBDSx^mEG$Qab*vRvm()^lW`eyry3?*6$(!O6^L5{MEwl7wHh(oevK!0&p`7c zmk88xxz_p;$i6v*Mcu!Fq}5nR3P9Guk9j6I0n>wjLi(>iqe>KojNmf*EfmXD`Z=Q6`B+b?FnX&xx9wFkoroHVn;FuB1>zeYG2*C$=E=+t2+3M(_U( z@}nCNyz_mC;{wsBDkLQx2K!pjX;dL4`7!$X`Y|`>JLj@}DhodC;G-P+KKwnqFZJ9eYl)*B{OCCd-a~D;`34Q`mpRU64G}^JWYUv_V}jLuqLV78e&WJUk4a&xgY2`4GhiQ>3LlN^5^BK~EWJMA@xtXiW`= zr|N6C?`%NP(XG(c7Vu0lBHh$qtisw*Jec)*DFd;Hx^Wow@(frgy^QFP)d-WO3i6O6fFT4B{TN7G4a14|kR1`on|e7Y z>p&~FFA!igY|==1oy^oYOvq+65sW;-th7hS%t(V;Mdc7B;p~y^hzn-~(kcCoT+TjZ zLVH6sWaoEc@%dKZ<_~EutcLQ--yrt@zz%i~0ElzTTyhMDA!w$%0`9rRH*;AxVTp{H zlW%TRA}v+Svure)Ad%!zxl{cF^7AE_c@w?e?!e99K*WR|rVZs8)wL6&BZC+lv0`wb zld_YBsi`Tve*K!y1dnG1Nsk_&wlbU2Zy*8#BySbqa$0B^r(tl=%Co$zm!2l}6Ua_a zz@xZm8n;OZx$+e*9S=YXZ79u}5}w+zQ5(j`?C9=l0uJcZNg;zpR!(a|x4UB8Hgh?AV~u(MB)XK>mrl>THsMOk^5vzJcq z1Okk8Z$|@k^@UK%v(TiHa_20alM^mXO$_rVi>kI-ill@%sFX@RnC{*Q#l>UWkQR4= zMtBwV%HUf%6O_3Zaw)B}Wa_nE4B6}`krpHHZ>v!Nx4Z|eh|v?V*LbWJmX6s#}lJYnB+2OQWBw~$!O~~y)in*W!RHN<#zUC zsNV#u#XxoL<;0d{z7O`EWyUeoP1`aJGZWj!Tm1xP$?@#WBql~2sE&?+I_4@YIhW9O zYdeZh?S`?of|tZIJ#?tU^JO9 zF);zR+l{)qddMqjhS<$KYOf&wHv9zUW-#ZQMcuXkm)W2OY1l@JK{$Ph!1 zR*B*xn=u&|fJO0N;7i$s+LIe`bJsfLJ_+WXKI54XeKSN7XtCk}}oXAg9 z=`=rX1)V^|z>t|H4JmMEVB~x zzBxXWG&Olhe{>CTVMmd0`v@eW8$A7EZX1vO`+CeLznuQRujl^(+REucyW-4$00000 LNkvXXu0mjfff~yL literal 0 HcmV?d00001 diff --git a/vbox-icons/os_openbsd.png b/vbox-icons/os_openbsd.png new file mode 100644 index 0000000000000000000000000000000000000000..bd124122f2c7b2c4ad34f891a6814535e41cdfad GIT binary patch literal 2442 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 literal 0 HcmV?d00001 diff --git a/vbox-icons/os_opensolaris_64.png b/vbox-icons/os_opensolaris_64.png new file mode 100644 index 0000000000000000000000000000000000000000..057581df823a35523af8aa40f0cc5963f5c14632 GIT binary patch literal 2885 zcmV-L3%c})P); zE{<;4$nD9=Pmmy17-_!!EiNwN?Ci{e0|%(Cu3jFmudgRCFp#maG3nR{kdv=O=Hw=B z?7>A3Puyj0ILci~Oo^hZDvx?yF~!9h`1)Ry&Rr1K__=#xW#xdgj|(bwrsTvjz@tZx zq~N)^x%Bn*F*i3SjkmYAvtq>x)~{dBw@!Tv;2UrOXL}d?+}tI3$P~yN6nF?nyo}k( z+(mGOIOisvceZ!N!rGd!_(1garB4HlkB{@*bI+ktsg^T0W-OP>g^lHG*s$Sm04^6K zD7|w}+_BM`qILSEgEa$w7Tm+X( z`<^m6=e}~_^DnKi^K>FDCxPZ>4THT6PXkm`RIqyWYH8ox+#EkYKVE+MW!9}*$MerW z&#G0cc=p+6mjP! zk}xz?(BG@4uc!WL0KHx>&GqEuBo-DHxVpO1($a!Xr<1gDeY9 z^XAP`F?M%%FV}*x5M?qM6B8550M3~md}yV^FDQkUwkmph8bkmswE{?8RX~{tSW#Ul zj?1O-zFq?(LoM_RfD3^|?3cHi0RBJE0V9BQ?hIzfk|`Gf2L_rM8);``xP`%iM*8~= zVyuzj!4_%!##o2gwoy`A!QL~~xYs{40T^%if04tb65J|huvag#!#so3oD{AJ2m1P& zC@QKVAgBc2i$$cStAsl`hKE`OKqo_k%_zJIIUY5}r9n&pc4=*#NicBG;|hP=n~I}r zCMu13Ss$FNK%U(tWo?wAY#is>$DGQTVcY%~l$VpJsk?%$Qy%|*AcH@hy3F=3a`@xH z3=W@2qg1V?f1rh{U3!jL7a`X?BBb5mFJ+i7{>4a9L`S9Qa%o=W9vt;nc!hj*E?K2n6kjQ#p;brE zKpXMND%KuI;N2({>pW7P(zf_Ye)eesM=ZkxfQsUZGCnwx#o>r?6Tr;$b*68RF?PL= z@@h5j?TcfxdoFLC&J^U)G_=)Mkl=EnGth%v#`)F@Yb+f4xX=59-xoxMrN)lRk?N@1-`$*V`=g&Uz%)M>~s zDZxYGOJY<4!M;I~!u-RKyPPLiRYYe`JK9Dq;mS0u72#Oe2O;wfAvP;nI9S8bXg||; zCWYHmLN|rm->HFxd(+I%-{JP18$`xc@#?;Ke(s*cPj^OO?-h==sg~U0VqE23L-G)u3Jq-BtK=2?IR4o(j<^0ZfT;8o+Pgc%3aH1;{esl>__>N!Ovu;` z*|>O+t1jmH_=uFmoN#h_`X&=MuTx>ra4yjTi=?+XSMV$3Wv^qC`)f|b{Q+mCoe7}0 zv>69caKGG>zzfzf{Lm?uSGI-ng)ESAT_x8A?cnGDY594g1Myh@guLvyx_JZ;`9L%(0kF1R8!pH+vYwj3GXfw(7Y}cvk(w1n`Pk4F7aAlGRR8 zthS5h#qFW&Iqr)xKZ|Pv-OSzjYfJ#{!O?^yC6Q5DfVNpr|HvRyBJ*-hCx@)G zSf)%8F#!1wo+v~#OP0x#eDsBej65Ba0%B?D9t#Weq-xScp{=2fcZu%!F!GdtDzUj4>ytN_o}K32!d*JLhB$0hgG1RI#gC!zA%yim zQSvRMF^AGQ_MB9qs%qfQ%x&iH%@JJ^jeX&dXyqLO>R;l0*$&c*ix|E!DgoY|o5j%C z&L_cJOaMzu3*5iI$is*CCCv+f3nBF!3m+w41imD)_ildtlrD5Y#0Y$LX&7tgJbH)w zMX}D3RG!M2%pXzz^;<-=yvY0RzbCDvi1DdO?mt)()3rdgcs_g*@umsj@#C-msz-eN z=%HBClN_}b*{c^wn--0O;n9C9pH^_G`kD_vFF+$c-)`NxO@(+Gnn%1&*6@!>>3M%SbOOXY$q*{i7qC4nK-QwTk3x-zTnPHD@w@fO*KfWva00000NkvXXu0mjfQHitx literal 0 HcmV?d00001 diff --git a/vbox-icons/os_opensuse.png b/vbox-icons/os_opensuse.png new file mode 100644 index 0000000000000000000000000000000000000000..3f8519ce074b0d0a061a516a8f33242bebe7101d GIT binary patch literal 2640 zcmV-W3a|BvP)=Ued}CQYo*YW?o1^5Cu{0&Y&Bjk<}wA@3BN1dncdk2-8Mz? z#6N`Y?8gER@>BkAN(<6Z6sA*>pGtu+d9LghIa#;J%f3x<-jmm?DzX^}Wl?vm3 z7ElyR{!65kJ;)&SZWMdZY{5Tt9&dl|!@8Sm*q`|+$BPefuIwo1%R)J)*u`P_dwg(f zKK`et6A@cB>4%#70uD22&>E2`4_d`%{qVZua%C6gFbzUN|{W#a#LWtIVMS|{g?&|g<*B<79_7vI8Cpen> zp;KGwI+!>QVu{w1&QLarfyk{R+`rXerOUSi6F7kIy_2VXY4#NI{|w$x7| zxPGl(ph6}8Rmy}buvU1w-%D7HT$BAcyya05IgfrMxNQxtbtC9i+zW&Iy)j5O!64oW zgBx}jTpz(J@iw?f2C*prRn{wd5}^DGV@vxmNh#I~RF>!cA~ltTT#P@7_h~O~HQYek z*+lEZVzM5dVY_xALn{aJC;3YlqzJ(`M(});6NZsv>3hu?<7g-B;v8^KvBOs~lz>cg zTr*y$pQJa2*@k+7>dJy&pb%A=oWQWf?3eALT31S2mkiazZ#dI7AGc~_jJm_`4B@$J zqv<6Co5zmE?v4YZGzZ2>?eUdavmtjdTXM}zWLuWX$&bfTuJOE!+4_sxhVSm?ISg9D>TaGwL#fa{U7@la$q=X>^ zW)5VJ%7jl8W-QCGz+MpOCtRHuuQ}=kx`UoYW1W)Y*AB8HZYD}iI<4)6lyvM7UM+ie z*7sm#X)hLMo3UDEiC@N09Pf#-zCH}=Pzz>!H;#bw?!0wkEHh3FVn(_JlXC1Bf7cGj zgpmx48KW1duTwmehPpC#|FD+R+4HH>W>MEBAyvDP18Q@Y3aj^%8xvS)$Cg4XJ}fau ze9eL}A;SsISx<6n7?QS=BsCu=RI(M9Lt>m0-{8%>q0A6uoo^4<3pCWLo=IJ88J~m) z5MAO=gZ7?K&Eh%Jv<6Sr07N-Pj7_yAA9$P~xWf$T0=#)amc?5X@ao0JRK zUJ=OY#@&3AwUe=-Hh9R)n4fRX>-(VSG$UV z1%JgT?N!Wf*fae47^dDGfp_{~CLXtBN98;CZ)g=Zmi;?@D-fOT|srrJ+hmwva31}lf3@CoZ1(wSP>(HdnrnG zU}Ul#_D9X|&KrZ9#10RsEpF-7*e07|DacJJaAj-pW?T=CV1-Z<)+zex1zMVFpNXcq zp3g3P!seu9lr^W4t-iwE%J&$Y_qrg^2iw?@I0yociDF!&HaLg%V@#X{(=+XuCKJAA z48tsC0DY2rV|(A0<*Mb(J~NYr$-UWGX`~luZK;1II*pohw@&lUr8&qOqsdc85n8z! zQNA^X>4pruX^m6NXeK3+-fP}*w@`?^04cWfCY6Csw0Fi$e$#e^5Jlvprd>C4=! z-uU0>O>k`wy?{>Bgr>Dopy6N83Iei1DPCc35>s)M2ZF@es=as?xnh{n6SD*pTw?8+ zm1N5Y`Ic-^nltOVDHg{DArf9mQK|@&coTZY^~73g&Ac*SW=6~;=(Z8zjnC@^eoDS5 z1gdG%Ha`x18nwEHHOE)7TM{G)Tp_OJFzZSdFi19lzDchzInj)FrKW5zFk!oLD2sBf zm?#;JeX>24ah4dx7|}PrFXAjQ^Hl!0o^s?Hc~5S({#h?D>y!=KfB1-EWj-Bk8rpO% z=(J5w&^2=<nD`jeyqnm9OU7+wVE+(=52$3~k@O9-TmMG`pUNo9nd4ma(^=8TaK1@q7#PX&QePViJ z9A}JmvNaAe2i#QCakw~|fU5(M>iP=;z4ZcDTPAQu?Z!TZ3qdz*Sa!md{SmuJm#3m` zs(UPQH#Zf}Lo?Wxvx19tdpTCUm2I`Fc~>!-6(w)rlV!}rG-E_b#@Hqfz%tPkdtoyY z%fyUPI5Ao}j!~h5Iaw}3qO;;!(^H#Ktj3LattU4$bBWhXC8~BLJJRg%33p-faX$`R z*+;a{fPQu13&tOCBIv$9!8QNjtLhDG6Dr*bg$EvaA|}i1aJpxMV}=c*avX6i6i_)b zGRq#jkRj~LoIpm~G$NZv@nxm8Uf`_SmFQMa5_P`ZZ}+C4!wp&cBz|n1&yFHr-o5RP z*ZIkKemf2OEp`m~*p%7PZbC5$U}Mcj@k)EFZdxG< zwc@}%FS6U0lBD$_q;?$Zi=WyJKd*A(X#I39HhYnx^P-@0CW@|E$UBykq}#?dp@%!u z_>pkm*Rk`#N>)q!a6KVZz))KzM>*q_>Bgec39Kr2V2#p-o>=WJ z(%KIS?RFUXUEvgWU7)1vGDSlBE$=vwOdE>4IY=ngE0MPxpt$3r&^1L;+7&@&`w6bJ y?BZa}3O1F_WogcIA$$Tp=l}NPaQa6d&;JP!uxKRjVBT8*0000}=}l>N@YIq@~j@nKR}TaPeE23*}~5=WcNrwR zBzc)npLgiRZ(ag;{P;25yLTrjDCl|Q9TB^`yAvE7j94uG9e^VDA5Z!t?ROvlB`iDOsx3oRS=GC*i(D0+H&o#)Gz3B;bB^zYvvkw`?J zK7HufvnO4_0 zE~s*F0=Gj9hbqe9d{%>d$gA zWBbbh9W&t6sZ-e5*>w)ajEs!uW1(Xp?%1(|l9H0=0Q&>JqM=Ukv!lZ^$VIOMJS$x z642(!md1tHl$+4M;7z(`=+Z@|%WEmRydmq!l>F{|TGoxDH9a|0Yk+(8B#u>oq6O&q z;eR5Z<32>EhLZl|7mhV=!oF%0z4CgY^QbpEF$U;_8>15{LMM0>Z-$#LD%--s5tS{`v$}~eZ%8Xc&GybGN&yHor*}=?+AI_w75#t|&k1^m8GwU@0}4WFeb{bFpp{bBYHbN!Md+ zoDp;5t#C_wmuEHNVxs2Tzo7TvEeu1&mcdeih#$(t zGe+zw{g6eO6PcW7!Gw5oY!c0ds3)?gOqjyA*D%q40ILfJusqX13s9#jd!1wOns4|#1MnX21(mu^FnWrA+JE+g-nU=w7`q$mrVuyY#OoL(3}>;@nfbRCur#zc$11yN0h-ixs2ghq)x0E) z03gdr#L4$Pf=W)3FF;%>JH(t^dvud}U>IS5U5J=j(Pn&+WrVwO2(y9*G5qvkB*K)G z#7Qs+H=svY4@?qGSXkuD%gP(`z*zSHzYsZ!x&^rG-_ekVw4i>4E%vbuzgKe`HoaV1gJJ_J;J z!}q11vr4%T$6RY>We&wn)|*w2`Y|t6>5cRStM6>~IS;WzAW84qx9#ygUw7T~#N@!;CoQ9G`(l`Z}&w9pZHP zE<7qX@{z)tbp`LTC{>?{5A=~l>thx*0Hdfuh=s*SDw8rsVS{zzI7WL9<=kTl2~Eb_ zse55D3Q;={u9-uqdOqRmsobu#V9x^)i~Q_Zd1eVmZh8_Z6rkVwf5Z4AHn=@n%CU;S z^KJQ7JcLZQPBEL=nGz<;MA#&oVwGgd=yWTras(AyVUa3ElnEp?Pa~jyG)GHK zv;db>_5?Q0A*#ulM=cA;ZgoJ`GKpVm7qchVnU5kJak?^@Ij5!}b{8>h=OE?=Itavf!L4OV3MLeQ63FVXL`T_%+!rKMBE{76RMNkJZbCT;a%Cxjpma$36w< z*dVUG?S!j*B8QZ=T&|Q5QfI;4dRwm7Ef88|3n7|)JZSk&D7SsdYWE|r-JgQ?U&$59 zZ+Yt#WEyYe^=?9{UXQ%t2zjkng{mol!uIQ=w4CK;!#=*NSjXpu^I4rfT`-@(qAP!W fx;g!SZ_ob$srM_pL(#|;00000NkvXXu0mjfw7y4R literal 0 HcmV?d00001 diff --git a/vbox-icons/os_os2_other.png b/vbox-icons/os_os2_other.png new file mode 100644 index 0000000000000000000000000000000000000000..386fe225d67749c8d612d9cf1e4896ba45058ce3 GIT binary patch literal 3073 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 literal 0 HcmV?d00001 diff --git a/vbox-icons/os_os2warp3.png b/vbox-icons/os_os2warp3.png new file mode 100644 index 0000000000000000000000000000000000000000..386fe225d67749c8d612d9cf1e4896ba45058ce3 GIT binary patch literal 3073 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 Hu0mjfMLsCm literal 0 HcmV?d00001 diff --git a/vbox-icons/os_other.png b/vbox-icons/os_other.png new file mode 100644 index 0000000000000000000000000000000000000000..84c08229eab11452483613339bb9b0fb82838ff9 GIT binary patch literal 2271 zcmV<52q5=~P)_)eGjhuK>q$2Wc&uM{|O4-gvzDR77ngU3^YV=Vck4(la8aS%tWuv znIwav+FbIplHCwf6dFcc&{wP)uUG~-GvMlvAo;uU{4u1z2-&Zw%6tjZej)FEr2^&% z$gPhBA`I@H#h_V3!nUPU6eWqlT#R-3qJqa&UqGWsv8@8Q%G6UR#FgSd6N82^r(?$=_(8%+Db5yFTikRekbV_ne#n*jD0(C>sB^96Vsq`shfr|whe ziKISmF>yPWQE?+l3>DF0xcO9h01UgKST?)zL-pikic1eL+!{pX$wkDjn8ESI)A`D0 z7N!jG#6Y&>ORB7s-^FiBSbi&OC1geN+Y&%`nIETC&m%AW6h>Vkt&O*yDi45?blFqk z(sPjeIvDpb+7?2_E-(BSOy$t#`5Zs6jFbM$IkC(OeUd-iuM_ViiRad^40gv6Nr{DPYt*$* z=#dcoU5x)+vR?q|d>LL==f5tAf*(O zrD2sVV$2jQ0JDf!04mbm@DJBNDi1)V)Nr;^(^7slDr-V0uV3I8{yhiwSSZ>a06WMndA0At#rh8bN$5nN96&ilV(#mQ*A<( zA3^JW9yA`}ie!Jzg=pF&VLGe^I&DVm_GT)to6mIn9QC*=V!N-34U5BbvD%NI&!`$}xXu%!E;k+!O<$;H;L$KKgQSC@(M z#8`}%KNkSS17|@e-7)Xa0`P5l{zV#C5T!??8TqfFPP$=-taZp*`xEj2w8;r{%iZy# zLOP&ft-GO&G=-74aXtlUF_H(hIP5Jrop&hHoT9~D1z!W)-Y)QO2*9`0j%e70?fQ0N z*1zYjAjJb+cGDzz06GJt*ZT>Ck2?uzk_{~(lFf%n^7Z2C*&eJc>tV}P__{9M6kF|WR}5X zi^N*DvI90VV6KGzQq^lpFSz-k z7?++>AyuW{!?58H3G2PcN<8Y$A$5J{geCy$E3T1pJb*Ks7II>h7e`mk;qzS|a{k0t z3Nz2hW2#hML&VU`PNQr^O4q)iz!$J;5OFEs;2Kw{mRhOfnNA zWgckV@XGp!ngDP*%rdd6sV+?wgE8c$o}@5K49MSRS*RHAcXcz+@0?Jlxrwy>pJFZe zmv})Eu`@#IUj~y*QLIN9YY8QN%WR_k7LYGv*=E*H+G7G>pua~>=a9@a(`jvzvN5=y z&Mu4l)b|E@M7@uxzrPz}MIl$VeS|4>CF52xZkJ@XhA~jRkDR@45$^pOnv>hm-b%-A zHPPGEArMXmhg=Na>+=8%-n;95q3BT~58tW(zdPx7UvDS%C0ShDxt!FkvndLGi|pNV zIORQqh&8kMGRl{fe@ill?IAB@BLyMrDG1$4Rbo62bBhOHXwdbIq(CU)Y1EZ)O%uhr z5FcU!RuO;1m#YZ}NDT5LbMJC2*8>@B4B~+_C|A*18a{uQjBOu#0PYVBd}ApfE=evW z#>V<$YRfawRb8j(+)46-eHreokc-O=$&sT{EmE$HJ7jkFayNU42jIbjd;gv8-*bZu zNPJy=4tnesa)Ni_GRk+xh+V4WvUJ$Z>aDwajr-1lezyl;czEcUX=LO9wgw$#Q8J(g zwKN0R6mLa!9y}m17Sjye8 zNN(VUeI9_((cx#NvGFn5>$Frv{{y?8pF zPA7SRs~OTt+?#euhm=`!^8<0ed}-ZWs7_CFqza&XAR6_JjLX7jB?Y4VTnx2GWkTvU tsYzESs@>#vy<*%@5T<^d{=YxZ{{vnW>hl_H1YiIF002ovPDHLkV1f#JQ3U`1 literal 0 HcmV?d00001 diff --git a/vbox-icons/os_qnx.png b/vbox-icons/os_qnx.png new file mode 100644 index 0000000000000000000000000000000000000000..3434bb294716ef53918a7ad25fef88b7b251aa1a GIT binary patch literal 2968 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 O0000Ag4UmwsvQ?2CDXnb9Oqe$4#%o^$Rg`+N7= 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 u*S>CpSk*XFQEU zWLdIgS@&IOIkHSl(%5-{Gv`IC{l4FK`=7IDf8zmz-f+~@2LJ2TKiC%x1<}dlFJJrp z8*aCIk5^}BXMg$HZ%&^+WHhRu`GS;_;+qlg?T=sj;g2~3-}mb`5^_mVQvLcb-Xw7B z1@DPO;?ku{=gyt$@9!^|4G#}ry?S+FVc{{JAgE_6RPE}-FeKxVkOCawff zY!y4F3YMZMUb%9msi~=}tIKRQ<0oTdV}}nPuB)r-=;(MHDM6CEWl18WvD-HMeu!}@ zwBFEur2pn$LEAtS{tg5J7{D-0Sy>s+^Em46?(W{+Uh+wg7_jT6D4AR-WkmoP_&#-3 zSU4i@d>i2PdIdqaeEIUlix&q521Z6kCMG6MoH&t6rGmlW4uBwc-6SQ%6AG4rY#PFT zDjg_qsoepj(`g+3;NT#ReQ0Rt{Q2`UGc#JP*5~u#LOli`lH7F@L}GPKXE(#9AL23a z`&|3WvB`E1SeA{&Vt&70rBdN;_w@86lS%x%t*s3ww37iMcI$zVOl3D?dWQ+-KZDIQ z%rA1KjXN3OW?sL3{p{JZMx(K_vlDmQ5tYZYF|#~4~i6=fhjBYez=c;{S|C9p9M>p@u9l%`hE zwEd$8&04&ij zdyI$X{R5wuH90j#4*z6il!86@>CHQtwl-^3HJ-}H3IMqx%)jBL0Qbx-aDqdr>m(;l1j!xdYFR3el z=3ul(PsI;+9Gbs-C+M5YNfJU^RtT#Y;qwS`Sy+il(?KDV6=*WOw!S?@1R|f_1&)Go z)HY8jX-ev5hEH)`$izdZCtm z^(DhkPi;>TB6gJzHrKgak*RSwa1dw)4}~-^B4$v@rB`SSM z`N_S}@ga3dgG{ZPc`%J~spVPU;@o01lgZLDaM+%c0bWXtHVY^bOLJ-~P~(UuktC%) z9E`85%1<@d)>s8uF0}k$>h97%MmX5J47LfGRiAF1w?qkPBZ@tfVy{!7tt7PUa{#%E_rIuU2yS>gT?2R>! zeRVch4USzdXSO=Jb5!L4%VXooNF*l+GKNtZO`OFnXH~cin1z9bI+-gf!;3BV|M-#T z?2DRfKM&5%efZn=V)Me3}`xi z9KsLtR~_IxyCgFR-`(pN&c5QOf4fd8+jL3}9u& zcr+Obac<*K&t%Tz;I%rlt&~$6s9h@a1faCzWMFc-=U3N`e*e41`ZFND3keY|Md3zY z>Q8@5=~WpMn^I9SPZ{Yj%sh&y4pm|u@mdoecC@GWZ5>n}_-gB!?-jk^dGPk1LmM>I zegkYKs5g_1RyhgO+9sM0QsIQYxx)9aa7?b$n5z> literal 0 HcmV?d00001 diff --git a/vbox-icons/os_ubuntu.png b/vbox-icons/os_ubuntu.png new file mode 100644 index 0000000000000000000000000000000000000000..1e4ab75c0290322afd19d5a7b6fd72990f3e0c2d GIT binary patch literal 2298 zcmVN~JvYoZvh) z#iIH_eC}E0d{Y@_W4YKVSL`&_6rj7BO1$9g~=?A}PIs`NuD`vt}iTcbDlHJ$Ro_m_fu4L$og4RGLwA*QpT0z45^T|39LW52%BFgRO z>Wb6IJ-VMOyEc;jkt8NmJzG4!*$fsDp^F5K5a<6FvIRL?<@XMZ zhn5qyekmGtJPmTc3ES2%pwC2H6w-1bJPX(V2MybyW*t<#E9VwL(Hl@W-yxu_rPdC8 zg^F|!CnlQZaJQ(g3V}3NIQt(s{yIc0mG3T)=f-%3E2rL>L&C{GbTukc13l;}`wT{_ zz%0a7PC_^zRR4g?Cm`iFkoa@B^b^5j4gu}0*A#TL>8Qz1A>T{L3_hUuhO7+`y#NBl zfXA<3_g^6NZ85e5)NaH%Jx^rNhiJ=F$O!etoOK9>bL6c2Kl@2Y`UNEX5aPZIvEPCV z-xPcU;=k_@(9u?}ptD0yT~P+P+ZIBln}lqe7+4Dt{{pYaVS^ajEzE0bKl%2zpE$c-$eNtE0gVV|^Kk8{cLm zO+44Qi+~R$^vl8j1=u+of+ae!k^@Da48}VX{Q8rG2RKuvP9WtYH@ZtD^gWWWMXw3j zkHynRCEPy~JK{j9L?q)`iRv6EUg8kY-D#Lc6CLe((j=R;dnHjcu2V@DCnAomf}^X& zphP8qCzR}Ipd3hEeZF!TV z*kDxBHwq6)*e#N@l_ECxMJRX+u1fanyrdd}rpqsc+t-5?*ah@j%yw9M%#sg!G@0j# zet#iZn_i~%(-jO{{(yl57t9gwaAo!Lc)v1>-7a%EDc%=no#T?n8Z6}=LL_9GWs*OV zJB^aa=7S7r{V>LFr0BphlDGex_>J?3+wh7*Kwod`4A?}pnrkV}y+E|jdP0`H#G!?= zIq=4x@sT_CTK;zew=d#!xI601Gb9CiqKy`>JNzWPA3(jEQvY4K9%Oniw10iF~cdWXrDy;6FTA0}^xtNh5_yO@s`&nCqARgU|vBsRjGlrur(U5=nQ;}oU2 z=N$s9H##4HE_&LHnCmMsH)(08E2Op}o9eO*v<1oJ#~dM1!d`uHHIuEr5^kxO>ppbk z?BL|eIUHQ^5>fuENQm5pD)9)~!bF;C)wCG2bhPN`YHM%^7_|1>k3kFSPs2!bb0H&W zH`#{*1pcH4>>zEAGo|5c>C^6!u*-a?mr611!JM>(@FmZ1c=H0z9d;!r{$px1DKrad zPp6Uo-ZrfLoeYR`1J-VbfT6+OnHcJ$)2JtX_a=s#%dr|u=&FpT>*@*m>mnI%J1({U zv2;uEx^j(p??tD09wFqPY+FS9(H#`0pTejs!P03`2nPo&_wm>T3=84i7#$s;GT}T` zr}n{wOv8Z!DKF{q9Wu#`QsY&UaD_4#3Z&21xH3}hN6e}h2;2M?7ms;TmUB)*U8Urc zjp$zccVHJVGJInOh6ek{3fxI=O@@rqMkyr`QodNa*sQ5Rk{~TM^-of6D5b|yzu+Fsm0N4eL3F#f&93Mfi%BK9NOu}&^ zbe@*>DIG5T_c8;%Ep7RGGD!X)-mg?@J>P#ZVe96T8WTW+Hjf*!ehsW703DytfUQtmmQDjj>vPPONy2n0+pkO6a@WniS8+ z?y~nqa0s|Lau-HXg$B}7aYnY9{HeV_J$LHv?}T3^gR04wR@n(YdG|$;Njr!mIZ$PhXEycjgZ%KcxF?k4?RHD~(%WuZv?wG1Qa_2&IlMmTZg zgSRM1I!1?Cr-apE>*25qxOMBMf(gN}^#(bCTN!J;Ad94wo=)0p&NIpeqbwD+5nC$v z-+Yif-^HBpT1jPoJpDbbiqSi^z6|UFCML$Gaf_k8K5_y!Gu{y+&E^Eu*%r~Kr&lUL z>K|p&xhT1j=J_V)0zX7op2?8aA`Xn-W$WQk1lV2>>#ymVoSaZF)ZZ@xHj02xWhoV0 zlif}wNtgCp*$1AQ+HB?iX$d8D#{%LGY^AA2&8Q^bS%>V!Z literal 0 HcmV?d00001 diff --git a/vbox-icons/os_ubuntu_64.png b/vbox-icons/os_ubuntu_64.png new file mode 100644 index 0000000000000000000000000000000000000000..e706aee2d7d1e0ac6666ae614546ce014d279da3 GIT binary patch literal 2328 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 V#vLfflz{*M002ovPDHLkV1nwScM1Ri literal 0 HcmV?d00001 diff --git a/vbox-icons/os_win2k8.png b/vbox-icons/os_win2k8.png new file mode 100644 index 0000000000000000000000000000000000000000..964cad820185f77ff43f5805207442484dfc4dba GIT binary patch literal 2760 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 literal 0 HcmV?d00001 diff --git a/vbox-icons/os_win7_64.png b/vbox-icons/os_win7_64.png new file mode 100644 index 0000000000000000000000000000000000000000..e5e482218fa346832644c0fe794468b1ad951767 GIT binary patch literal 2776 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 Tx-cO#00000NkvXXu0mjfMDIH# literal 0 HcmV?d00001 diff --git a/vbox-icons/os_win98.png b/vbox-icons/os_win98.png new file mode 100644 index 0000000000000000000000000000000000000000..356d02465007e4952b1e09f312cf6814c534ae70 GIT binary patch literal 2763 zcmV;+3N-bJP)^F93LeShb9KJW8B@AJGro5{9QC%^mloMU_35AeU#u+L%NHp34YiBZ&)r&A+K zM3Df*cRhkqyfc_U4} zczaG;TTDjLMb;&Jz@=_q7UoRFQEFoWXyB?9Kq<=-4vNv%m7>*@(C{BLJTFa(AZq7k zYD&{BzZ=xnImw~j$g^T^+o@F+;2LeuQSD|f_noF?u$ic?ckn41i;^TOfMnfANZg&s zJsU(-VT#3QV|^Kob<&@xNh_lu@-%VZxY3|067T(cPW(?40F^ljG&Yo>tCw*;I~bRo zj|lDcqG6z(;lECk3h&(CQf@wD1?bNXqvhn+NOvqJ$$l{sHz)Eho)jU^7RF>W{ftrr z50DcYgsxFOGNvsj$!`x8+3}XKs+wFj#4O{4VLMAJX5(tufMKwn3vI7+pm-D~loPA~ zhy>zhEz~D7SnxeJPPtLEbr}ikmy+i1gilGyn<|7V zNjb6~d1frvb=8Dq_~BZ*1piykOe%VsCvxs#Qko4XJLYp^Fr5lhkQJbD&stFAKywk4 z3m};%lpLow-VfDYds5deLgL{e_*mi_xAxH(gmmyEI`lQ^%PG;1pqiPn1+lFt{Cb1G0I(f5wtCsn^Eqj)UNl);6(l{K|t10O# z#-n`=wh|k@ZTo{2K!06Ly`qR{=QT73Y!(iy=}2*-J8`bqEGeXJK(S>adXM>-M3jcA zu40ZqO7Bqz@*Nit<+PSaS7(&DY3$v$gmwAv;(ucU^3Fm$RZfhL98Gek#IlwWV8n;+Q{`r1qnMhq4VDYIyu^~WuVWr7&7Y=NLNpzKf;&6hHARc?k98pQ?zZL$t|}x zk*=7`;mObAHhmncL!ab8#Re)mirJ#F=f0HDj7lEO__T?v)UD)DpBFxcFRcI_?bj^2 z*``C5bcr01?I>~u{#ht+gt~K(D5{*}KTxiJlbnwxk-zjMsvX{-{EJtqbGAe2Fqt2w zJxbV&F}N&zh*`FC1sn^4(M72;M95V4cW~Du!YLC|)sz&fUxCIPHy5Eg}`LRcyx#gxWsNrCE>T z{PLd|_sz4s6#5F&L+yAu_${9CnZ@JY3mNORmhp!?u{|DQ1-R8^xUF`Bj?^9N>52>x z4l5wjky@Vz#qrD=*$PnsrAw#K>-q_UO1Wjsn4601?H37r@?LzO{v$3=jb-%eo&4_0 z0Pb-Mb}Ja#CI3C9w6IW(8IE?2TRwb2UDeXH%ZZgsVC#m7t3fo;NRrPzX9bcR1C zBCs8^=x#$%M^HP@r_X&Artrh`mE}_I?ZgkSK0wTZQG7S$eojt%h#5=1WXw@Di{ka1 zt?glX>P^1Lx`otW!d*JRo6!aG&7@O03iT#Sl#29bR2^o^ zv#bqX{9bJZ=%zTvSj~*i5 z>0wkJW6=AK#dzi!WILWB?DfakJ9PpxeRKJ$#Du&ZHecyrx2W_L;(4#w*|#FESpoWb zyYA9(B(9zbA!N=ATw4AbkssI+K6e7=-}?)fmi(E_jZae-wwB(ed^+P-(3kuvLoEfE z3%8;^Jc*O9jwN8y80s#V6~JihzDwPmZKQZR zqly0tO{(be-+fG(pB-2C*iv!i@8~bgVNfr#gmb8+5VN6Vq-0;uqVB{rj=lCIhbE2V z(}f-^Jk`KPQA}rD(BM;PL~j&*?glK4Ro!tR>F>F%fq_2s4H~ldtQ1ZzV{8tmw_*=v z-_4<4DLP}P5>wS7hRQrKw@Mi*a>Xp$jae`1hQb$FfE^d@?T9_Ho9K&)%-fp5HmQjf ziH#VHBb=IEc<*ef6=2xuj~W~_azm{oZ{KI){*(mWq9N%|(v&9J^{tU(XKod@;@~N0 zj@hC-HU(A4YpBo6rat0BG-0br+&YWAxYKAGYVp{g#c~maBaLueW}r?u&+CHq$yHW> z!NLB!)SG#F5nHZb2Qlf}6Q67>d6ZK#GyL_UULy6+J{7K+djtWQGNb(%wv0cMma= zYUXcB6L-WL;^Sn93)f8+-3AyMGTo(N2+L9Q5;tY9Md;!^>8=jPESd{OahAG7w`@O8 zo6=7JripD5V>dGd%TZ_yB4x+BWJd;D`pdw;0Bs%J#3d_Ovo(o18`GGxIg@wn6Gs4s zKM<7)6=w6$T^bNkXcjFuE#x5QHhsvsRj-rnzJT6p(V&cC)xGHgB%0QmV9_%6qLqIu zaz;X5Hqul{9h3JC?D1Z R%Pjx^002ovPDHLkV1faWP(uI! literal 0 HcmV?d00001 diff --git a/vbox-icons/os_win_other.png b/vbox-icons/os_win_other.png new file mode 100644 index 0000000000000000000000000000000000000000..fa503c87fec8499d18975b14db66fc10c0bccfcc GIT binary patch literal 2730 zcmV;b3RU%qP)N9%#6&MSHBm&+*n=&gB52gu z(P+@92u7^IhD41@QH)qn6ctgLNbg;G?`45qSbFcUu%CNa6Bj4BxlI1J+nMj~`##Uk z^ZUHN=U1Nh1x*bt&4u%HFIye?k^iLzZ4TOgVeld%(3679FbXol$j=D7HL~J-Negp-y55kv;_N5_qn-KY zu>p~74&?V=rBa!s@`MVYI5+0^EAO|*B?WOr-nJ*)(MEOs%Xo=URz?WB-Phw(afF0k zE24V8M#c~TNx_rfrINf@iZUaS6vqE*uCzFT;7g~8_i&=LC_z155YI*b<5;9@#J|^` zn=Mlb?$M`$6g5CuaUx|!|3%_IMOjh!oU$M@(wp*<zefIQVS?TznAJFu2O?YprhH!bbSS*8z-%yDCkHk1T zP$|oLIws8|(8h}FXkXP>Zb2+Nz1MK9ejla{8<%-$r4W`ElpP~TqzZjWmB4;z@wx4$%_v{UXd-7L-55j zWJNrtx-t*Pa2xiguEMt6lzA1?nN>BO)wQG8S3eAw);Eb(n5Y3{R$CxH2INVQDS$GL zLCRISd~GN?WlYGnW%wU8BQ@Y5(vmclu_}2U=|LX&ojIn0s;{HiS(Vyv(YDLu%_vh`n=_)W@#4CEmg;aXBZNH!xQ+ z3GGr%0Wq1$<@ELv=pH9|!mM;PzO!VT96IfOwul z>2;dg3p7CzF2vlu#*tt%PFAdAy=(?E^CvRBP>bmW zT4m#_TPmjMNl%&&g z&76UIhmoE%!vAXnVw~(nK%OPp%Z0q?KwPaY*b%ytL$yoL%^inM=49q(YB4iU07x~_ ztN9qyx;Oc$@vmxty6O_j@{@REx*56M9uW(9ka$jP!zdaqy++2o3ABgZVDK||U23tK z)^nTay0o46Z}sumy#@FErWD48a>{%a+u|3pxoi@Pk|zjhF+W|4X+>IS$|j>NpUB+m zvFxZDtp;eUFQ=|XLYluDAx3%(Bt8~T8wvpng~?86siF4zA?WQ^8CQ0;p(x8%!6?pu zMXu>$E>4+1xV<&|znzOwq6S~3jb&M!7E2Pfm@T|8p-_V{l8KCyYNJ&;&am0YjQzz zEEZGWWs~#!tcjY0L5wD!C4a)0>~VZlB0N#8k4d`;=ejL9Uw=>y(9%?;QgdS^8RBdZ zBch%BSjf6d%Z2ezA(TA(GzH#5a>x+*0a4TU>QZVthr;ce+}3^zml?w`GZ@B#ppTg< zyfC|XDyu8?F_Uj#Ux^W0o-Ajcs}BFNoudY56)yfoa!C$Bq5$p z>&aWEL(_%@G_LtvHE#d@-?0AhCCo;RL5`SU?LUbL|1Rm*FPIOoFX%YIC9j%BV_ z4$DJiYJiUR#%F48Yar^pB~|w3q9)|f^4NybU2|!2*eZgs52@uw`b-RIIlLZ))mG{b zenq&U7PqIpinsosxIX!1ZfFl<#;Su1zf{7A%QD`%Drb~aE#vMt^O<)ix*@%+j_p?i zbaphW)!9szuO~?+%S2TaZZCF%R1uUh77!}RwEt-o4=j+M-9p6r8QhsY0{6u)l3@Hd zB*$LEd+F;uobv|Tb-rM{QzaAJ`ISqQ^$sI==bw9;(?M&PaHE`7% z&HY9Hz;o4mMC|&IOv|y9+l{5+@`rRdejvQ^2}<8-)Zd!UjcFsX8$X;mU)r!Nq>J^! z*f*lj?MwyJbl59e&cWOv06je& xek>Hc2NPG_=2@yU1`bu)_=TmfLKC;_iQ1?KW zHqW{AxN8f;pEBU3jWTGSXk1G~2VKJDneTIM{JX3(IEsN&IlIzepC~KGMVmPzy1s20 z*jEez=dGZVTWv&9=S7d)m9A_nx{}T5PBNh{VLOW0^$dhAV!(GM1Aenn zhUue>TPvEF5sIh{xEask@x>E7atmPb-f+y*`Z-w$)}o$W5r%Koz`gn*0E0$2JyjW?m{ zf`G6ThnC$a6E_RP#wfGQQRa*GU3d}-#9YB~B9G`1_0U1|m`c*KWUMp`!#uJT*9LLK zXc5WO0a4vU0QyCJAFAHoF5(>R$iBQ$9MwbwDa7XWh+|v3KQsuC^3#aW7b$8bTDOfj z$Xt4=a(nS>N6hiXM7Y?C(k`d1qZ4ocJeHV*iZf!3csUusy9pjt52*tK1O3lw5JHuT zmg1yrxr|ERV|3)XqHGamxJQI=n@Hw*0a7crruMeb-Jc~qCUYS8z(S(kuc-P^VIPk2FInnS4LS?-y9$vvZ4L?6+o zD^D2e5gzFhiQOi)re#pxLOvp9{OQg)%Y$t?B!}Loy`@g|Kng`a4b2^-WLI*>BOU8& kv7EQ}dHQnt|9(CHH}%8*UkmwMf&c&j07*qoM6N<$f|7zX-T(jq literal 0 HcmV?d00001 diff --git a/vbox-icons/os_winme.png b/vbox-icons/os_winme.png new file mode 100644 index 0000000000000000000000000000000000000000..df80c2dc5891d4ef9a93e7ae5127c075af931908 GIT binary patch literal 2738 zcmV;j3QhHiP)}w~M zpivQA5sg7nAZk>K;-VN7MMb1Z9eM}py_Z4C488X{&tAsF!ISLSocysn=lsq$-@P;U zeZKd;<$i-^Oq)4l>7wPf2n?({k8}7e+lt*B{waY+|*!lQiFc8lxw7g{K8x? zd1Bnc<68`3wvgZJMNE!F2{EXjCO;#LyndzscJ;539_>wXu*>uH2Fw*?gyR=s&sUzB zgf-tFr`HCVB3|hUB|t$|;8sUm(WSj-vcn)p%|U*Cb~#Ox%T}%ZfXV zvkB;2O&N(QfM*49Jj?$t62Hk$56A1gA!%VA6c;AEG~a*kYi>fazw?W^l7a+6;+@&= zvlh2jGYlJdbD?&q5}=r;DuBGyFkv8plAL|HM!OHvMLe-q) z@;TDOJYTF+kQa-AyEfNLj$+YzinWz9xl;E!{vAum!%qbu*}oCV=_5ovxItE2fO65& zXDO5xCI3uiC8@-^+{NoVLyGg`#qWNc6IWjWkQwPiX>kg&XQ@1jxQSlmM(o>-*-*KX zO_k%gUiT`t($S`|R7Mc{}(f;}rrs*Qfv@Wy7lIZ}FdGO>@@Hq(~H|X`XM1EC= zumfxHIq@}#K99wor&2DS)ZgMfNj^?gRTmO<--aYlN1WsCq8GQG1KEq27&?sa>W!7g z16%!>5dM3NOJ2phZHfxusmmQawk@U2*$gUjAm%K%jDdTT;ItRjR9!tp znD!cc40Xwh_9rhf6ffgb$V)OwaCac`!7WY)=y5b_8R|Ym*e~C%G+y0Z#T$~r%uE+R zwQu6wG*kspCQTvO`V!ImRtonAh*%KY5wIQ{-vax;fbCoq*LTu){Se$Wpzq-+N=&qn z?9n9B&PoL2B@&)EkR9QNqnRNGgEq0ucNE8^yOhQosbOaLbkrh8vZC@sbgTcwzv}*| z0;sMiS~Iqu9T82aVAh}1$}XzP#7e(Lcp|?DW5{o)k<%zl#bjG8bfbU{@94DbDAV;&*15v zMO^!IDj`;87<|2urS58cU$sy9zcMly?e-4CB1SP$s?J9xvsh81iBX%r3ZTBOjQZMA zDoS(kIi-Wl;-4T(ho}>jI}E49`4egbwnBS~Sh7W^7y26M?X03pE(+E?Ba(N_;OdM? z7|tHem-b_c!&Mm1LN`&1SH0ilgTk3Cu2_vuiw>7NjJZ;CQU%ahU#?U`os3jJHzGx} zlM@B$55QBMwtH&GE)6I7;21JbETu_umChVL;gxa$(+r(?)H@n+Z`OM_%pHcF=1`XS ze~5O{I!5~qM?HEHdh(qdFVtf1)AcNJT)^Kf=Bogj8Y^E&F3rSW6rirKM^F?2eyib; z2u8apbX?V-{PYsiwPzE$_5))6F%_K8LDpkBJTGEDZ6t0>Mxs0YEk=L$SJdr4Ww!l% zrr%u1#4Ae}X`;yp81@b6~+TCfmuF>e7w6Yai2H6@22RV2((z#s07^92G!& zThjoEvQZ{QqJMxK!!5MA8qpz)Handb<@f-JM>Ke%F`4@d-ot(4P-2b@C;!Yas?A2w zd4D3QC&uCMxfjK-^A&h+``rM%;&=r|{OthSnSpxt%J6m5;Yf~KoCb~$yzd;%(di)QY$h2Ba z{>{ZA=a*6acsb2(3+Z&3B@9oY@5w9_{)&6a>ZQkS;9`QAl&JO=rJ-<(o5N- z7mR*b6OOgwh|wsLsTIOI1_1Q-cE6;qu6CkrEy=JJ?X*EeP>v75!#H1^9w$V>KY2273#w%s$Cd;kCd07*qoM6N<$f{DF0*Z=?k literal 0 HcmV?d00001 diff --git a/vbox-icons/os_winnt4.png b/vbox-icons/os_winnt4.png new file mode 100644 index 0000000000000000000000000000000000000000..cd81805ff90cf5bac05226dbb3a106711c23b2e2 GIT binary patch literal 2754 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 IM6N<$f+w^*c>n+a literal 0 HcmV?d00001 diff --git a/vbox-icons/os_winvista.png b/vbox-icons/os_winvista.png new file mode 100644 index 0000000000000000000000000000000000000000..daec590086be31932227f0f9034b830484f44fb9 GIT binary patch literal 2752 zcmV;x3P1IUP)*-ZzJ5;=`59nymaW^T%)9d(XM+ z?CBx7F zbqQ~|N^b9UDijGyPbdKjv!njFa(;hYk{3hx9XmqpFDUPS9WN5fNDE@O+j<Y!_d|QgOAb*!mlmn! z{LUXIBmD7;bqe$2*#F3o%Vm48X*rPLR9==woZD@@PnuI&kRaasWlmh52!O08U!9v*{b^9=>-@uFtH4JJ$#Jb^CJX=Q+-*-+0fJh)3 z3!x+cdE70k9n4ACyB6OadIZ~8kRiURtTSz^f2#ASHEY)N|hN@hMJqB(c!JW}?Qy+z+0P#45 z!t*pW7k3hFxD;P=6S89h$WIEx+u{(ivMdrGIT3a528RPpIZ^&C>!s6}o;!i5`I=14 z(?qLeB8#g&<7E9CxHb<`0hCKp3Au8Pn5~P1`vXNTh;Rh10OvR1_GfTi2Zh}h`Y!Jj z&->}Se~7XZ`uJ_pCCb50B;+{~J)Ovj^vBuSoE^cd_@QPA+Sy~6oj#E{>6%Q>5ddWx zEUf+DYexSQv6&A(qBkl{9`Bzh9?W)fdIHA^5Oa#Vbp+L8w0vet*7J23c8Lh zMQ*i*Y?H-YnlzqJJ8SlDpM!q98f#KUvphzVCGncf6kZsguf{0J1jdwUv9L~;qwQuY zfM*TmJgb*dCC$b6kTDfD-$O+PL>~axVFF;XFun!3^%gqM=+kDoo~EN~sQ*EShJCYX zHUEl~^%`8%7>)Vl;cRmJn6(k==tgPqW#Si%${fRIMZyzRIvBSabH398tGa_KfTm}a zN;NiAkS5LsQ6k&PjfRYS@OT2;9WFw!l-`T|02^sKu1D>UE07%!HGQu(#U``JH`3sa z)(1FE8;q&$Am#^r&Sc?*nT3JEPZ#gX8zBf=n((P5kj!z%hN8PIih6V1ohQhR7Q<=-!)Xvb`_H%!J+Z5ST&hhd`r zCc{tulL?NKnCv(U^=oq&Wi_8+Cv+KVVZbNnkD_+nUIozFQujj7>M962u!9yiTak>J z5Vjp$-WJ*axd2#+!qx!!$xU?ZUqiFeQl4#?Ps7@;NSiwzyN_SP`qS4j9Wj)5Hyz@y z2W@%P+>W;_ZZPD$6CY9M3FP1W8o@ZLJM2)Y?){gp~!Ac4nd`WI>#$3GSjM z+@6l&%2xWU4C%G}j$Vtc$St>0dvFb*%QU$&jb3!G3ZT8MQKj}qGJHHpFkUXIqKoJg4v;L8GRho+MVayVuOT`54qi*&#bwre7|s5gu?`iCck5w-dmrlV3MP6e zm?AdVyZ~4pfeN6by?KC|s4JJ?XJ$mMxgPEAN9hzsTU-u{a%@D>?!|a69?RX?AMj}9 zAYymFN5PT7)LIXv>+UGh4vfHQ#t=?vj%2pAaJRplg;V8>U2QL^t+|1~6DCM} zen1i=di>9;$g-P9!L@lv?|e<|Lv30-=FsJ)B@B< ze5-o|U58S3rNBN>R*s1_b4GN1n-Z`q9{|wZ-Tp#7J)P8+N{F-+CAZd-E}1hOnU-`U zn$ekHOi!E<^62&S1uvq{XF7epGf{+yUJUeyBhA-4FKpj`m5yfE~<<2i8;Lin*E_oWK8W%D7OO1ame0>B4G=PFwq-A zmY|5zLy@=*MXIT2WTKCxnDAupd}6$BQ&w8Yku%|}6JEF^g`X=#YZ1oX8^F7H0DxTH z{gRq$s|Y@#Pq*Yg^oXFfK7xi@P}|=svQZq>L>MCywzYAIUx1#ytM{9L7W;%ZCOvBiWr*@@CFqou7KFTWg?7zc|p zVzu}=>BH+8Jggc}2m1PYUs6AWaw}Shld{EfDtwO8mg9_~DN%rk6mAilxlVx8h|tvB z5xVz_gvX>;2|TcXNVjXs{?gOaLqk&=-T}F6-s_L{u3)tHgfY+X$#a1IAH@9J0u+kA zm((M?AS=!y*!~>%jlbc({tO}y>(G%S40Q>Qbcl`JB0|&DFE1f)ku!dDW}V~Vw%H^G zKcKa#R{244c`x;iZ6sw@aMwK*>l@Kn*?B+zIsJeCp8p$4BUOiWBzzkWU8;o)8LF)=Y%TU#TM zNEE-{0c59!btxw;jMQjvl7d|noE&OvYZdb;DJk^n(}#%@C-Tly?*MW$BD<8I6;0S(8$#?ZD#q{T^Mq291KIDg z5&L3eVq47#Z{3E3e*ut6rS$994}X9Eu9bJL*x1;ZfPes$l$8Dike~IeO9i>H1Y9{o zjH^8bIkDaISutGpJ%Lf;W_(+1xLq@yfEEpkN$d>}85zlY@4d&288bL`>=;o|QFwZK zqNSy!cs^##7~cLQ;^V_8eas1P`2y~agfpOglSq3T5s>FeaDTwd2tS-Gjo2NuhTmQM!c$FE?6aB47t$z_^@g>Arfcr?eHxTTnz|ED&FK?m!+-77#@~e6@ zUC|?Emj z^QKBdnIsdRqx&ea`V~r2A?h$V4;KK_h4F33EVt2oR)+@jjno`pN7Zi{R3Dm0z0vn1 zZB*ux@>qiJ@A|ijw8ettf2i;C%|TEOtq;vriJvdsOblmP@q4TY&~V}s(!|U zS%Wdq9K<63Z<#KhDZ;n8tL6xlFk}pV1cgy`I^ro_ez{9(#bFmh|maF0-rbSe*|DNOpld$>nLoC1UkHN@c{B_Gw{&K{c z4~%U1*z6`lEgmq+)`uw$QOtKwM=Ma$4bV_u-KF}vD#9j+t?!rd7k&E!9EHT6=`SSMnHYE8+7S zQbyXpX57QKeCN@~lE7B9quRRx8XMkrtMM(V-fqP2TLtNlA=e(Bi=d1&59X+L-Lx!4y|HQ{Cju z5DB(WoOxD>6JHlVQ)6up)lgZSkMBV}GL5upbUjY9Fk1K680jTF68A5|ec5;%=Y7VL z)q{xH|0y{pgQ>6_MvLQUk`IsM!R(=&RvE=SOW|%m8R{aVmj}a&5Lg)stA+8OqI&=| zH`Vo0rzf5{+F`e3B5oVha9OE@llmwgF8v#BYri0L@7JW5jiu0fELFB&(_r_N@X7?_ z-ZQAYGm~30hG9K^Fmr#r$g035HVR`ui^J5O=b--r4y3@5j2-|jEe*ZYP+LvFNqzFY zetXVR#4f)Pu+~MXF|>ge>ta>jYuO z>V!YOCVET>FH$9}F$m^hSS?Of;8P=#sR6>9djPbzxAjtMYZK9S)}+~PhPNVuWMcDL z#DTQl7peqE;Tc5eixf2%t@|PrUHL#5ePAO>yOg?yMm&69vV32VI3t#e z%Si_wZ{Sf`k2=uN(cVj)5Qc};=<5g}YBlDSfVycS#Y`mWHu ze@b{va*cq)i-~Z#uIMjqZEaN7G~nf*$<_mYEZG~xl3zkuxZ~*`0G$`a?93eG@{V3= z6JC%Oq!VO!p8NZLSGHl_LG}TLeHmn6hJD}nPamUU^dvpa$sg_SobUO~ zy!ZRP`+4`>cklZRnLc&K^d$?I*`2ibj{l_wY!28SGVmijz>~a;F!IvF$W0IZ)zXZS z5&koMVdRVU3*O&g9>0NtUSHyKr5cDK12hGhk>n3Z{_8a`hCI#>S(wL@@t)}`%#0#1 z+KF90dPFu~CAZfeRezGk6B>ZR?3iD!oS$!3*L^P1m3wigM>(?c-!*ooMv;dC_6M0kVoNrN*4US&;i+pRzES z@FaJ3`>({S)dor9c23t0*8r68NDGjk9w`hYqbyEEsYs#ZKWLy|7U+iOk^SVQhH3tn z6lwdUXOAO~^cftdFh2qFhX!0x?&m`55mr{t;9T9y1a&MXpFk~uboW}M7RJQhy-Ids zux8NG$7z%n%YLFVWjYBSxA6T|LPEU?cu}HV}Hj3b~k-vN%mMuu3UZnn`hP0uPUxlM^3=x-3&Di{Q&= zkVp7Xp~}G_{5$%Wk!osqDGBI^HCiS0cjGvGVA-cy%3s8D;2js?pItelaP`V|g z*wgNJo`O>bgzR30^r$JR0d6RZWEx}T>KxL7Jn=tcse!5}&n4Xc0_mbHzc`7#z8kTv z-N&{H9md6vLQ?a!#`uB!&3v8t0wJBBX#wu9UyRyj9|$*+{*8)89xQX|sCA7KQKt(RZ9|MnZaCo=4~pD{{!X0*_0hvLb z^XQ9(T%Pp-;kGuIf4P7q4@dD`)lSWOWn?ne>yM0xeuIgMDg0eI6P+48EZfYq0QGfc z)Yq0$QJRbY5hGL=z5U7JQAh*htvjdg!VKsWQ$NQ^fl7kSw)vxB&^$($Tm;s z()7tlW{+i?)0-sXDU4@hlA_Oxey=jAXad>!XGBQVt) z&f=hVF-Tp-*uarYiJOe6dJ6}O^x5%fH49zl^S2B0v;a+wm4i|%vIr6hs4Mb56h}kg z3b-$V(eZscF6mNku^73*Y$8@pBK}_=fctUCcBRAT3{F$W;I()RCevPH?6>bQ#c39^ zo#rv^+5#q?Tg;dfdW^Q(!P{ponQHH#1!!rm8B~3ZijYHlX!f`$f-w^!z67^Fi0FS8 z?AOwNc`L1!8&G^cm&8vd5-@2P((yw{U-$vGZw|#~{L7fWHJU$dJHqb{U*si;EyJv? zGwQ4}6YTt%<`m0<2U)BRDb)hBw$u%(rMZ@m5XF zp2M9_M&Y6R5{d^VRHa%Iw0#0@^G0Gge<_o$Kjv<613z8^`{@S}Hp5S+GWCvH3((%y z^o&H>C{rLcGbC5Cfi_P|I)u??Hw%%D4M{Q9<$>;d+?oG6UaN)^sy~v7U~4gS41Jve z$nDnR{P8GG&6vQv<3W6QCYCw&3HX#W4uV|lg9RStT7ZuB=I1oviAQ%Fa9H*}UYq9P zv2rRdIup3R{4aQ|A4kN#@x&NUz-Pl4sv}N4-I~R;B}z14H$EE8#rH-qZ_RmDg|xH6 zr;<62a+cmo;GDc1m3Z1tyfO&T+1dJ>TAS(!K4F5w?`sqxqQ?KQjx5_n6kJ;*_WV++ zU6+w*Jqu-!#nU-uqxRjUF<$Gk5WBf=a`wHke6DvCJ;xG^WN=WVm9OHe*#0mBW8YM9 zAbSR&tE+8L-Q68jmneu9X||{O0i9|W+A~kmo@_=(k`dhrhLn4VL#3x7U5%NVnO6oI z5xDIgs@!zwiQ0m@!908}ALpTa0J;alF_ZOjA|GrNa7_flDVZ8;`7=u}VDv}z^mI~L zluz90EzlGQqJ&a?LqyOyPz>yObIP2T(q5URnR{ihF$LFksP)wsg-oPwnF#?078B=t z3uQ?mN6$pENqFIMsR%&f`@5B5Q`LcQ(=#6E>FIh-jnx%|9@VEyaSysh`fYg#bvK2z z@9EB#(3yUgzOE+9!p~9avx}x!u}ku-p6VEp7CJ<^T@^J(MVh>nb*5pMMKF(~PuCW#0 zpj@^e2xQs5P?qhFV39$<6M%sa#QfX>`uqEyQ@8Mfx;Tqa2W##bt>K>j$3$DKpgl(z z>J%Pn4-<7rEKTEpyoG#4%m@!w8UKFOi?X=$w1OsJ=)m)eF_QZiNC@l3$>OVTTdJcv)t>+@&$O42z){ zBuru?hLXx)N<>8D782bkT~4KYx~QX0CB;d%)4g=R*L$Dy8#>zgXLtYDJ+Ig2b)NH_ z-|zQ*Ki}W?@;u!pX-%Fqf6hY3!{)#8zm(dh+IBbfAUivofA^!lcIVbTLGuA|fI>=VN1I zvA4G;FE3B}{Td)s5#Fh+)Nm9r_mMyFkj8KR_bfGnz(^N1`{)v0bB>HQCki?eBu{h# zw6?ZN#=X70$;!&2y1H7LPf1CkTeohEA3vVgo_Y=NEIq1I%BL}eUvnVT`GhonJ^x%t zksQnpkF{LMHz%(7FcHl^kjK9Os8lL?_UwsFChJ_edd24E<^%-=p{1quI{@X=hn>oP z7Dv#Tqr`e%Av-HhGygP})BcArOVq=^*@4SdQweHXOg@QS0ivR!c>C?QnKo@22M!z{ zIyxF3A0L)2TPFQKX3Q885)!%qyvU00RL=891e~x&E_0X0>bcx!j|fe0XN%twyz1;Q ztJ=WP@_rIP4iCEmgoK39r%xYgtf!}kt*tEs2M%Q1xN-FD+n3(Gd(*vp_bvdr*-64! zB00)LY3y%ni6Y!b8t00+XPI%B-ZkJ%?k-N&?Pp2xWR6$#M%FlwOai+C#Kpx)@4Bd{ zh^>fSoTDI5L4Hm$`MD_so;XZu8e!X&Mm z^o;m+8x6pJTLq&Y>qTOe{V=Zl zMtX*|yc?0NMj8P11OF4*9X%ldJeGOlcg%u>KeE0^ zn_;noFf036GQK-=EkCEeMR3!%8h~3X=kdUF6-hVuqj39)^c#98E-xePf;P!#wMjg! zL&7OtNq&2`;_ZBvM6vQhu~ON|BP99Vp``RV(bt_w@^QmG{wh1;mtpv1E~CQw^Gl_b zWIVV|#>j|2V3pg0`}N~B01rJbb8pRj>fP<2NWA;lL*OwCu8oCD`gFML1Fs`=cps(Y z)ONxRzQxbXnDiJKnTcWeTJ1-bo5rKNu0-9qfO*hPcBL<1g5UdWQGG8NFKsE|UH@K8 zRtTW-KDbx+(*WcvAM?P`hL}x@AUOzLL_v_qf4BF*Xg{+ZuA0&=Je6y$ zkN*$4L|t(Z0cpb{Z&#i~2I6LC#vcok(#j+n@xs3B+d{O*85X_D%zS#XjVNY@0tbjwUanC zX)I<_hqB&fIPrK2eJ(XA4Wf)%-o{I7}XkK+i1n{vV9tWs>(u1FDnX24)h|* za0z5YgW?AGOrZYSAPQ^-Am28Ow7v7G_CG~aMxgMDx-iv1Qzn&e7F?V1A+FQ=vs1Sp z^JJf4khGMcfdiNjGnSpIb?kYr&&G$#nBz8!F(+qg0II8sJEc;lA=|c!=I~ph>O?}| zVz?!O@yd7_Pw7x-J`aV#RKk{wCiWj+fV(B6-=@*$7%o~v@R~OSrrR13g!1Ri2wU20!F`&|A<~B&-ns};k~dM(VLwg59Uwn_w&bn_Pk@}!24Dg z7-Z|pNJl>=xm!QIup1y?S1Yo?#{(8`*3MWKc=tT$7**4z7-w#l(w@rvX&92 z<@7of#gyB{tcq^a0MysL)TsU?iu+z97%hdgJMioZB#EGmG7~*pG%o+6wB9yDWwVj6 zwbQx&_d$5*yo1u)n35zLWE)0uXXXG5XDwj#g%{k&e%aYa)cJH#giXJrNoZYHX#g7P ztKX0)8~IB7O$^B}TSdL61&zXJ%^h=8rwmElp@X;1=UkulAzn-S5u!hUq97afmWKAG z02Gej;rjI;j!YiOOiLMG9*btWQye}yRh=OA?J(P;Py^7|P}4$N)aZ4vaQ&U|R)m2vzWNnP{{?90bMUTI@f;5M@WSyTYa()4& zw-=IX^A))=^H*z1N9DU&GG6XB2ge!1vHg4~-|HSk_eu^%a@Zrv%1<#RY`B}k4&NlP zA$tR$xw*bmEiH|d<|v62Wwy1{n< zSz6M~XiB!Fy}6qF(BtI!Y^FL|WXV&jS2{$vxi%4Z&WRpVz+*)oD|SA>B)l58a_|$e z7*Yojjc)+7wY79nb8`bR&i14_igx-kMx0v29-&EWNNfFRl<$#NUJ`6XO`-)Y86pF6 z&-|tw2k~uB)FBYljKQT0fGq)5iAOagu6sVl?m{%y iC+_`rIQ@Sg&;JRBN9pwr8WUy!0000QP)_shvg0DAE%})h5D)t>Z>#F3B_(@_9YSz+mh|EowU7ciT`8=r8)5;B2CSNDxfMandC!O zQ0xHd&%%j?MEzqW>G6TomVHG-Z4M2Fd%&2B#>>ic@M ze$MpUJSYMz#I^<1>wkgk*1r-T>M<*zNfzlMP7(a>N}@I|$7|Ih4s3dwbH2OL=fsJC z0$Q6&g%WY{-RKiTx$N>WR}NaDIkJz++$1Urk_ofh%7u+j5wP}g?AI*8+hHS`Sie~T z%3@=62HLojeD3-oUWYak==~8<{s+0}w2RA*R;2nmQ!ANjkto|lOj~oA8B=RHrJ5*G zoc1uC>jEh+ant!BqOIScFe6&B7*6QP0~~kU!U=avE{3?NTWc0zYAIKvGfL$aWyg@6 z8jLo?huFOzFsl6ol3!xn;UQx8Y^GcyYH27|*O*!=W@xQI>v@o=6k8}+4S_#}b4zHq z{56qYc9a$-QdXEmu570wrm{q%X5B2Hy{$?`F{GrrMKYrCa$xk57_5@&4Z2TQsv3;( zIY_OXZ$-fDx=OCN?1IQYLC6BwErslFLC*&d;Ja%Bxw-I53JqKYA&KUGt$bi+a@UwY?{LDxZT1IC_?F_Om>%vL0cRdfMe+L1A*CI}> zUdU0q4PXLxY|F znxQUvc3~(;C*E=u-M+6$`j-h$(%||cpRIfhFZ(y8iG|Q&lwML@LRV`&gR*vT;O;if z0qV8`tM+Dbb#Kr zMpB&j(N`D@DYfG8 zFd=dq8mn^{8t9ti!z^HIbnp(wCx$U*rc&y^6KcizX))+^pW0$Ww!KD$K80&Nt&-Yq zt_vfh{pcfuFnG%eiIUEF;0JR5Kgxvde0(immZKakmEShUhgrb**!5Y)XPCG#LVa!q z1&1Y-iBfEbe>hY19*^Pow`Zl=&(PD^$k^DBd7a5vNut&3n2xTM0YvTt*T)Eu4tmT^ z?vL~c5nz&chs?gr0w%_XnV1;i#*I-%t}E#uQUzS=Y9)EUC0AWvnmOyoEQow_Dejgp zkecv0Jsl0IA$7ele7%p7)Hs57tmlh2mgDitQe59(N!aNFGT`bM?C(y|7=R*GZ-JVkpuPX1j%RZ#~7aSC-)P_OqOk`=D4R+reuc+)#v1jH)PN zlx-=^Pv&Cq5kdp(NeJ^q7k!$PqfVr|@1rm%fNPztb2BhGHBNDO2&HFbn#p}fu2Tyx zTdkowCxxD_Mpb=M*fB1g+)vDTXY$g*>1;Kq>72YVHU}lL!TwI#o2z9oEtcCdM<%L| zF=>5dI9)-d;|uEW(q+2sG8!8m5_NXsd=s4gG5Fli*q(=oao;QVeuWxoXPc2GIex7T zWond)^Qp;krluz5GC9Gd{9nz=(s9FpBPoz4|@C z@%d`?wru$&r}l25QjXZ@aKA)1Zcer0~g*|NHa&pM%zu2CyT_9RL6T07*qoM6N<$f>frA AT>t<8 literal 0 HcmV?d00001 diff --git a/vbox-icons/os_xandros_64.png b/vbox-icons/os_xandros_64.png new file mode 100644 index 0000000000000000000000000000000000000000..184147eaab687822cb8843f21b7ed776b23b911b GIT binary patch literal 2274 zcmV<82p#u{P)> z$>ZYUsH&=>tE)@CUR+#^m6a7UXU^ndr5*xQYcrp&iY$_RU1__p9g6JW!YeebpUS1f zPH1wjSOPRQHZpG9IFgf-%_EmaeBi(V6bc2iX3csGKv$`Ls;afwB#IG}xCl;+1NZUZ z@;d@QTT05+AWHz1O2u=}J;%Ix^Vq+CKbe`CT)lb~TU%TCcWY~F^78U50P3pqETpd~ zptdSkPF!1^FRta29NTMVVZsFY^O`kl@bU3s z(xge)*w`>};zY)eAJ3REV=MslHH8++Pl({U#}01nb0F#PE=sZzDbBe@r1M(NubfNJ z@>kij%mzP~l_bRkSOVna!a6Zc zlIm-3(;%KP14se?8~J%3l>v;6cShAvPR99@sJ6ZZr+*JYLcTLNwRAc@&UU0HpB08I zz-TD9kQqP<_FbvYpCa4oFA(w?oU%dh`ZA&KS@V^XEg6b1$}~zU3(}}6Qi*9O5zbc= zJqE-`MKiCO&yN$civ z@|_v%wfiH%z8gsl_9oF~GwB|mqja|A+Wz$vDX(xl{|2#V4iV_GMmXJ`Q2#C5O8lC; zqAg906_4dH1GF?%KPF>?mQqa$mrlEJZ0E-u5v2_F+emc4eqwhz(0)4>?(Pu%J0C;9 zGA^%QPG0I|%8G81r;3ryrcozQQ<*C#e^L%JKx<3w<7(E4dAdVIX$Cpz(PSitk)IXM z6;CI+uj~TDK1g~=xP1yl{E5y@leyrz1#M{>jrGzTYiVk%6p3m?Jlzv>m;u^a^-t8j z);bYDCq_^y!x#+}C_J`^KK}reufvzZ?VE&73ZJ-6<%C#bv(qlh)%(7fkID?t-q!G= z)Fzbb@6LlGFT&+H;58ZCgu>_0_mgz`2uTOGq4M~QWam%F zj|~@os+Hlt8`})f)7|=H_1r^OpeDuJg>=vLr0lXM^K77K(R{LQT_7TG52rlW5$xkA z)^{&b&Igd}x|u$06y&}KVXu<3VF5W;BV;diceYr>Hv{zcv^}Q2-ga8*Yf!lFqBZv% z-2N1zUz1n6TcO9$-7Tc5Je!jIWJ(JZ)QayJA;-~0?}dUT;3v!(AiU!8BH>~;tSHN* zv)yEo!wk^Z+wqwC2fC?9PeBv73GRsGr$s>DU&~8u`1Gp#c3vMmDo}P0bz*2()42tV=RR;U0R%cRh{2!3_pUyZjgII?JsIG-S>VaOAhxdpdrwiv!k=tL-)nI#NbmkGBSjr^fnp0g^|y_42OOxAZ8FEw)N=X zgWm#3H&?0CiT`35ts9=F(tZ+N;`ADP_zStu`+7R$V9z4y*_(cDC>`ITM;y;1?PhXl z)t}|5Gy{x`42w~=Q>ct5?BE8DZM7xnkORpvff#h9^5`Et7^TeDmO$Btb~V wGze4XX2g(o{R~CwL~>PWqc5lb@7MEx1Dl(R0!OfO<^TWy07*qoM6N<$f{wIkKmY&$ literal 0 HcmV?d00001 diff --git a/vbox-icons/state_running_16px.png b/vbox-icons/state_running_16px.png new file mode 100644 index 0000000000000000000000000000000000000000..dd95f9c0f196445d59ce069888c3fdc4e5dc5697 GIT binary patch literal 3489 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 P00000NkvXXu0mjf=%cz` literal 0 HcmV?d00001 diff --git a/vbox-icons/vrdp_16px.png b/vbox-icons/vrdp_16px.png new file mode 100644 index 0000000000000000000000000000000000000000..29e859c69958a02414de66566f4d6ad39d1f12ec GIT binary patch literal 3358 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 + + vbox-icons/os_archlinux_64.png + vbox-icons/os_archlinux.png + vbox-icons/os_debian_64.png + vbox-icons/os_debian.png + vbox-icons/os_dos.png + vbox-icons/os_fedora_64.png + vbox-icons/os_fedora.png + vbox-icons/os_freebsd_64.png + vbox-icons/os_freebsd.png + vbox-icons/os_gentoo_64.png + vbox-icons/os_gentoo.png + vbox-icons/os_l4.png + vbox-icons/os_linux22.png + vbox-icons/os_linux24_64.png + vbox-icons/os_linux24.png + vbox-icons/os_linux26_64.png + vbox-icons/os_linux26.png + vbox-icons/os_linux_other.png + vbox-icons/os_linux.png + vbox-icons/os_mandriva_64.png + vbox-icons/os_mandriva.png + vbox-icons/os_netbsd_64.png + vbox-icons/os_netbsd.png + vbox-icons/os_netware.png + vbox-icons/os_openbsd_64.png + vbox-icons/os_openbsd.png + vbox-icons/os_opensolaris_64.png + vbox-icons/os_opensolaris.png + vbox-icons/os_opensuse_64.png + vbox-icons/os_opensuse.png + vbox-icons/os_os2ecs.png + vbox-icons/os_os2_other.png + vbox-icons/os_os2warp3.png + vbox-icons/os_os2warp45.png + vbox-icons/os_os2warp4.png + vbox-icons/os_other.png + vbox-icons/os_qnx.png + vbox-icons/os_redhat_64.png + vbox-icons/os_redhat.png + vbox-icons/os_solaris_64.png + vbox-icons/os_solaris.png + vbox-icons/os_ubuntu_64.png + vbox-icons/os_ubuntu.png + vbox-icons/os_win2k3_64.png + vbox-icons/os_win2k3.png + vbox-icons/os_win2k8_64.png + vbox-icons/os_win2k8.png + vbox-icons/os_win2k.png + vbox-icons/os_win31.png + vbox-icons/os_win7_64.png + vbox-icons/os_win7.png + vbox-icons/os_win95.png + vbox-icons/os_win98.png + vbox-icons/os_winme.png + vbox-icons/os_winnt4.png + vbox-icons/os_win_other.png + vbox-icons/os_winvista_64.png + vbox-icons/os_winvista.png + vbox-icons/os_winxp_64.png + vbox-icons/os_winxp.png + vbox-icons/os_xandros_64.png + vbox-icons/os_xandros.png + vbox-icons/state_running_16px.png + vbox-icons/vrdp_16px.png + + diff --git a/widgets.cpp b/widgets.cpp new file mode 100644 index 0000000..1583472 --- /dev/null +++ b/widgets.cpp @@ -0,0 +1,102 @@ +/* BEGIN_COMMON_COPYRIGHT_HEADER + * (c)LGPL2+ + * + * LXDE-Qt - a lightweight, Qt based, desktop toolset + * http://razor-qt.org + * + * Copyright: 2010-2011 Razor team + * Authors: + * Alexander Sokoloff + * + * This program or 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 + * + * END_COMMON_COPYRIGHT_HEADER */ + +#include "widgets.h" + +#include +#include + + +#include +#include +#include + + +/************************************************ + + ************************************************/ +HorizSizeGrip::HorizSizeGrip(QWidget *parent): + QWidget(parent) +{ +} + + +/************************************************ + + ************************************************/ +void HorizSizeGrip::mouseMoveEvent(QMouseEvent *event) +{ + if (!parentWidget()) + return; + + QWidget *parent = parentWidget(); + while (parent->parentWidget() && !parent->isWindow()) + { + parent = parent->parentWidget(); + } + + QRect rect = parent->geometry(); + int delta = event->globalPos().x() - rect.center().x(); + + bool isLeft = pos().x() < parent->size().width() - geometry().right(); + if (isLeft) + { + rect.setLeft(event->globalPos().x()); + rect.setRight(parent->geometry().center().x() - delta); + } + else + { + rect.setLeft(parent->geometry().center().x() - delta); + rect.setRight(event->globalPos().x()); + } + + if (rect.width() < parent->minimumWidth() || + rect.width() > parent->maximumWidth()) + return; + + parent->setGeometry(rect); +} + + +/************************************************ + + ************************************************/ +CommandComboBox::CommandComboBox(QWidget *parent) : + QComboBox(parent) +{ + +} + + +/************************************************ + + ************************************************/ +CommandListView::CommandListView(QWidget *parent) : + QListView(parent) +{ + +} diff --git a/widgets.h b/widgets.h new file mode 100644 index 0000000..8eb071c --- /dev/null +++ b/widgets.h @@ -0,0 +1,72 @@ +/* BEGIN_COMMON_COPYRIGHT_HEADER + * (c)LGPL2+ + * + * LXDE-Qt - a lightweight, Qt based, desktop toolset + * http://razor-qt.org + * + * Copyright: 2010-2011 Razor team + * Authors: + * Alexander Sokoloff + * + * This program or 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 + * + * END_COMMON_COPYRIGHT_HEADER */ + +#ifndef WIDGETS_H +#define WIDGETS_H + + +#include +#include +#include +#include + +class QEvent; + +class HorizSizeGrip: public QWidget +{ + Q_OBJECT +public: + HorizSizeGrip(QWidget *parent = 0); + +protected: + void mouseMoveEvent(QMouseEvent *event); + +}; + + +class CommandComboBox : public QComboBox +{ + Q_OBJECT +public: + explicit CommandComboBox(QWidget *parent = 0); +}; + + +class CommandListView : public QListView +{ + Q_OBJECT +public: + explicit CommandListView(QWidget *parent = 0); + +signals: + +public slots: + +}; + + +#endif // WIDGETS_H diff --git a/yamlparser.cpp b/yamlparser.cpp new file mode 100644 index 0000000..0cc0053 --- /dev/null +++ b/yamlparser.cpp @@ -0,0 +1,80 @@ +/* + * File: YamlParser.cpp + * Author: christian + * + * Created on 9. maj 2013, 13:13 + */ + +#include +#include +#include + +#include "yamlparser.h" + +YamlParser::YamlParser() +{ + state = start; +} + +YamlParser::~YamlParser() +{ +} + +void YamlParser::consumeLine(QString line) +{ + static QRegExp documentStart("---\\s*(\\[\\]\\s*)?"); + static QRegExp mapStart("(-\\s*)(\\w*)\\s*:(.*)$"); + static QRegExp mapEntry("(\\s*)(\\w*)\\s*:(.*)"); + static QRegExp continuation("(\\s*)(.*)"); + static QRegExp documentEnd("...\\s*"); + static QRegExp emptyLine("\\s*(#.*)?"); + + qDebug() << line; + + if (documentStart.exactMatch(line)) + { + m_ListOfMaps.clear(); + state = atdocumentstart; + m_CurrentIndent = -1; + } + else if (state == error) + { + // Skip + } + else if (emptyLine.exactMatch(line)) + { + // Skip + } + else if ((state == atdocumentstart || state == inlist) && mapStart.exactMatch(line)) + { + m_ListOfMaps << QMap(); + addEntryToCurrentMap(mapStart.cap(2), mapStart.cap(3)); + m_CurrentIndent = mapStart.cap(1).size(); + state = inlist; + } + else if (state == inlist && mapEntry.exactMatch(line) && mapEntry.cap(1).size() == m_CurrentIndent) + { + addEntryToCurrentMap(mapEntry.cap(2), mapEntry.cap(3)); + } + else if (state == inlist && continuation.exactMatch(line) && continuation.cap(1).size() > m_CurrentIndent) + { + m_ListOfMaps.last()[m_LastKey].append(continuation.cap(2)); + } + else if ((state == atdocumentstart || state == inlist) && documentEnd.exactMatch(line)) + { + qDebug() << "emitting:" << m_ListOfMaps; + emit newListOfMaps(m_ListOfMaps); + state = documentdone; + } + else + { + qWarning() << "Yaml parser could not read:" << line; + state = error; + } +} + +void YamlParser::addEntryToCurrentMap(QString key, QString value) +{ + m_ListOfMaps.last()[key.trimmed()] = value.trimmed(); + m_LastKey = key.trimmed(); +} diff --git a/yamlparser.h b/yamlparser.h new file mode 100644 index 0000000..9962f27 --- /dev/null +++ b/yamlparser.h @@ -0,0 +1,49 @@ +/* + * File: YamlParser.h + * Author: christian + * + * Created on 9. maj 2013, 13:13 + */ + +#ifndef YAMLPARSER_H +#define YAMLPARSER_H + +#include +#include +#include +#include + +class QIODevice; + +class YamlParser : public QObject +{ + Q_OBJECT +public: + YamlParser(); + virtual ~YamlParser(); + + void consumeLine(QString line); + +signals: + void newListOfMaps(QList > maps); + +private: + + QList > m_ListOfMaps; + + enum + { + start, + atdocumentstart, + inlist, + documentdone, + error + } state; + + int m_CurrentIndent; + QString m_LastKey; + + void addEntryToCurrentMap(QString key, QString value); +}; + +#endif /* YAMLPARSER_H */