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
+```
+
+
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