diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e4c2d7b --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +ublexec.glade~ +#ublexec.glade# +test.cpp +.vscode +ublexec +nohup.out \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..178739f --- /dev/null +++ b/Makefile @@ -0,0 +1,141 @@ +#!/usr/bin/make -f +#!/usr/bin/make -f + +#SHELL := /bin/bash +MAKEFILE_FILEPATH := $(abspath $(lastword $(MAKEFILE_LIST))) +MAKEFILE_DIR := $(notdir $(patsubst %/,%,$(dir $(MAKEFILE_FILEPATH)))) +MAKEFILE_PATH := $(dir $(MAKEFILE_FILEPATH)) + +CMAKE_COMMAND = cmake +#CMAKE_SOURCE_DIR = $(MAKEFILE_PATH)source +#CMAKE_BUILD_DIR = $(MAKEFILE_PATH)compile +CMAKE_SOURCE_DIR = ./source +CMAKE_BUILD_DIR = ./compile +DEPENDS = cmake +#PKGNAME = $(MAKEFILE_DIR) +PKGNAME = ublexec + +default_target: all +all: init build + +init: + @echo "Initialize ..."; \ + version="$$(cat VERSION.md)"; \ + version=$${version:8}; \ + search="s/string version_application.*$&"; \ + replace="string version_application = \"$${version}\";"; \ + sed -i -e "$$search/$$replace/gi" source/ublexec.h; \ + echo "-- Build path: ${CMAKE_BUILD_DIR}" + +depend: + @echo "Check depends ..."; \ + if [ ! -f /bin/${DEPENDS} ]; then \ + echo "-- Depend '${DEPENDS}' not fount !"; \ + exit 1; \ + fi; \ + echo "Check depends: OK" +# $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 + +debug: + @echo "Debug ..." + if [ ! -d ${CMAKE_BUILD_DIR} ]; then \ + $(CMAKE_COMMAND) -S${CMAKE_SOURCE_DIR} -B${CMAKE_BUILD_DIR} -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX="/usr"; \ + fi; \ + echo "Debug: OK" + +prepare: + @echo "Prepare ..."; \ + if [ ! -d ${CMAKE_BUILD_DIR} ]; then \ + $(CMAKE_COMMAND) -S${CMAKE_SOURCE_DIR} -B${CMAKE_BUILD_DIR} -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX="/usr"; \ + fi; \ + echo "Prepare: OK" + +check: + @echo "Check ..."; \ + if [ -f ${CMAKE_BUILD_DIR}/${PKGNAME} ]; then \ + echo "Check: OK"; \ + else \ + echo "Check: ${CMAKE_BUILD_DIR}/${PKGNAME} not fount !"; \ + exit 1; \ + fi + +build: depend prepare + @echo "Build ..."; \ + make --directory=${CMAKE_BUILD_DIR}; \ + echo "Build: OK" + +uninstall: + @echo "Uninstall ..." + @for FILE_PO in $(wildcard *.po); do \ + LANG=$${FILE_PO##*_};LANG=$${LANG%.*}; \ + FILE_MO=$${FILE_PO##*/}; FILE_MO="$${FILE_MO%_*.po}.mo"; \ + PATH_FILE_MO="/usr/share/locale/$${LANG}/LC_MESSAGES/$${FILE_MO}"; \ + $(RM) "/usr/share/locale/$${LANG}/LC_MESSAGES/$${FILE_MO}"; \ + done +# @for SIZE in 16x16 32x32 48x48 scalable; do \ + $(RM) "/usr/share/icons/hicolor/$${SIZE}/apps/${PKGNAME}.svg"; \ + $(RM) "/usr/share/icons/hicolor/$${SIZE}/apps/${PKGNAME}.png"; \ + done +# @for FILE_SVG in $(wildcard *.svg); do \ + for SIZE in 16x16 32x32 48x48 scalable; do \ + $(RM) "/usr/share/icons/hicolor/$${SIZE}/status/$${FILE_SVG%.*}".{svg,png,jpg}; \ + done; \ + done + @$(RM) "/usr/bin/${PKGNAME}" + @$(RM) "/usr/share/applications/${PKGNAME}.desktop" + @$(RM) "/usr/share/polkit-1/actions/ru.ublinux.pkexec.${PKGNAME}.exec.policy" + @$(RM) -rd "/usr/share/${PKGNAME}" + @gtk-update-icon-cache -fiq /usr/share/icons/hicolor/ &>/dev/null + @update-desktop-database --quiet 2>/dev/null + @touch /usr/share/applications + @echo "Uninstall: OK" + +install: check uninstall + @echo "Install ..." + @for FILE_PO in $(wildcard *.po); do \ + LANG=$${FILE_PO##*_};LANG=$${LANG%.*}; \ + install -dm755 /usr/share/locale/$${LANG}/LC_MESSAGES; \ + FILE_MO=$${FILE_PO##*/}; FILE_MO="$${FILE_MO%_*.po}.mo"; \ + PATH_FILE_MO="/usr/share/locale/$${LANG}/LC_MESSAGES/$${FILE_MO}"; \ + echo $${FILE_PO}; \ + msgfmt "$${FILE_PO}" -v -f -o "$${PATH_FILE_MO}"; \ + done + @for SIZE in 16 32 48; do \ + install -dm755 /usr/share/icons/hicolor/$${SIZE}x$${SIZE}/apps; \ + rsvg-convert -w $${SIZE} -h $${SIZE} -f svg --keep-image-data ${PKGNAME}.svg -o "/usr/share/icons/hicolor/$${SIZE}x$${SIZE}/apps/${PKGNAME}.svg"; \ + done + @install -dm755 /usr/share/icons/hicolor/scalable/apps + @install -Dm644 -t /usr/share/icons/hicolor/scalable/apps/ ${PKGNAME}.svg + @install -Dm755 -t /usr/bin/ ${CMAKE_BUILD_DIR}/${PKGNAME} + @install -Dm644 -t /usr/share/applications/ ${PKGNAME}.desktop + @install -Dm644 -t /usr/share/polkit-1/actions/ org.ublinux.pkexec.${PKGNAME}.exec.policy + @install -dm755 /usr/share/${PKGNAME}/{ui,css,images} + @install -Dm644 -t /usr/share/${PKGNAME}/ui/ ${PKGNAME}.glade + @install -Dm644 -t /usr/share/${PKGNAME}/css/ style.css + @install -Dm644 -t /usr/share/${PKGNAME}/images/ bg_top.png + @install -Dm644 -t /usr/share/${PKGNAME}/images/ ${PKGNAME}.svg +# @install -Dm644 -t /usr/share/${PKGNAME}/images/ ${PKGNAME}.png + @gtk-update-icon-cache -fiq /usr/share/icons/hicolor/ + @update-desktop-database --quiet 2>/dev/null + @touch /usr/share/applications + @echo "Install: OK" + +clean: + @echo "Clean ..." + @$(RM) -rd ${CMAKE_BUILD_DIR} + @if [ -d ${CMAKE_BUILD_DIR} ]; then \ + echo "Clean: error, compile directory exist ${CMAKE_BUILD_DIR}"; \ + else \ + echo "Clean: OK"; \ + fi + +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... init" + @echo "... debug" + @echo "... prepare" + @echo "... compile" + @echo "... install" + @echo "... uninstall" + @echo "... clean" \ No newline at end of file diff --git a/README.md b/README.md index 141ec06..eacfcda 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,28 @@ # ublexec +# Выполнить +# Build +In order to build ublexec you will need: + +- CMake +- C compiler +- GTK+ 3 & dependencies + +Once you have all the necessary dependencies, you can use: +```sh +$ make +``` + +# Installation +After a successful build, just use: +```sh +$ sudo make install clean +``` + +# Uninstallation +After a successful build, just use: +```sh +$ sudo make uninstall +``` + +![alt text](screenshot/screenshot.png) diff --git a/VERSION.md b/VERSION.md new file mode 100644 index 0000000..12ebd01 --- /dev/null +++ b/VERSION.md @@ -0,0 +1 @@ +VERSION 1.0 diff --git a/bg_top.png b/bg_top.png new file mode 100644 index 0000000..8eb67cb Binary files /dev/null and b/bg_top.png differ diff --git a/org.ublinux.pkexec.ublexec.exec.policy b/org.ublinux.pkexec.ublexec.exec.policy new file mode 100644 index 0000000..3664113 --- /dev/null +++ b/org.ublinux.pkexec.ublexec.exec.policy @@ -0,0 +1,24 @@ + + + + + UBLinux + https://ublinux.ru + + + Run "ublexec" as root + Запус "Выполнить" с правами root + Authentication is required to run ublexec + Требуется авторизация для запуска "Выполнить" с правами root + + auth_admin + auth_admin + auth_admin + + /usr/bin/ublexec + true + + + diff --git a/screenshot/screenshot.png b/screenshot/screenshot.png new file mode 100644 index 0000000..f2c3476 Binary files /dev/null and b/screenshot/screenshot.png differ diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt new file mode 100644 index 0000000..543d234 --- /dev/null +++ b/source/CMakeLists.txt @@ -0,0 +1,30 @@ +cmake_minimum_required(VERSION 3.7) +project(ublexec) + +find_package(PkgConfig REQUIRED) + +pkg_check_modules(GTK REQUIRED gtkmm-3.0) +include_directories(${GTK_INCLUDE_DIRS}) +link_directories(${GTK_LIBRARY_DIRS}) +add_definitions(${GTK_CFLAGS_OTHER}) +find_package(Threads REQUIRED) + +#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic -Wall -Wextra -Werror -Wmissing-declarations -fdiagnostics-color=always -std=c++2a -g") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic -Wmissing-declarations -fdiagnostics-color=always") +set(CMAKE_CXX_STANDARD 20) +set(CMAKE_CXX_STANDARD_REQUIRED ON) + +set(SOURCE_FILES + main.cc + ublexec.cc + ublexec.h + ubl-util-standard.h + ubl-util-standard.c) + +set(LIBRARIES + ${GTK_LIBRARIES} + pthread) + +add_executable(ublexec ${SOURCE_FILES}) +target_link_libraries(ublexec ${LIBRARIES} Threads::Threads) +install(TARGETS ublexec DESTINATION bin) diff --git a/source/main.cc b/source/main.cc new file mode 100755 index 0000000..dea0329 --- /dev/null +++ b/source/main.cc @@ -0,0 +1,54 @@ +#include "ublexec.h" + + +int main(int argc, char** argv) +{ + + string str_cmd_argv = ""; + for (int i=1; irun(plug); + return 0; + } + else { + + MainWindow* wnd = nullptr; + builder->get_widget_derived("window", wnd); + auto r = app->run(*wnd); + delete wnd; + return r; + } + +} \ No newline at end of file diff --git a/source/ubl-util-standard.c b/source/ubl-util-standard.c new file mode 100644 index 0000000..8cff122 --- /dev/null +++ b/source/ubl-util-standard.c @@ -0,0 +1,69 @@ +#include "ubl-util-standard.h" +#ifndef __cplusplus +#ifndef UBL_GET_STANDARD_UI +#define UBL_GET_STANDARD_UI + + +inline returnstruct *ubl_make_plugs(GtkWidget *LeftWidget, GtkWidget *RightWidget, int left_plug_id, int right_plug_id){ + returnstruct *ret=(returnstruct*)malloc(sizeof(returnstruct*)); + if (left_plug_id>0&&LeftWidget){ + GtkWidget *plug=gtk_plug_new(left_plug_id); + GtkWidget *toplug=LeftWidget; + if (gtk_widget_get_parent(GTK_WIDGET(toplug))){ + g_object_ref(G_OBJECT(toplug)); + GtkWidget *parent=gtk_widget_get_parent(toplug); + gtk_container_remove(GTK_CONTAINER(parent),toplug); + gtk_container_add(GTK_CONTAINER(plug),GTK_WIDGET(toplug)); + } else + gtk_container_add(GTK_CONTAINER(plug),GTK_WIDGET(toplug)); + gtk_widget_show(GTK_WIDGET(plug)); + ret->plugLeft=plug; + } + if (right_plug_id>0&&RightWidget){ + GtkWidget *plug=gtk_plug_new(right_plug_id); + GtkWidget *toplug=RightWidget; + if (gtk_widget_get_parent(GTK_WIDGET(toplug))){ + g_object_ref(G_OBJECT(toplug)); + GtkWidget *parent=gtk_widget_get_parent(toplug); + gtk_container_remove(GTK_CONTAINER(parent),toplug); + gtk_container_add(GTK_CONTAINER(plug),GTK_WIDGET(toplug)); + } else + gtk_container_add(GTK_CONTAINER(plug),GTK_WIDGET(toplug)); + gtk_widget_show(GTK_WIDGET(plug)); + ret->plugRight=plug; + } + return ret; +} + +#endif + +#else + + +inline void ubl_make_plugs(Gtk::Widget *LeftWidget, Gtk::Widget *RightWidget, int left_plug_id, int right_plug_id){ + if (left_plug_id>0&&LeftWidget){ + GtkWidget *plug=gtk_plug_new(left_plug_id); + GtkWidget *toplug=GTK_WIDGET(LeftWidget->gobj()); + if (gtk_widget_get_parent(GTK_WIDGET(toplug))){ + g_object_ref(G_OBJECT(toplug)); + GtkWidget *parent=gtk_widget_get_parent(toplug); + gtk_container_remove(GTK_CONTAINER(parent),toplug); + gtk_container_add(GTK_CONTAINER(plug),GTK_WIDGET(toplug)); + } else + gtk_container_add(GTK_CONTAINER(plug),GTK_WIDGET(toplug)); + gtk_widget_show(GTK_WIDGET(plug)); + } + if (right_plug_id>0&&RightWidget){ + GtkWidget *plug=gtk_plug_new(right_plug_id); + GtkWidget *toplug=GTK_WIDGET(RightWidget->gobj()); + if (gtk_widget_get_parent(GTK_WIDGET(toplug))){ + g_object_ref(G_OBJECT(toplug)); + GtkWidget *parent=gtk_widget_get_parent(toplug); + gtk_container_remove(GTK_CONTAINER(parent),toplug); + gtk_container_add(GTK_CONTAINER(plug),GTK_WIDGET(toplug)); + } else + gtk_container_add(GTK_CONTAINER(plug),GTK_WIDGET(toplug)); + gtk_widget_show(GTK_WIDGET(plug)); + } +} +#endif \ No newline at end of file diff --git a/source/ubl-util-standard.h b/source/ubl-util-standard.h new file mode 100644 index 0000000..3209625 --- /dev/null +++ b/source/ubl-util-standard.h @@ -0,0 +1,20 @@ +#ifndef __cplusplus +#include +#include + +typedef struct { + GtkWidget *plugLeft; + GtkWidget *plugRight; + + +} returnstruct; +static returnstruct *ubl_make_plugs(GtkWidget *LeftWidget, GtkWidget *RightWidget, int left_plug_id, int right_plug_id); +#else +#include +#include +#include +#include + + +static void ubl_make_plugs(Gtk::Widget *LeftWidget, Gtk::Widget *RightWidget, int left_plug_id, int right_plug_id); +#endif \ No newline at end of file diff --git a/source/ublexec.cc b/source/ublexec.cc new file mode 100644 index 0000000..11fa404 --- /dev/null +++ b/source/ublexec.cc @@ -0,0 +1,753 @@ +#include "ublexec.h" +using namespace std; +string path_app= "/usr/bin/"; +string path_glade= "/usr/share/ublexec/ui/ublexec.glade"; +string path_css = "/usr/share/ublexec/css/style.css"; +string app_name = "ublexec"; +int socket_ext_id_I=0; +int socket_trd_id_I=0; +CmdArgParser::CmdArgParser(const std::string& p_name, const std::string& p_description, const std::string& p_help) +: Glib::OptionGroup{p_name, p_description, p_help} { + Glib::OptionEntry socketIDArg; + socketIDArg.set_long_name("socket-id"); + socketIDArg.set_flags(Glib::OptionEntry::FLAG_IN_MAIN); + socketIDArg.set_description("Settings manager socket"); + + Glib::OptionEntry socketExtId; + socketExtId.set_long_name("socket-ext-id"); + socketExtId.set_flags(Glib::OptionEntry::FLAG_IN_MAIN); + socketExtId.set_description("Settings manager secondary socket"); + + Glib::OptionEntry socketTrdId; + socketTrdId.set_long_name("socket-trd-id"); + socketTrdId.set_flags(Glib::OptionEntry::FLAG_IN_MAIN); + socketTrdId.set_description("Settings manager secondary socket"); + + add_entry(socketIDArg, m_socketID); + add_entry(socketExtId, socket_ext_id_I); + add_entry(socketTrdId, socket_trd_id_I); +} +::Window CmdArgParser::GetSocketID() const{ + return m_socketID; +} + +MainWindow::MainWindow(BaseObjectType* obj, Glib::RefPtr const& builder) + : Gtk::ApplicationWindow(obj), builder{builder} { + this->builder = builder; + this->settings(); +} + +MainWindow::MainWindow(Glib::RefPtr const& builder) { + this->builder = builder; + this->settings(); +} + +void MainWindow::get_builder(){ + builder->get_widget("btnFilemaneg", btnFilemaneg); + builder->get_widget("btnListApp", btnListApp); + builder->get_widget("btnStart", btnStart); + builder->get_widget("chbTerminal", chbTerminal); + builder->get_widget("chbAnotherUser", chbAnotherUser); + builder->get_widget("cbxExecuteEpriority", cbxExecuteEpriority); + builder->get_widget("cmbUser", cmbUser); + builder->get_widget("spinPriority", spinPriority); + builder->get_widget("scalePriority", scalePriority); + builder->get_widget("rbPkexec", rbPkexec); + builder->get_widget("rbSu", rbSu); + builder->get_widget("rbSudo", rbSudo); + builder->get_widget("txtCmd", txtCmd); + builder->get_widget("wndChooseFileWallpaper", wndChooseFileWallpaper); + builder->get_widget("btnFilemangerExit", btnFilemangerExit); + builder->get_widget("btnFilemangerOk", btnFilemangerOk); + builder->get_widget("lblTimeEpriorityLow", lblTimeEpriorityLow); + builder->get_widget("lblTime4EpriorityHigh", lblTime4EpriorityHigh); + builder->get_widget("messageError", messageError); + builder->get_widget("lblMessageError", lblMessageError); + builder->get_widget("btnMessageErrorOk", btnMessageErrorOk); + builder->get_widget("btnMessageErrorOk", btnMessageErrorOk); + builder->get_widget("btnMessageErrorOk", btnMessageErrorOk); + builder->get_widget("dialogStartMenu", dialogStartMenu); + builder->get_widget("btnStartMenuOK", btnStartMenuOK); + builder->get_widget("btnStartMenuExit", btnStartMenuExit); + builder->get_widget("lblInfoHead", lblInfoHead); + builder->get_widget("lblinfoCmd", lblinfoCmd); + builder->get_widget("lblInfoTime", lblInfoTime); + builder->get_widget("labInfoExecutTerm", labInfoExecutTerm); + builder->get_widget("lblInfoUser", lblInfoUser); + builder->get_widget("lblInfoUserOther", lblInfoUserOther); + builder->get_widget("lblInfoUserName", lblInfoUserName); + builder->get_widget("lblInfoNooPriority", lblInfoNooPriority); + builder->get_widget("lblInfoExec", lblInfoExec); + builder->get_widget("lblInfoPriority", lblInfoPriority); + builder->get_widget("boxColor", boxColor); + builder->get_widget("lblGraphics", lblGraphics); + builder->get_widget("lblTools", lblTools); + builder->get_widget("lblInternet", lblInternet); + builder->get_widget("lblMultimedia", lblMultimedia); + builder->get_widget("lblSettings", lblSettings); + builder->get_widget("lblEducation", lblEducation); + builder->get_widget("lblOffice", lblOffice); + builder->get_widget("lblOther", lblOther); + builder->get_widget("lblDevelopment", lblDevelopment); + builder->get_widget("iconGraphics", iconGraphics); + builder->get_widget("iconTools", iconTools); + builder->get_widget("iconInternet", iconInternet); + builder->get_widget("iconMultimedia", iconMultimedia); + builder->get_widget("iconSettings", iconSettings); + builder->get_widget("iconEducation", iconEducation); + builder->get_widget("iconOffice", iconOffice); + builder->get_widget("iconOther", iconOther); + builder->get_widget("iconDevelopment", iconDevelopment); + builder->get_widget("iconSystem", iconSystem); + builder->get_widget("lblSystem", lblSystem); + builder->get_widget("lblHeaderName", lblHeaderName); + builder->get_widget("btnSynopsis", btnSynopsis); + builder->get_widget("btnAbout", btnAbout); + builder->get_widget("aboutWindows", aboutWindows); + builder->get_widget("btnSettings", btnSettings); + builder->get_widget("btnBoxAboutDialog", btnBoxAboutDialog); +} + +void MainWindow::set_icon_array(){ + array_icon[0]=this->iconGraphics; + array_icon[1]=this->iconTools; + array_icon[2]=this->iconInternet; + array_icon[3]=this->iconMultimedia; + array_icon[4]=this->iconSettings; + array_icon[5]=this->iconEducation; + array_icon[6]=this->iconOffice; + array_icon[7]=this->iconOther; + array_icon[8]=this->iconDevelopment; + array_icon[9]=this->iconSystem; +} + +void MainWindow::template_apps_obj(Gtk::IconView *icon, Glib::RefPtr >k_list_app){ + gtk_list_app = Gtk::ListStore::create(m_Columns); + gtk_list_app->set_sort_column(m_Columns.m_col_description, Gtk::SORT_ASCENDING); + icon->set_model(gtk_list_app); + icon->set_text_column(m_Columns.m_col_description); +} + +void MainWindow::add_CSS(){ + Glib::RefPtr cssProvider = Gtk::CssProvider::create(); + cssProvider->load_from_path(path_css); + Glib::RefPtr styleContext = Gtk::StyleContext::create(); + Glib::RefPtr screen = Gdk::Screen::get_default();//get default screen + styleContext->add_provider_for_screen(screen, cssProvider, GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);//add provider for screen in all application + Glib::RefPtr context_box = boxColor->get_style_context(); + Glib::RefPtr context_lbl_head = lblInfoHead->get_style_context(); + context_box->add_class("cssboxColor1"); + context_lbl_head->add_class("textHead"); +} + +void MainWindow::localization(){ + aboutWindows->set_website(_("https://wiki.ublinux.com")); + btnSynopsis->set_label(_("Help")); + btnAbout->set_label(_("About the program")); + aboutWindows->set_comments(_("ublexec")); + aboutWindows->set_website_label(_("Project Home Page")); + aboutWindows->set_version(_(version_application.c_str())); + lblHeaderName->set_text(_("ublexec")); + this->set_title(_("ublexec")); + btnStart->set_label(_("Run")); + wndChooseFileWallpaper->set_title(_("Please select File")); + dialogStartMenu->set_title(_("Selecting Programs")); + lblInfoHead->set_text(_("Running applications as a user with a\nspecified priority")); + lblinfoCmd->set_text(_("Command Line")); + lblInfoTime->set_text(_("Team")); + labInfoExecutTerm->set_text(_("Run in the terminal emulator")); + lblInfoUser->set_text(_("User")); + lblInfoUserOther->set_text(_("Run as another user")); + lblInfoUserName->set_text(_("User Name")); + lblInfoNooPriority->set_text(_("Priority")); + lblInfoExec->set_text(_("Change startup priority")); + lblInfoPriority->set_text(_("Priority")); + lblMessageError->set_text(_("Select an executable file or program")); + lblGraphics->set_text(_("Graphics")); + lblTools->set_text(_("Tools")); + lblInternet->set_text(_("Internet")); + lblMultimedia->set_text(_("Multimedia")); + lblSettings->set_text(_("Settings")); + lblEducation->set_text(_("Education")); + lblOffice->set_text(_("Office")); + lblOther->set_text(_("Other")); + lblDevelopment->set_text(_("Development")); + lblSystem->set_text(_("System")); +} + +void MainWindow::event(){ + btnFilemaneg->signal_clicked().connect(sigc::mem_fun(*this, &MainWindow::open_filemaneg)); + btnListApp->signal_clicked().connect(sigc::mem_fun(*this, &MainWindow::open_list_app)); + btnStart->signal_clicked().connect(sigc::mem_fun(*this, &MainWindow::entry_app)); + chbTerminal->signal_toggled().connect(sigc::mem_fun(*this, &MainWindow::denamic_cmd)); + chbAnotherUser->signal_toggled().connect(sigc::mem_fun(*this, &MainWindow::activ_or_block_other_user)); + spinPriority->signal_value_changed().connect(sigc::mem_fun(*this, &MainWindow::change_scale_priority)); + scalePriority->signal_value_changed().connect(sigc::mem_fun(*this, &MainWindow::change_spin_priority)); + btnFilemangerExit->signal_clicked().connect(sigc::mem_fun(*this, &MainWindow::close_filemaneg)); + btnFilemangerOk->signal_clicked().connect(sigc::mem_fun(*this, &MainWindow::get_path_filemaneg)); + cbxExecuteEpriority->signal_toggled().connect(sigc::mem_fun(*this, &MainWindow::activ_or_block_execute_epriority)); + btnMessageErrorOk->signal_clicked().connect(sigc::mem_fun(*this, &MainWindow::message_gui_close)); + btnStartMenuOK->signal_clicked().connect(sigc::mem_fun(*this, &MainWindow::start_menu_entry_app)); + btnStartMenuExit->signal_clicked().connect(sigc::mem_fun(*this, &MainWindow::close_entry_app)); + btnStartMenuOK->signal_clicked().connect(sigc::mem_fun(*this, &MainWindow::ok_close_entry_app)); + iconGraphics->signal_selection_changed().connect(sigc::mem_fun(*this,&MainWindow::select_Graphics)); + iconTools->signal_selection_changed().connect(sigc::mem_fun(*this,&MainWindow::select_Tools)); + iconInternet->signal_selection_changed().connect(sigc::mem_fun(*this,&MainWindow::select_Internet)); + iconMultimedia->signal_selection_changed().connect(sigc::mem_fun(*this,&MainWindow::select_Multimedia)); + iconSettings->signal_selection_changed().connect(sigc::mem_fun(*this,&MainWindow::select_Settings)); + iconEducation->signal_selection_changed().connect(sigc::mem_fun(*this,&MainWindow::select_Education)); + iconOffice->signal_selection_changed().connect(sigc::mem_fun(*this,&MainWindow::select_Office)); + iconOther->signal_selection_changed().connect(sigc::mem_fun(*this,&MainWindow::select_Other)); + iconDevelopment->signal_selection_changed().connect(sigc::mem_fun(*this,&MainWindow::select_Development)); + iconSystem->signal_selection_changed().connect(sigc::mem_fun(*this,&MainWindow::select_System)); + btnSynopsis->signal_activate().connect(sigc::mem_fun(*this, &MainWindow::synopsis_show)); + btnAbout->signal_activate().connect([&](){aboutWindows->show();}); + cmbUser->signal_changed().connect([&](){denamic_cmd();changed_user();}); + rbSudo->signal_toggled().connect(sigc::mem_fun(*this, &MainWindow::denamic_cmd)); + txtCmd->signal_focus_out_event().connect(sigc::mem_fun(*this, &MainWindow::focus_out_txt_cmd)); + txtCmd->signal_focus_in_event().connect(sigc::mem_fun(*this, &MainWindow::focus_in_txt_cmd)); + txtCmd->signal_delete_text().connect(sigc::mem_fun(*this, &MainWindow::delete_cmd)); +} +void MainWindow::delete_cmd(const int &x,const int &y){ + if (y>1){ + chbTerminal->set_active(false); + chbAnotherUser->set_active(false); + cbxExecuteEpriority->set_active(false); + txtCmd->set_text(""); + } +} + +bool MainWindow::focus_in_txt_cmd(GdkEventFocus* event){ + if (user_cmd.length() != 0){ + //user_cmd_old = user_cmd;gi + } + else if (name_app.length() != 0){ + //name_app_old = name_app; + } + else if (path_file.length() != 0){ + //path_file_old = path_file; + } + else{ + user_cmd = txtCmd->get_text(); + } + cmd_old = txtCmd->get_text(); + return true; +} + + +void MainWindow::synopsis_show(){ + system("xdg-open https://wiki.ublinux.ru/ru/home &"); +} + +void MainWindow::icon_clear(){ + list_Graphics->clear(); + list_Tools->clear(); + list_Internet->clear(); + list_Multimedia->clear(); + list_Settings->clear(); + list_Education->clear(); + list_Office->clear(); + list_Other->clear(); + list_Development->clear(); + list_System->clear(); +} + +void MainWindow::ok_close_entry_app(){ + this->icon_clear(); + dialogStartMenu->hide(); +} + +void MainWindow::select_Graphics(){ + this->tempate_icon_select(this->iconGraphics,list_Graphics); +} +void MainWindow::select_Tools(){ + this->tempate_icon_select(this->iconTools,list_Tools); +} +void MainWindow::select_Internet(){ + this->tempate_icon_select(this->iconInternet,list_Internet); +} +void MainWindow::select_Multimedia(){ + this->tempate_icon_select(this->iconMultimedia,list_Multimedia); +} +void MainWindow::select_Settings(){ + this->tempate_icon_select(this->iconSettings,list_Settings); +} +void MainWindow::select_Education(){ + this->tempate_icon_select(this->iconEducation,list_Education); +} +void MainWindow::select_Office(){ + this->tempate_icon_select(this->iconOffice,list_Office); +} +void MainWindow::select_Other(){ + this->tempate_icon_select(this->iconOther,list_Other); +} +void MainWindow::select_Development(){ + this->tempate_icon_select(this->iconDevelopment,list_Development); +} +void MainWindow::select_System(){ + this->tempate_icon_select(this->iconSystem,list_System); +} +void MainWindow::tempate_icon_select(Gtk::IconView *icon, Glib::RefPtr >k_list){ + auto selected = (*icon).get_selected_items(); + if(!selected.empty()) + { + this->set_icon_array(); + this->unselect_icon(icon); + const Gtk::TreeModel::Path& path = *selected.begin(); + Gtk::TreeModel::iterator iter = gtk_list->get_iter(path); + Gtk::TreeModel::Row row = *iter; + auto app_name_exec = row[m_Columns.app_name_exec]; + const Glib::ustring description = row[m_Columns.m_col_description]; + path_file = ""; + name_app = ""; + user_cmd = ""; + txtCmd->set_text(app_name_exec); + name_app = txtCmd->get_text(); + int len_name_app = name_app.length(); + string array_del[] = {"%f","%F","%d","%D","%n","%N","%U"}; + for (auto &del_sim: array_del){ + str_remove(name_app, del_sim); + if (name_app.length()!=len_name_app){ + txtCmd->set_text(name_app); + break; + } + } + } +} + +void MainWindow::unselect_icon(Gtk::IconView *icon_entry){ + for (int index=0; index<10; ++index){ + Gtk::IconView *icon = this->array_icon[index]; + if (icon_entry!=icon){ + icon->unselect_all(); + } + } +} + +void MainWindow::settings(){ + this->pars_apps(); + this->get_builder(); + this->event(); + this->localization(); + this->add_CSS(); + spinPriority->set_range(0,19); + spinPriority->set_increments(1.0,-1.0); + scalePriority->set_range(0,19); + scalePriority->set_value(0); + lblTimeEpriorityLow->set_text("19 (Низкий)"); + lblTime4EpriorityHigh->set_text("0 (Высокий)"); + scalePriority->set_inverted(true); + this->pars_dir_bin(); + this->pars_users(); + this->activ_or_block_execute_epriority(); + this->changed_user(); + cmbUser->set_active(0); + cmbUser->set_sensitive(false); + lblInfoUserName->set_sensitive(false); + rbPkexec->set_sensitive(false); + rbSu->set_sensitive(false); + rbSudo->set_sensitive(false); + btnBoxAboutDialog->set_visible(false); + Gtk::Widget *boxAbout; + builder->get_widget("boxAbout",boxAbout); + + ubl_make_plugs(boxAbout,boxAbout, 0, socket_trd_id_I); + +} +void MainWindow::close_entry_app(){ + this->icon_clear(); + dialogStartMenu->hide(); +} + +void MainWindow::start_menu_entry_app(){} + +void MainWindow::message_gui_close(){ + messageError->hide(); +} + +void MainWindow::activ_or_block_execute_epriority(){ + bool flag = cbxExecuteEpriority->get_active(); + scalePriority->set_sensitive(flag); + spinPriority->set_sensitive(flag); + lblInfoNooPriority->set_sensitive(flag); + lblTimeEpriorityLow->set_sensitive(flag); + lblTime4EpriorityHigh->set_sensitive(flag); + this->denamic_cmd(); +} + +void MainWindow::open_filemaneg(){ + wndChooseFileWallpaper->show(); +} + +void MainWindow::close_filemaneg(){ + wndChooseFileWallpaper->hide(); +} + +void MainWindow::get_path_filemaneg(){ + name_app = ""; + user_cmd = ""; + path_file = wndChooseFileWallpaper->get_filename(); + if (path_file.length() == 0){} + else{ + txtCmd->set_text(path_file); + this->close_filemaneg(); + + } + this->denamic_cmd(); +} + +void MainWindow::tempalte_row(string Name, string Exec, string path , Glib::RefPtr &dtk_list){ + Gtk::TreeModel::Row row = *(dtk_list->append()); + row[m_Columns.m_col_filename] = path; + row[m_Columns.m_col_description] = Name; + row[m_Columns.icon_name] = path; + row[m_Columns.app_name_exec] = Exec; + row[m_Columns.float_h_align] = 0.5; + row[m_Columns.float_w_align] = 0.5; +} + +void MainWindow::open_list_app(){ + this->template_apps_obj(iconGraphics, list_Graphics); + this->template_apps_obj(iconTools, list_Tools); + this->template_apps_obj(iconInternet, list_Internet); + this->template_apps_obj(iconMultimedia, list_Multimedia); + this->template_apps_obj(iconSettings, list_Settings); + this->template_apps_obj(iconEducation, list_Education); + this->template_apps_obj(iconOffice, list_Office); + this->template_apps_obj(iconOther, list_Other); + this->template_apps_obj(iconDevelopment, list_Development); + this->template_apps_obj(iconSystem, list_System); + string path = ""; + for ( const auto &st_app : list_app){ + for ( const auto &str_categor : st_app.Categories){ + path = st_app.Icon; + if (str_categor=="Graphics"){ + this->tempalte_row(st_app.Name,st_app.Exec, path, list_Graphics); + } + else if (str_categor=="Utility"){ + this->tempalte_row(st_app.Name,st_app.Exec, path, list_Tools); + } + else if (str_categor=="Network"){ + this->tempalte_row(st_app.Name,st_app.Exec, path,list_Internet); + } + else if (str_categor== "AudioVideo"){ + this->tempalte_row(st_app.Name,st_app.Exec, path, list_Multimedia); + } + else if (str_categor=="Settings"){ + this->tempalte_row(st_app.Name,st_app.Exec, path, list_Settings); + } + else if (str_categor=="Education"){ + this->tempalte_row(st_app.Name,st_app.Exec, path, list_Education); + } + else if (str_categor=="Office"){ + this->tempalte_row(st_app.Name,st_app.Exec, path, list_Office); + } + else if (str_categor=="Other"){ + this->tempalte_row(st_app.Name,st_app.Exec, path, list_Other); + } + else if (str_categor=="Development"){ + this->tempalte_row(st_app.Name,st_app.Exec, path, list_Development); + } + else if (str_categor=="System"){ + this->tempalte_row(st_app.Name,st_app.Exec, path, list_System); + } + } + } + dialogStartMenu->show_all(); +} + + +string MainWindow::start_cmd(string user_cmd){ + string str_cmd_terminal=""; + string str_variants_root = ""; + string str_nice_cmd = ""; + if (chbAnotherUser->get_active()){ + if (geteuid()!=0){ + //chbTerminal->set_active(true); + } + if (rbPkexec->get_active()){ + str_variants_root = " pkexec --user " + cmbUser->get_active_text(); + if (cbxExecuteEpriority->get_active()){ + str_variants_root += " nice -n " + to_string(spinPriority->get_value_as_int()); + } + str_variants_root += " env PATH=$PATH DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY "; + } + else if (rbSu->get_active()){ + chbTerminal->set_active(true); + string str_user = cmbUser->get_active_text(); + if (str_user!="root"){ + str_variants_root = "su -l " + cmbUser->get_active_text(); + } + else{ + str_variants_root = "su "; + } + + str_variants_root += + " -c \" DISPLAY=$DISPLAY "; + if (cbxExecuteEpriority->get_active()){ + str_variants_root += "nice -n " + to_string(spinPriority->get_value_as_int()) + " "; + } + } + else if (rbSudo->get_active()){ + chbTerminal->set_active(true); + if (getlogin()==cmbUser->get_active_text()){ + str_variants_root="sudo "; + } + else{ + str_variants_root="sudo -u " + cmbUser->get_active_text() + " "; + } + if (cbxExecuteEpriority->get_active()){ + str_variants_root += " nice -n " + to_string(spinPriority->get_value_as_int()) + " "; + } + } + } + if (cmbUser->get_active_text().length()!=0){ + string user_cmd_X = "xhost +SI:localuser:"; + user_cmd_X += cmbUser->get_active_text(); + system(user_cmd_X.c_str()); + } + if ((cbxExecuteEpriority->get_active()) && (chbAnotherUser->get_active()==false)){ + str_nice_cmd = " nice -n " + to_string(spinPriority->get_value_as_int()) + " "; + } + if (user_cmd.length()==0 && name_app.length()==0 && path_file.length()==0){ + messageError->show(); + return ""; + } + + if (chbTerminal->get_active() == true){ + str_cmd_terminal = "xterm -e "; + } + else{ + str_cmd_terminal = ""; + } + + string cmd = ""; + if (path_file.length()>0){ + cmd = "nohup " + str_nice_cmd + str_cmd_terminal + str_variants_root + " xdg-open '" + path_file + "' "; + } + else if (name_app.length()>0){ + cmd = "nohup " + str_nice_cmd + str_cmd_terminal + str_variants_root + name_app; + } + else if (user_cmd.length()>0){ + cmd = "nohup " + str_nice_cmd + str_cmd_terminal + str_variants_root + " " + user_cmd; + } + if (cmd.find("-e su ")!=string::npos){ + cmd+=" \""; + } + cmd += " > /dev/null 2>&1"; + + return cmd; +} + +void MainWindow::call_app(string &cmd){ + if (cmd.length() != 0){ + std::thread t([&](string cmd){system(cmd.c_str());}, cmd); + t.detach(); + } +} +void MainWindow::denamic_cmd(){ + if (chbTerminal->get_active()==true || chbAnotherUser->get_active()==true || cbxExecuteEpriority->get_active()==true){ + if (txtCmd->get_text().length()==0){ + chbTerminal->set_active(false); + chbAnotherUser->set_active(false); + cbxExecuteEpriority->set_active(false); + path_file = ""; + name_app = ""; + user_cmd = ""; + txtCmd->set_text(user_cmd); + messageError->show(); + } + else{ + txtCmd->set_text(this->start_cmd(user_cmd)); + } + } + else{ + if (user_cmd.length() != 0){ + txtCmd->set_text(this->start_cmd(user_cmd)); + } + else if (path_file.length() != 0){ + txtCmd->set_text(this->start_cmd(user_cmd)); + } + else if (name_app.length() != 0){ + txtCmd->set_text(this->start_cmd(user_cmd)); + } + } +} + +bool MainWindow::focus_out_txt_cmd(GdkEventFocus* event){ + if (cmd_old!=txtCmd->get_text()){ + user_cmd = txtCmd->get_text(); + } + return true; +} + +void MainWindow::entry_app(){ + this->denamic_cmd(); + if (name_app.length()==0 && path_file.length()==0){ + + } + string cmd = txtCmd->get_text(); + this->call_app(cmd); +} + +void MainWindow::changed_user(){ + Glib::ustring entry_user = cmbUser->get_active_text(); + if (geteuid()==0 || entry_user == "root"){ + spinPriority->set_range(-20,19); + spinPriority->set_increments(1.0,-1.0); + scalePriority->set_range(-20,19); + scalePriority->set_value(0); + lblTimeEpriorityLow->set_text("19 (Низкий)"); + lblTime4EpriorityHigh->set_text("-20 (Высокий)"); + } + else{ + spinPriority->set_range(0,19); + spinPriority->set_increments(1.0,-1.0); + scalePriority->set_range(0,19); + scalePriority->set_value(0); + lblTimeEpriorityLow->set_text("19 (Низкий)"); + lblTime4EpriorityHigh->set_text("0 (Высокий)"); + } +} + +void MainWindow::activ_or_block_other_user(){ + bool flag = chbAnotherUser->get_active(); + cmbUser->set_active(0); + cmbUser->set_sensitive(flag); + lblInfoUserName->set_sensitive(flag); + if (flag_pkexec == true){ + rbPkexec->set_sensitive(flag); + } + if (flag_su == true){ + rbSu->set_sensitive(flag); + } + if (flag_sudo == true){ + rbSudo->set_sensitive(flag); + } + this->denamic_cmd(); +} + +void MainWindow::change_scale_priority(){ + scalePriority->set_value(spinPriority->get_value_as_int()); + this->denamic_cmd(); +} + +void MainWindow::change_spin_priority(){ + spinPriority->set_value(scalePriority->get_value()); + this->denamic_cmd(); +} + +void MainWindow::pars_dir_bin(){ + namespace fs = std::filesystem; + std::string path = "/bin"; + string file_name = ""; + for (const auto & entry : fs::directory_iterator(path)){ + file_name = entry.path().filename().string(); + if (file_name=="su"){ + flag_su = true; + } + else if (file_name=="sudo"){ + flag_sudo = true; + } + else if (file_name=="pkexec"){ + flag_pkexec = true; + } + } + rbPkexec->set_sensitive(flag_pkexec); + rbSu->set_sensitive(flag_su); + rbSudo->set_sensitive(flag_sudo); +} + +void MainWindow::pars_users(){ + while (true) { + errno = 0; + passwd* entry = getpwent(); + if (!entry) { + if (errno) { + break; + } + break; + } + + if (entry->pw_uid >= 1000 && entry->pw_uid!=65534){ + cmbUser->append(entry->pw_name); + } + } + cmbUser->append("root"); + endpwent(); +} + +vector MainWindow::split(const std::string &s, char delim) { + std::stringstream ss(s); + std::string item; + std::vector elems; + while (std::getline(ss, item, delim)) { + elems.push_back(item); + } + return elems; +} + +void MainWindow::str_remove(std::string& source, std::string & to_remove){ + string::size_type n = to_remove.length(); + for (string::size_type i = source.find(to_remove); + i != string::npos; + i = source.find(to_remove)) + source.erase(i, n); +} + +void MainWindow::pars_apps(){ + if (list_app.size()!=0){return;} + namespace fs = std::filesystem; + struct struct_App App; + string file_name = ""; + string str_Categories; + string path = "/usr/share/applications/"; + for (const auto & entry : fs::directory_iterator(path)){ + file_name = entry.path().filename().string(); + path = "/usr/share/applications/"+file_name; + if (file_name.find(".desktop")!=std::string::npos){ + GKeyFile *gfile=g_key_file_new(); + g_key_file_load_from_file(gfile,path.c_str(),G_KEY_FILE_KEEP_TRANSLATIONS,NULL); + char *Type=g_key_file_get_string(gfile,"Desktop Entry", "Type",NULL); + char *Name=g_key_file_get_locale_string(gfile,"Desktop Entry","Name",setlocale(LC_ALL,NULL),NULL); + char *Exec=g_key_file_get_string(gfile,"Desktop Entry", "Exec",NULL); + char *Categories=g_key_file_get_locale_string(gfile,"Desktop Entry", "Categories",setlocale(LC_ALL,""),NULL); + char *Icon=g_key_file_get_string(gfile,"Desktop Entry", "Icon",NULL); + char *Mime=g_key_file_get_string(gfile,"Desktop Entry", "MimeType",NULL); + if (Type==NULL) continue; + if (Name==NULL) continue; + if (Exec==NULL) continue; + if (Categories==NULL) continue; + if (Icon==NULL) continue; + str_Categories = Categories; + App.Name = Name; + App.Type = Type; + App.Exec = Exec; + App.Icon = Icon; + if (Mime!=NULL){ + App.MimeType = Mime; + } + else{ + App.MimeType = ""; + } + App.Name_desktop = file_name; + App.Categories = split(str_Categories, ';'); + + } + list_app.push_back(App); + } +} + +SettingsPlug::SettingsPlug(::Window p_socketID, Glib::RefPtr builder) + : Gtk::Plug{p_socketID} { + MainWindow* wnd = nullptr; + builder->get_widget_derived("window", wnd); + builder->get_widget("plugBox", plugBox); + plugBox->get_parent()->remove(*plugBox); + add(*plugBox); + show_all_children(); +} + + + + + diff --git a/source/ublexec.h b/source/ublexec.h new file mode 100644 index 0000000..5f34098 --- /dev/null +++ b/source/ublexec.h @@ -0,0 +1,237 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "ubl-util-standard.c" + +using namespace std; + +extern string path_app; +extern string app_name; +extern string path_glade; +extern string path_css; +extern int socket_ext_id_I; +extern int socket_trd_id_I; +void me_thread(string cmd); +class CmdArgParser : public Glib::OptionGroup +{ +public: + CmdArgParser(const std::string& p_name, const std::string& p_description, const std::string& p_help); + ::Window GetSocketID() const; + +private: + int m_socketID = 0; + +}; + +class MainWindow : public Gtk::ApplicationWindow { +public: + MainWindow(BaseObjectType* obj, Glib::RefPtr const& builder); + MainWindow(Glib::RefPtr const& builder); + void template_apps_obj(Gtk::IconView *icon, Glib::RefPtr >k_list_app); + void get_builder(); + void add_CSS(); + void localization(); + void event(); + void settings(); + void close_entry_app(); + void start_menu_entry_app(); + void message_gui_close(); + void activ_or_block_execute_epriority(); + void open_filemaneg(); + void close_filemaneg(); + void get_path_filemaneg(); + void open_list_app(); + string start_cmd(string user_cmd); + void call_app(string &cmd); + void changed_user(); + void entry_app(); + void execute_another_User(){} + void activ_or_block_other_user(); + void change_scale_priority(); + void change_spin_priority(); + void pars_dir_bin(); + void pars_users(); + void pars_apps(); + void select_Graphics(); + void tmp_desktop(string cmd_name); + void on_item_activated(const Gtk::TreeModel::Path& path); + void tempalte_row(string Name, string Exec, string path , Glib::RefPtr &dtk_list); + void tempate_icon_select(Gtk::IconView *icon, Glib::RefPtr >k_list); + void ok_close_entry_app(); + void select_Tools(); + void select_Internet(); + void select_Multimedia(); + void select_Settings(); + void select_Education(); + void select_Office(); + void select_Other(); + void select_Development(); + void select_System(); + void icon_clear(); + void set_icon_array(); + void delete_cmd(const int &x,const int &y); + void synopsis_show(); + void denamic_cmd(); + bool focus_out_txt_cmd(GdkEventFocus* event); + bool focus_in_txt_cmd(GdkEventFocus* event); + void unselect_icon(Gtk::IconView *icon_entry); + void str_remove(std::string& source, std::string & to_remove); + vector split(const std::string &s, char delim); + public: + class ModelColumns : public Gtk::TreeModel::ColumnRecord + { + public: + ModelColumns() + { + add(m_col_filename); + add(m_col_description); + add(m_col_pixbuf); + add(app_name_exec); + add(float_h_align); + add(float_w_align); + add(icon_name); + + } + Gtk::TreeModelColumn m_col_filename; + Gtk::TreeModelColumn icon_name; + Gtk::TreeModelColumn m_col_description; + Gtk::TreeModelColumn app_name_exec; + Gtk::TreeModelColumn > m_col_pixbuf; + Gtk::TreeModelColumn float_h_align; + Gtk::TreeModelColumn float_w_align; + }; + ModelColumns m_Columns; + public: + Glib::RefPtr builder; + Gtk::Button *btnFilemaneg; + Gtk::Button *btnListApp; + Gtk::Button *btnStart; + Gtk::CheckButton *chbTerminal; + Gtk::CheckButton *chbAnotherUser; + Gtk::CheckButton *cbxExecuteEpriority; + Gtk::ComboBoxText *cmbUser; + Gtk::SpinButton *spinPriority; + Gtk::Scale *scalePriority; + Gtk::RadioButton *rbPkexec; + Gtk::RadioButton *rbSu; + Gtk::RadioButton *rbSudo; + Gtk::Entry *txtCmd; + Gtk::FileChooserDialog *wndChooseFileWallpaper; + Gtk::Button *btnFilemangerExit; + Gtk::Button *btnFilemangerOk; + Gtk::Label *lblTimeEpriority; + Gtk::Label *lblTimeEpriorityLow; + Gtk::Label *lblTime4EpriorityHigh; + Gtk::Label *lblUserName; + Gtk::MessageDialog *messageError; + Gtk::Button *btnMessageErrorOk; + Gtk::Label *lblMessageError; + Gtk::Button *btnStartMenuOK; + Gtk::Button *btnStartMenuExit; + Gtk::Window *dialogStartMenu; + Gtk::Box *boxColor; + Gtk::Label *lblInfoHead; + Gtk::Label *lblinfoCmd; + Gtk::Label *lblInfoTime; + Gtk::Label *labInfoExecutTerm; + Gtk::Label *lblInfoUser; + Gtk::Label *lblInfoUserOther; + Gtk::Label *lblInfoUserName; + Gtk::Label *lblInfoNooPriority; + Gtk::Label *lblInfoExec; + Gtk::Label *lblInfoPriority; + + Gtk::Label *lblGraphics; + Gtk::Label *lblTools; + Gtk::Label *lblInternet; + Gtk::Label *lblMultimedia; + Gtk::Label *lblSettings; + Gtk::Label *lblEducation; + Gtk::Label *lblOffice; + Gtk::Label *lblOther; + Gtk::Label *lblDevelopment; + Gtk::Label *lblSystem; + Gtk::Label *lblHeaderName; + + Gtk::IconView *iconGraphics; + Gtk::IconView *iconTools; + Gtk::IconView *iconInternet; + Gtk::IconView *iconMultimedia; + Gtk::IconView *iconSettings; + Gtk::IconView *iconEducation; + Gtk::IconView *iconOffice; + Gtk::IconView *iconOther; + Gtk::IconView *iconDevelopment; + Gtk::IconView *iconSystem; + Gtk::IconView *iconEntry; + Gtk::MenuItem *btnAbout; + Gtk::MenuItem *btnSynopsis; + Gtk::AboutDialog *aboutWindows; + Gtk::MenuButton *btnSettings; + Gtk::ButtonBox *btnBoxAboutDialog; + + Glib::RefPtr list_Graphics; + Glib::RefPtr list_Tools; + Glib::RefPtr list_Internet; + Glib::RefPtr list_Multimedia; + Glib::RefPtr list_Settings; + Glib::RefPtr list_Education; + Glib::RefPtr list_Office; + Glib::RefPtr list_Other; + Glib::RefPtr list_Development; + Glib::RefPtr list_System; + public: + string version_application = "1.0"; + string cmd_old = ""; + string user_cmd=""; + string user_cmd_old=""; + string name_app_old=""; + string path_file_old=""; + string execute_cmd = ""; + string path_file = ""; + string name_app = ""; + bool flag_pkexec = false; + bool flag_su = false; + bool flag_sudo = false; + string path_file_name; + struct struct_App{ + string Name_desktop; + string Name; + string Exec; + string Icon; + string MimeType; + string Type; + vector Categories;}; + list list_app; + set set_categories; + int index_exec_gui_apps = 0; + Gtk::IconView* array_icon[10]; + + +}; + +class SettingsPlug : public Gtk::Plug{ +public: + Gtk::Window *window; + SettingsPlug(::Window p_socketID, Glib::RefPtr builder); + +private: + Gtk::Widget *plugBox; + Gtk::Widget *parent; +}; + + diff --git a/style.css b/style.css new file mode 100644 index 0000000..0ea8eb1 --- /dev/null +++ b/style.css @@ -0,0 +1,72 @@ +.cssboxColor1{ + background: url("/usr/share/ublexec/images/bg_top.png") no-repeat; +} +.textHead{ + text-shadow: 1px 1px #ffffff; +} +.menuitemtop *{ + margin:2px 2px 0 2px; + padding: 5px 10px 3px 5px; +} +.menuitemmiddle *{ + margin:0 2px 0 2px; + padding: 3px 10px 3px 5px; +} +.menuitembottom *{ + margin:0 2px 2px 2px; + padding: 3px 10px 5px 5px; +} +.menuitemtop:hover { + border-radius:3px; + background:@theme_bg_color; +} +.menuitemmiddle:hover { + border-radius:3px; + background:@theme_bg_color; +} +.menuitembottom:hover { + border-radius:3px; + background:@theme_bg_color; + +} +.menuitemtop:hover* { + border-radius:3px; + margin:2px 2px 0 2px; + padding: 5px 10px 3px 5px; + background:@theme_selected_bg_color; + border-color:transparent; +} +.menuitemmiddle:hover* { + border-radius:3px; + margin:0 2px 0 2px; + padding: 3px 10px 3px 5px; + background:@theme_selected_bg_color; + border-color:transparent; +} +.menuitembottom:hover* { + border-radius:3px; + margin:0 2px 2px 2px; + padding: 3px 10px 5px 5px; + background:@theme_selected_bg_color; + border-color:transparent; +} +.menuitembottom{ + margin-top:0px; +} +.menuitemmiddle{ + margin-top:0px; + margin-bottom:0px; +} + +.menuitemtop{ + margin-bottom:0px; +} + +.bkim{ + background-image: -gtk-gradient(linear, + left top, left bottom, + from(@entry_background_a), + color-stop(0.20, @entry_background_b), + color-stop(0.85, @entry_background_c), + to(@entry_background_d)); +} \ No newline at end of file diff --git a/ublexec.desktop b/ublexec.desktop new file mode 100644 index 0000000..ef0cc9d --- /dev/null +++ b/ublexec.desktop @@ -0,0 +1,14 @@ +[Desktop Entry] +Encoding=UTF-8 +Name=ublexec +Name[ru]=Выполнить +GenericName=Execution from user rights +GenericName[ru]=Выполнить +Comment=Execution from user rights +Comment[ru]=Выполнить +Type=Application +Exec=ublexec +Icon=ublexec +Terminal=false +X-XfcePluggable=true +Categories=XFCE;GTK;Settings;DesktopSettings;X-XFCE-SettingsDialog;X-XFCE-SystemSettings;X-UBL-SettingsManager;X-UBL-SystemSettings; \ No newline at end of file diff --git a/ublexec.glade b/ublexec.glade new file mode 100644 index 0000000..09eb905 --- /dev/null +++ b/ublexec.glade @@ -0,0 +1,1946 @@ + + + + + + True + True + 6 + + + False + О Программе + False + True + center + ubl-settings-datetime + dialog + True + ublexec + 1.0 + Copyright © 2023 - UBSoft Software LLC + Setting the date and time + https://ublinux.ru/ + Project Home Page + Это приложение распространяется без каких-либо гарантий. +Подробнее в <a href="https://www.gnu.org/licenses/old-licenses/gpl-2.0.html">GNU General Public License, версии 2 или позднее</a>. + UBGroup + UBGroup + ublexec + True + gpl-2-0 + + + False + vertical + 2 + + + False + end + + + + + + False + False + 0 + + + + + + + + + + -20 + 19 + 1 + 10 + + + 450 + 240 + False + + + True + False + vertical + + + True + True + in + + + True + False + 5 + 5 + 5 + 5 + 5 + natural + + + True + False + 1 + 1 + 5 + 0 + etched-out + + + True + False + 12 + + + True + False + vertical + + + True + True + + + True + False + + + True + False + 7 + 7 + 7 + 7 + + + False + True + 0 + + + + + True + True + 1 + horizontal + 1 + 350 + 1 + 1 + 1 + + + + 5 + 5 + 6 + 2 + + + + + + 4 + 5 + + + + + False + True + 1 + + + + + + + True + False + Graphics + + + + + False + True + 1 + + + + + True + True + + + True + False + + + True + False + 7 + 7 + 7 + 7 + + + False + True + 0 + + + + + True + True + 1 + queue + horizontal + 1 + 350 + 1 + 1 + 1 + + + + 5 + 5 + 6 + 2 + + + + + + 5 + 4 + + + + + + False + True + 1 + + + + + + + True + False + Tools + + + + + False + True + 3 + + + + + True + True + 1 + + + True + False + + + True + False + 7 + 7 + 7 + 7 + + + False + True + 0 + + + + + True + True + 1 + queue + horizontal + 1 + 350 + 1 + 1 + 1 + + + + 5 + 5 + 6 + 2 + + + + + + 5 + 4 + + + + + + False + True + 1 + + + + + + + True + False + Internet + + + + + False + True + 5 + + + + + True + True + + + True + False + + + True + False + 7 + 7 + 7 + 7 + + + False + True + 0 + + + + + True + True + 1 + queue + horizontal + 1 + 350 + 1 + 1 + 1 + + + + 5 + 5 + 6 + 2 + + + + + + 5 + 4 + + + + + + False + True + 1 + + + + + + + True + False + Multimedia + + + + + False + True + 7 + + + + + True + True + + + True + False + + + True + False + 7 + 7 + 7 + 7 + + + False + True + 0 + + + + + True + True + 1 + queue + horizontal + 1 + 350 + 1 + 1 + 1 + + + + 5 + 5 + 6 + 2 + + + + + + 5 + 4 + + + + + + False + True + 1 + + + + + + + True + False + Settings + + + + + False + True + 9 + + + + + True + True + + + True + False + + + True + False + 7 + 7 + 7 + 7 + + + False + True + 0 + + + + + True + True + 1 + queue + horizontal + 1 + 350 + 1 + 1 + 1 + + + + 5 + 5 + 6 + 2 + + + + + + 5 + 4 + + + + + + False + True + 1 + + + + + + + True + False + Education + + + + + False + True + 11 + + + + + True + True + + + True + False + + + True + False + 7 + 7 + 7 + 7 + + + False + True + 0 + + + + + True + True + 1 + queue + horizontal + 1 + 350 + 1 + 1 + 1 + + + + 5 + 5 + 6 + 2 + + + + + + 5 + 4 + + + + + + False + True + 1 + + + + + + + True + False + Office + + + + + False + True + 13 + + + + + True + True + + + True + False + + + True + False + 7 + 7 + 7 + 7 + + + False + True + 0 + + + + + True + True + 1 + queue + horizontal + 1 + 350 + 1 + 1 + 1 + + + + 5 + 5 + 6 + 2 + + + + + + 5 + 4 + + + + + + False + True + 1 + + + + + + + True + False + Other + + + + + False + True + 15 + + + + + True + True + + + True + False + + + True + False + 7 + 7 + 7 + 7 + + + False + True + 0 + + + + + True + True + 1 + queue + horizontal + 1 + 350 + 1 + 1 + 1 + + + + 5 + 5 + 6 + 2 + + + + + + 5 + 4 + + + + + + False + True + 1 + + + + + + + True + False + Development + + + + + False + True + 17 + + + + + True + True + + + True + False + + + True + False + 7 + 7 + 7 + 7 + + + False + True + 0 + + + + + True + True + 1 + queue + horizontal + 1 + 350 + 1 + 1 + 1 + + + + 5 + 5 + 6 + 2 + + + + + + 5 + 4 + + + + + + False + True + 1 + + + + + + + True + False + System + + + + + False + True + 19 + + + + + + + + + + True + False + + + + + + + + + + + + True + True + 1 + + + + + True + False + end + start + + + ОК + -1 + -1 + True + True + True + + + True + True + 0 + + + + + Выход + True + True + True + + + True + True + 1 + + + + + False + True + 2 + + + + + + + True + False + 5 + 5 + 5 + 5 + 6 + 6 + gtk-media-play + +<<<<<<< HEAD +======= + + + + + + + + + + + + + + + + + + True + False + False + False + 4 + dropdown-menu + + + True + False + Synopsis + True + + + + + + True + False + About the program + True + + + + +>>>>>>> devel + + False + + + True + False + vertical + + + True + False + + + True + False + 5 + 5 + 5 + 5 + 6 + 6 + 69 + ublexec + + + False + True + 0 + + + + + True + False + start + 5 + 5 + 5 + 5 + 6 + 6 + Running applications as a user with a +specified priority + + + + + + + + True + True + 1 + + + + + False + True + 0 + + + + + True + False + vertical + + + True + False + vertical + + + True + False + vertical + + + True + False + 5 + 5 + 5 + 5 + 6 + 6 + 0.019999999552965164 + in + + + True + False + 5 + 5 + vertical + + + True + False + + + 145 + True + False + 5 + 5 + 5 + 5 + 6 + 6 + Team + True + 0 + + + False + True + 0 + + + + + 330 + True + True + 5 + 5 + 5 + 5 + 6 + 6 + + + True + True + 1 + + + + + True + True + True + end + 5 + 5 + 5 + 5 + 6 + 6 + + + True + False + center + center + 5 + 5 + 5 + 5 + 3 + 3 + gtk-directory + + + + + False + True + 2 + + + + + True + True + True + end + 5 + 5 + 5 + 5 + 6 + 6 + + + True + False + center + center + 5 + 5 + 5 + 5 + edit-select-all + + + + + False + True + 3 + + + + + False + True + 0 + + + + + True + False + 6 + 6 + + + 131 + True + False + 15 + 5 + 15 + 5 + + + False + True + 0 + + + + + True + True + False + start + center + 5 + 5 + 5 + 5 + 6 + True + + + True + False + Run in the terminal emulator + + + + + False + True + 1 + + + + + False + True + 1 + + + + + + + True + False + Command Line + + + + + True + True + 0 + + + + + True + True + 1 + + + + + True + False + 5 + vertical + + + True + False + 5 + 5 + 5 + 5 + 0.019999999552965164 + in + + + True + False + 5 + 5 + vertical + + + True + False + + + True + True + False + start + center + 5 + 5 + 5 + 5 + 6 + 6 + True + + + True + False + Run as another user + + + + + False + True + 0 + + + + + pkexec + True + True + False + True + rbSu + + + False + True + 1 + + + + + su + True + True + False + True + rbPkexec + + + False + True + 2 + + + + + sudo + True + True + False + True + rbSu + + + False + True + 3 + + + + + 95 + True + False + end + 15 + 5 + 15 + 5 + + + False + True + 4 + + + + + False + True + 0 + + + + + True + False + + + 145 + True + False + 5 + 5 + 5 + 5 + 6 + 6 + User Name + True + 0 + + + False + True + 0 + + + + + 330 + True + False + 5 + 5 + 5 + 5 + 6 + 6 + + + False + True + 1 + + + + + False + True + 1 + + + + + + + True + False + User + + + + + True + True + 0 + + + + + True + True + 2 + + + + + True + False + 5 + vertical + + + True + False + 5 + 5 + 5 + 5 + 0.019999999552965164 + in + + + True + False + 5 + 5 + vertical + + + True + True + False + start + center + 5 + 5 + 5 + 5 + 6 + 6 + True + + + True + False + Change startup priority + + + + + False + True + 0 + + + + + True + False + + + 5 + True + False + 5 + 5 + 5 + 5 + 6 + 6 + Priority + True + 0 + + + False + True + 0 + + + + + True + True + 5 + 5 + 5 + 5 + 6 + 6 + adjustment1 + 20 + 0 + 0 + + + True + True + 1 + + + + + True + True + 5 + 5 + 5 + 5 + 6 + 6 + True + + + False + True + 2 + + + + + False + True + 1 + + + + + True + False + + + 65 + True + False + 15 + 5 + 15 + 5 + 0 + + + False + True + 0 + + + + + 145 + True + False + 5 + 5 + 5 + 5 + 6 + 6 + 19 (Low) + True + 0 + + + False + True + 1 + + + + + True + False + end + center + 5 + 5 + 5 + 5 + 6 + 6 + -20 (High) + True + 0 + + + True + True + 3 + + + + + 95 + True + False + end + 15 + 5 + 15 + 5 + + + False + True + 4 + + + + + False + True + 2 + + + + + + + True + False + Priority + + + + + True + True + 0 + + + + + True + True + 3 + + + + + Run + True + True + True + 5 + 5 + 5 + 5 + 6 + 6 + image1 + True + + + False + True + 4 + + + + + True + True + 0 + + + + + True + True + 2 + + + + +<<<<<<< HEAD +======= + + + True + False + True + + + True + False + Ublexec + + + + + + + + True + False + 32 + ublexec + + + + + True + False + + + True + True + False + True + True + menu1 + none + + + True + False + open-menu-symbolic + + + + + False + True + 0 + + + + + end + 1 + + + + +>>>>>>> devel + + + False + Внимание! + dialog + + + False + vertical + 2 + + + False + True + end + + + + + + ОК + True + True + True + + + True + True + 1 + + + + + False + False + 0 + + + + + True + False + 10 + 10 + 15 + Select an executable file or program + + + True + True + 2 + + + + + + + False + Пожалуйста выберите Файл + True + center + 500 + 400 + True + dialog + True + True + + + False + vertical + 2 + + + False + end + + + gtk-cancel + True + True + True + True + + + True + True + 0 + + + + + gtk-ok + True + True + True + True + + + True + True + 1 + + + + + False + False + 0 + + + + + + + + + diff --git a/ublexec.svg b/ublexec.svg new file mode 100644 index 0000000..0ec751a --- /dev/null +++ b/ublexec.svg @@ -0,0 +1,5680 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ublexec_ru.po b/ublexec_ru.po new file mode 100644 index 0000000..5f16e42 --- /dev/null +++ b/ublexec_ru.po @@ -0,0 +1,115 @@ +# English translations for PACKAGE package. +# Copyright (C) 2023 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Automatically generated, 2023. +# +msgid "" +msgstr "" + +msgid "https://wiki.ublinux.com" +msgstr "https://wiki.ublinux.ru" + +msgid "About the program" +msgstr "О программе" + +msgid "Help" +msgstr "Справка" + +msgid "Project Home Page" +msgstr "Домашняя страница проекта" + +msgid "System" +msgstr "Система" + +msgid "Development" +msgstr "Разработка" + +msgid "Other" +msgstr "Прочие" + +msgid "Office" +msgstr "Офис" + +msgid "Education" +msgstr "Образование" + +msgid "Settings" +msgstr "Настройки" + +msgid "Multimedia" +msgstr "Мультимедиа" + +msgid "Internet" +msgstr "Интернет" + +msgid "Tools" +msgstr "Инструменты" + +msgid "Graphics" +msgstr "Графика" + +msgid "ОК" +msgstr "ОК" + +msgid "Exit" +msgstr "Выход" + +msgid "Selecting Programs" +msgstr "Выбор программ" + +msgid "Running applications as a user with a\nspecified priority" +msgstr "Запуск приложений от имени пользователя с\nуказанным приоритетом" + +msgid "Team" +msgstr "Команда" + +msgid "Run in the terminal emulator" +msgstr "Выполнить в эмуляторе терминала" + +msgid "Command Line" +msgstr "Командная строка" + +msgid "Run as another user" +msgstr "Выполнить от имени другого пользователя" + +msgid "pkexec" +msgstr "pkexec" + +msgid "su" +msgstr "su" + +msgid "sudo" +msgstr "sudo" + +msgid "User Name" +msgstr "Имя поьзователя" + +msgid "User" +msgstr "Пользователь" + +msgid "Change startup priority" +msgstr "Изменить приоритет запуска" + +msgid "Priority" +msgstr "Приоритет" + +msgid "19 (Low)" +msgstr "19 (Низкий)" + +msgid "-20 (High)" +msgstr "-20 (Высокий)" + +msgid "Run" +msgstr "Запустить" + +msgid "Select an executable file or program" +msgstr "Выберите исполняемый файл или программу" + +msgid "Please select File" +msgstr "Пожалуйста выберите Файл" + +msgid "Warning!" +msgstr "Внимание!" + +msgid "ublexec" +msgstr "Выполнить"