diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..b66026b --- /dev/null +++ b/Makefile @@ -0,0 +1,158 @@ +#!/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 +FILE_VERSION = VERSION.md +DEPENDS = /bin/cmake +PREFIX ?= /usr +PKGNAME = $(MAKEFILE_DIR) +#PKGNAME = ubl-settings-manager + +default_target: all + +.PHONY: all init depend debug prepare check build uninstall install clean up_ver help + +all: init build + +init: + @echo "Initialize ..."; \ + sed -r "s/(version_application = ).*/\1\"$$(grep 'VERSION' ${FILE_VERSION} | cut -d" " -f2)\";/" -i source/ubl-settings-manager.h; \ + echo "-- Build path: ${CMAKE_BUILD_DIR}" + +depend: + @echo "Check depends ..." + @for FILE_DEPEND in $(DEPENDS); do \ + if [ ! -f $${FILE_DEPEND} ]; then \ + echo "ERROR: Depend '$${FILE_DEPEND}' not found !"; \ + exit 1; \ + fi; \ + done; \ + 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="${PREFIX}"; \ + 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="${PREFIX}"; \ + 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 found !"; \ + 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="${DESTDIR}${PREFIX}/share/locale/$${LANG}/LC_MESSAGES/$${FILE_MO}"; \ + $(RM) "$${PATH_FILE_MO}"; \ + done + @for SIZE in 16x16 32x32 48x48 scalable; do \ + $(RM) "${DESTDIR}${PREFIX}/share/icons/hicolor/$${SIZE}/apps/com.ublinux.${PKGNAME}.svg"; \ + $(RM) "${DESTDIR}${PREFIX}/share/icons/hicolor/$${SIZE}/apps/com.ublinux.${PKGNAME}.png"; \ + done + @for FILE_SVG in $(wildcard *.svg); do \ + for SIZE in 16x16 32x32 48x48 scalable; do \ + $(RM) "${DESTDIR}${PREFIX}/share/icons/hicolor/$${SIZE}/status/$${FILE_SVG%.*}".{svg,png,jpg}; \ + done; \ + done + @$(RM) "${DESTDIR}${PREFIX}/bin/${PKGNAME}" + @$(RM) "${DESTDIR}${PREFIX}/etc/xdg/${PKGNAME}/${PKGNAME}.conf" + @$(RM) "${DESTDIR}${PREFIX}/share/applications/${PKGNAME}.desktop" + @$(RM) "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps/com.ublinux.${PKGNAME}.svg" + @$(RM) -rd "${DESTDIR}${PREFIX}/share/${PKGNAME}" + @if [ -z ${DESTDIR} ]; then \ + [ -d "${DESTDIR}${PREFIX}/share/icons/hicolor/" ] && gtk-update-icon-cache -fiq "${DESTDIR}${PREFIX}/share/icons/hicolor/" &>/dev/null || true; \ + update-desktop-database --quiet &>/dev/null || true; \ + [ -d "${DESTDIR}${PREFIX}/share/applications" ] && touch "${DESTDIR}${PREFIX}/share/applications" &>/dev/null || true; \ + fi + @echo "Uninstall: OK" + +install: check uninstall + @echo "Install ..." + @for FILE_PO in $(wildcard *.po); do \ + LANG=$${FILE_PO##*_};LANG=$${LANG%.*}; \ + install -dm755 "${DESTDIR}${PREFIX}/share/locale/$${LANG}/LC_MESSAGES"; \ + FILE_MO=$${FILE_PO##*/}; FILE_MO="$${FILE_MO%_*.po}.mo"; \ + PATH_FILE_MO="${DESTDIR}${PREFIX}/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 "${DESTDIR}${PREFIX}/share/icons/hicolor/$${SIZE}x$${SIZE}/apps"; \ + rsvg-convert -w $${SIZE} -h $${SIZE} -f svg --keep-image-data "com.ublinux.${PKGNAME}.svg" -o "${DESTDIR}${PREFIX}/share/icons/hicolor/$${SIZE}x$${SIZE}/apps/com.ublinux.${PKGNAME}.svg"; \ + done + @install -dm755 "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps" + @install -Dm644 -t "${DESTDIR}${PREFIX}/share/icons/hicolor/scalable/apps/" "com.ublinux.${PKGNAME}.svg" + @install -Dm755 -t "${DESTDIR}${PREFIX}/bin/" "${CMAKE_BUILD_DIR}/${PKGNAME}" + @install -dm755 "${DESTDIR}${PREFIX}/etc/xdg" + @install -Dm744 -t "${DESTDIR}${PREFIX}/etc/xdg/${PKGNAME}/" "${PKGNAME}.conf" + @install -dm755 "${DESTDIR}${PREFIX}/share/applications" + @install -Dm644 -t "${DESTDIR}${PREFIX}/share/applications/" "${PKGNAME}.desktop" + @install -dm755 "${DESTDIR}${PREFIX}/share/${PKGNAME}"/{ui,css,images} + @install -Dm644 -t "${DESTDIR}${PREFIX}/share/${PKGNAME}/ui/" "${PKGNAME}.glade" + @install -Dm644 -t "${DESTDIR}${PREFIX}/share/${PKGNAME}/css/" "${PKGNAME}.css" + @install -Dm644 -t "${DESTDIR}${PREFIX}/share/${PKGNAME}/images/" "ublinux-logo.svg" + @install -Dm644 -t "${DESTDIR}${PREFIX}/share/${PKGNAME}/images/" "${PKGNAME}-banner.png" + @if [ -z ${DESTDIR} ]; then \ + [ -d "${DESTDIR}${PREFIX}/share/icons/hicolor/" ] && gtk-update-icon-cache -fiq "${DESTDIR}${PREFIX}/share/icons/hicolor/" &>/dev/null || true; \ + update-desktop-database --quiet &>/dev/null || true; \ + [ -d "${DESTDIR}${PREFIX}/share/applications" ] && touch "${DESTDIR}${PREFIX}/share/applications" &>/dev/null || true; \ + fi + @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 + +up_ver: + @CURRENT=$$(grep 'VERSION' ${FILE_VERSION} | cut -d" " -f2); \ + MAJOR=$$(cut -d. -f1 <<< $${CURRENT}); \ + MINOR=$$(cut -d. -f2 <<< $${CURRENT}); \ + VER="$${MAJOR}.$$(($${MINOR}+1))"; \ + sed "s/VERSION *[[:digit:]]*.*/VERSION $${VER}/" -i ${FILE_VERSION}; \ + echo "Updated version to VERSION.md: $${CURRENT} to $${VER}" + +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"; \ + echo "... up_ver" diff --git a/VERSION.md b/VERSION.md deleted file mode 100644 index c1fc6fc..0000000 --- a/VERSION.md +++ /dev/null @@ -1 +0,0 @@ -VERSION 1.4 diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt new file mode 100644 index 0000000..1859049 --- /dev/null +++ b/source/CMakeLists.txt @@ -0,0 +1,29 @@ +cmake_minimum_required(VERSION 3.7) +project(ubl-settings-manager) + +find_package(PkgConfig REQUIRED) + +pkg_check_modules(GTK REQUIRED gtk+-3.0) +include_directories(${GTK_INCLUDE_DIRS}) +link_directories(${GTK_LIBRARY_DIRS}) +add_definitions(${GTK_CFLAGS_OTHER}) + +#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic -Wall -Wextra -Werror -Wmissing-declarations -fdiagnostics-color=always -std=c++2a") +#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic -Wall -Wextra -Werror -Wmissing-declarations -fdiagnostics-color=always -lm") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic -Wall -Wextra -Werror -Wmissing-declarations -fdiagnostics-color=always \ + -O2 -pipe -fno-plt -fexceptions \ + -Wp,-D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security \ + -fstack-clash-protection -fcf-protection") + +set(SOURCE_FILES + ubl-settings-manager.c + ubl-settings-manager.h) + +set(LIBRARIES + ${GTK_LIBRARIES} + pthread) + + +add_executable(ubl-settings-manager ${SOURCE_FILES}) +target_link_libraries(ubl-settings-manager ${LIBRARIES}) +install(TARGETS ubl-settings-manager DESTINATION bin) \ No newline at end of file diff --git a/source/ubl-settings-manager.h b/source/ubl-settings-manager.h new file mode 100644 index 0000000..af8076c --- /dev/null +++ b/source/ubl-settings-manager.h @@ -0,0 +1,239 @@ +#ifndef UBL_SETTINGS_MANAGER +#define UBL_SETTINGS_MANAGER + +#include +#include +#include + +#define cmdVersionText yon_char_get_augumented(yon_char_get_augumented(_("Version: "),version_application),"\n") +#define cmdHelpText yon_char_get_augumented(yon_char_get_augumented(_("ubl-settings-manager version: "),version_application),_("\nGTK settings manager for UBLinux\nUsage: ubl-settings-manager [OPTIONS...]\nOptions:\n -h, --help Show this help\n -V, --version Show package version\n --lock-settings Lock menu settings\n")) +#define GladePath "/usr/share/ubl-settings-manager/ui/ubl-settings-manager.glade" +#define CssPath "/usr/share/ubl-settings-manager/css/ubl-settings-manager.css" +#define GlobalConfigPath "/etc/xdg/ubl-settings-manager/ubl-settings-manager.conf" +#define UserConfigPath "/.config/ubl-settings-manager/ubl-settings-manager.conf" +#define AppIconPath "com.ublinux.ubl-settings-manager" +#define AppBannerPath "/usr/share/ubl-settings-manager/images/ubl-settings-manager-banner.png" +#define DesktopPath "/usr/share/applications/" +#define IconPicturesPath "/usr/share/icons/hicolor/scalable/apps/" +#define ublinux_logo "/usr/share/ubl-settings-manager/images/ublinux-logo.svg" +#define LocalePath "/usr/share/locale" +#define LocaleName "ubl-settings-manager" +#define ubl_settings_infoPath "ubl-settings-info" +#define ubl_settings_infoPathLaunch "ubl-settings-info --socket-id=" +typedef char* string; +string version_application = "1.2"; + + +typedef struct apps{ + char *Name; + int Type; + char *Categories; + char *Exec; + char *Icon; + int Pluggable; + int DualPluggable; + } apps; + +typedef struct { + char *command; + int *exitcode; +} thread_output; + +typedef struct dictionary { + char *key; + void *data; + struct dictionary *next; + struct dictionary *prev; + struct dictionary *first; +} dictionary; + +typedef struct IVGrapgicals{ + char *sectionName; + char *categories; + GtkListStore *LV; + GtkWidget *Box; + GtkWidget *IV; + GtkWidget *label; + GtkWidget *sep; + GtkCellRendererPixbuf *iconRender; +} IVGraphicals; + +typedef struct IconSection{ + char *section; + char *categories; +} IconSection; + +typedef struct { + int windowWidth; + int windowHeight; + int windowPosX; + int windowPosY; + int WindowTheme; + char *curThemeName; + int Mainiconsize; + int Gnomeiconsize; + int iconSegmentSize; + dictionary *sections; + int MainlabelSize; + int GnomelabelSize; + int *currentThemeLabelSize; + int *currentThemeIconSize; + int labelDensity; + char *lastUser; + int changed; + int fullscreen; + int lock_settings; + dictionary *SettingsSections; +} config; + +typedef struct { + GtkWidget *MainFrame; + GtkWidget *MainBox; + GtkWidget *ElemBox; + GtkWidget *DragButtonBox; + GtkWidget *DragUpButton; + GtkWidget *DragDownButton; + GtkWidget *NameBox; + GtkWidget *CategoriesBox; + GtkWidget *OptionBox; + GtkWidget *NameEntry; + GtkWidget *NameLabel; + GtkWidget *CategoriesEntry; + GtkWidget *CategoriesLabel; + GtkWidget *EditButtonBox; + GtkWidget *EditButtonAccept; + GtkWidget *EditButtonCancel; + GtkWidget *ButtonEdit; + GtkWidget *ButtonDelete; + GtkWidget *DeleditBox; +} SectionSettingSegment; + +typedef struct { + GtkBuilder *builder; + GtkWidget *window; + dictionary *ICSys; + GtkWidget *DesktopBasic; + GtkWidget *DesktopSocket; + GtkWidget *ButtonBackToMain; + GtkWidget *DialogOpenDocumentation; + GtkWidget *CancelHelpButton; + GtkWidget *ReadHelpButton; + GtkWidget *AlwaysOpenDocumentation; + GtkWidget *helpHeader; + GtkWidget *helpText; + GtkWidget *appSettings; + GtkWidget *SettingsWindow; + GtkWidget *settingsSizeSlider; + GtkWidget *settingsSizeInfoLabel; + GtkWidget *settingsThemeChooser; + GtkWidget *settingsCancel; + GtkWidget *settingsAccept; + GtkWidget *settingsIcon; + GtkWidget *socket; + GtkWidget *socketplace; + GtkWidget *HideWhileLaunch; + GtkWidget *MenuItemSettings; + GtkWidget *MenuItemDocumentation; + GtkWidget *MenuItemAboutSystem; + GtkWidget *LabelTitle; + GtkWidget *settingsSubmenuLabelSize; + GtkWidget *settingsSubmenuLabelTheme; + GtkWidget *GnomePaned; + GtkWidget *GnomeInfoLabel; + GtkWidget *workingwindow; + GtkWidget *settingsSectionsSettingsButton; + GtkWidget *SectionSettingsWindow; + GtkWidget *SectionSettingsPack; + dictionary *SettingsSections; + GtkWidget *SectionSettingAddButton; + GtkWidget *SectionSettingAddNameEntry; + GtkWidget *SectionSettingAddCategoriesEntry; + GtkWidget *SectionSettingsClearEntryButton; + GtkWidget *SectionSettingsSaveButton; + GtkWidget *SectionSettingsCloseButton; + GtkWidget *GnomeInfoDetailsLabel; + GtkWidget *CautionWindow; + GtkWidget *CautionUnderstandButton; + GtkWidget *socketbuttonplace; + GtkWidget *socketbutton; + GtkWidget *Overlay; + GtkWidget *ThirdSocketPlace; + GtkWidget *ThirdSocket; + int appssize; + apps *applist; + GtkWidget *icvpack; + GtkWidget *infoWarningWindow; + GtkWidget *infoWarningButton; + GtkWidget *infoWarningLabel; + +} actionWidgets; + +typedef enum { + ACTIONWIDGETS, + ICONSECTION, + IVGRAPHICALS, + OTHER + +} DICT_TYPE; + +void on_plug_added(GtkSocket* self, actionWidgets *builder); +void on_plug_removed(GtkSocket* self, actionWidgets *widgets); +void on_Item_activated(GtkIconView* self, GtkTreePath* path, actionWidgets *applist); +void on_gnome_Item_activated(GtkIconView* self, GtkTreePath* path, actionWidgets *applist); +void on_item_selection_changed(GtkIconView *IV, actionWidgets *widgets); +void on_ButtonOpenHelp_activated(GtkWidget *button, GtkBuilder *builder); +void on_backToSettingsButton_clicked(GtkWidget *button,actionWidgets *sctb); +void on_CancelHelpButton_activated(GtkWidget *button,GtkBuilder *builder); +void on_ReadHelpButton_activated(GtkWidget *button, GtkBuilder *builder); +int launch_app_with_arguments(char *name, char *args); +int launch_app(char *name); +int py_launch_app(char *name,char *args); +int on_settings_accept(GtkWidget *button, dictionary **widgetsDs); +void on_paned_move(GtkPaned* self, GtkScrollType* scroll_type, actionWidgets *widgets); +int on_settingsOpen(GtkWidget *button, actionWidgets *widgets); +int on_settings_icon_size_changed(GtkWidget* self, actionWidgets *widgets); +int on_settings_cancel(GtkWidget *button, actionWidgets *widgets); +apps *get_app_by_name(apps *applist,char *name, int size); +int reload_list(IVGraphicals *section); +int load_apps(IVGraphicals *section, apps *applist, int size); +int load_apps_with_clear(IVGraphicals *section, apps *applist, int size); +int hide_if_unfound(dictionary *widgetsDc); +GtkWidget *create_socket(actionWidgets *builder); +void sort_apps(apps *applist,int size); +apps *find_apps(int *sizef); +int check_categories(apps app, char *catstocheck); +int setup_config(); +void yon_icv_resize_item(dictionary *icdict, GtkWidget *paned); +dictionary *yon_theme_new(dictionary **widgetss, GtkBuilder *builder, char *theme_id, apps *applist, int appsize); +char *yon_char_get_augumented(char *source, char *append); +char *yon_cut(char *source, int size, int startpos); +int yon_set_sections(IconSection *section); +void yon_set_default_sections(dictionary *section); +char *yon_char_divide_search(char *source, char* dividepos, int delete_divider); +char *yon_char_divide(char *source, int dividepos); +dictionary *yon_section_new(dictionary *section, char *section_name, char *categories); +void yon_switch_theme(dictionary **dict, dictionary *newone); +dictionary *yon_dictionary_find(dictionary **dict, char *key); +void yon_segment_show(actionWidgets *widgets, SectionSettingSegment *sgm); +dictionary *yon_dictionary_create_empty(); +dictionary *yon_dictionary_rip(dictionary *dict); +dictionary *yon_dictionary_get_last(dictionary *dict); +dictionary *yon_dictionary_switch_places(dictionary *dict,int aim); +dictionary *yon_dictionary_create_with_data(char *key, void *data); +dictionary *yon_dictionary_create_with_data_connected(dictionary *dict, char *key, void *data); +SectionSettingSegment *yon_create_section_setting(char *name, char *categories); +void yon_segments_show(actionWidgets *widgets); +void yon_segments_hide(actionWidgets *widgets); +void yon_dictionary_make_first(dictionary *dict); +dictionary *yon_create_icon_section_list(dictionary *sections); +int yon_show_icon_views(dictionary *IVS,actionWidgets *widgets); +void yon_icon_size_convert(int mode); +char *yon_char_new(char *chr); +int launch(thread_output *thread); +float yon_time_average(dictionary *times); +void yon_time_reg_for_average(dictionary *listofregs, int size, time_t tm); +void yon_dictionary_switch_to_last(dictionary **dict); +dictionary *yon_dictionary_create_conneced(dictionary *targetdict); +int yon_get_icon_size(int size); + +#endif \ No newline at end of file diff --git a/ubl-settings-manager.desktop b/ubl-settings-manager.desktop index c16cec7..8038835 100644 --- a/ubl-settings-manager.desktop +++ b/ubl-settings-manager.desktop @@ -1,14 +1,14 @@ [Desktop Entry] Encoding=UTF-8 Name=ubl-settings-manager -Name[ru]=Настройки UBLinux +Name[ru]=Менеджер настроек UBLinux GenericName=ubl-settings-manager -GenericName[ru]=Настройки UBLinux +GenericName[ru]=Менеджер настроек UBLinux Comment=ubl-settings-manager -Comment[ru]=Приложение для управления настройками UBLinux +Comment[ru]=Менеджер управления настройками UBLinux Type=Application Exec=ubl-settings-manager Icon=com.ublinux.ubl-settings-manager Terminal=false X-XfcePluggable=false -Categories=XFCE;GTK;Settings;DesktopSettings;X-XFCE-SettingsDialog;X-XFCE-SystemSettings; +Categories=XFCE;GTK;Settings;DesktopSettings;X-XFCE-SettingsDialog;