First commit

pull/1/head^2
Ivan Yartsev 2 years ago
parent 47bdc83fd7
commit 44ddb4dfb1

1
.gitignore vendored

@ -0,0 +1 @@
.vscode/

@ -0,0 +1,155 @@
#!/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-usergroups.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}/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}/etc/xdg"
@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}/ui/" "${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"

@ -1,2 +1,28 @@
# ubl-settings-quotas
# Выполнить
# Build
In order to build ubl-settings-manager 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)

@ -0,0 +1 @@
VERSION 1.2

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 210 KiB

@ -0,0 +1,30 @@
cmake_minimum_required(VERSION 3.7)
project(ubl-settings-quotas)
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-quotas.c
ubl-settings-quotas.h
ubl-utils.c)
set(LIBRARIES
${GTK_LIBRARIES}
pthread)
add_executable(ubl-settings-quotas ${SOURCE_FILES})
target_link_libraries(ubl-settings-quotas ${LIBRARIES})
install(TARGETS ubl-settings-quotas DESTINATION bin)

@ -0,0 +1,15 @@
#include <gtk/gtk.h>
#include "ubl-settings-quotas.h"
int main(int argc, char *argv[]){
gtk_init(&argc,&argv);
GtkBuilder *builder=gtk_builder_new_from_file(glade_path);
GtkWidget *window=GTK_WIDGET(gtk_builder_get_object(builder,"MainWindow"));
GtkWidget *Header = yon_gtk_builder_get_widget(builder,"boxColor");
GtkWidget *Image = yon_gtk_builder_get_widget(builder,"HeadBackgroundImage");
GtkWidget *Overlay = yon_gtk_builder_get_widget(builder,"HeadOverlay");
yon_ubl_header_setup(Overlay,Header,Image,image_path);
gtk_widget_show_all(window);
gtk_main();
}

@ -0,0 +1,4 @@
#include "ubl-utils.h"
#define glade_path "/usr/share/ubl-settings-quotas/ui/ubl-settings-quotas.glade"
#define image_path "/usr/share/ubl-settings-quotas/ui/ubl-settings-quotas-banner.png"

@ -0,0 +1,599 @@
#include "ubl-utils.h"
#ifndef UBL_UTILS
typedef enum {
DICTIONARY_ACTION_WIDGETS_TYPE,
DICTIONARY_IVGRAPHICALS_TYPE,
DICTIONARY_OTHER_TYPE
} DICT_TYPE;
typedef struct dictionary {
char *key;
void *data;
struct dictionary *next;
struct dictionary *prev;
struct dictionary *first;
DICT_TYPE data_type;
} dictionary;
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;
#ifdef __GTK_H__
typedef struct IVGrapgicals{
char *sectionName;
char *categories;
GtkListStore *LV;
GtkWidget *Box;
GtkWidget *IV;
GtkWidget *label;
GtkWidget *sep;
GtkCellRendererPixbuf *iconRender;
} IVGraphicals;
#endif
#endif
//dictionary functions
/**
* yon_dictionary_create_empty:
* Creates and returns empty dictionary
*/
dictionary *yon_dictionary_create_empty(){
dictionary *dict=malloc(sizeof(dictionary));
dict->data=NULL;
dict->key=NULL;
dict->next=NULL;
dict->prev=NULL;
dict->first=dict;
dict->data_type=DICTIONARY_OTHER_TYPE;
return dict;
}
void yon_dictionary_switch_to_last(dictionary **dict){
if ((*dict)->next!=NULL)
for ((*dict)=(*dict)->first;(*dict)->next!=NULL;(*dict)=(*dict)->next){}
}
dictionary * yon_dictionary_create_conneced(dictionary *targetdict){
targetdict=yon_dictionary_get_last(targetdict);
targetdict->next=yon_dictionary_create_empty();
targetdict->next->prev=targetdict;
targetdict->next->first=targetdict->first;
targetdict->next->data_type=DICTIONARY_OTHER_TYPE;
return targetdict->next;
}
dictionary *yon_dictionary_get_last(dictionary *dict){
dictionary *dct=NULL;
for (dct=dict->first;dct->next!=NULL;dct=dct->next){}
return dct;
}
dictionary *yon_dictionary_switch_places(dictionary *dict,int aim){
if (aim<0){
if (dict->prev){
if (dict->prev->prev){
dictionary *next = dict->next,*prev=dict->prev,*preprev=prev->prev;
if (next){
preprev->next=dict;
dict->prev=preprev;
dict->next=prev;
prev->prev=dict;
prev->next=next;
next->prev=prev;
} else {
preprev->next=dict;
dict->prev=preprev;
dict->next=prev;
prev->prev=dict;
prev->next=NULL;
}
return prev;
} else {
dictionary *next = dict->next,*prev=dict->prev;
if (next){
yon_dictionary_make_first(dict);
dict->prev=NULL;
dict->next=prev;
prev->prev=dict;
prev->next=next;
next->prev=prev;
} else {
dict->prev=NULL;
dict->next=prev;
prev->prev=dict;
prev->next=NULL;
}
return prev;
}
}
} else if (aim>0){
if (dict->next){
if (dict->next->next){
dictionary *next = dict->next,*prev=dict->prev,*afnext=next->next;
if (prev){
prev->next=next;
next->prev=prev;
next->next=dict;
dict->prev=next;
dict->next=afnext;
afnext->prev=dict;
} else {
yon_dictionary_make_first(next);
next->prev=NULL;
next->next=dict;
dict->prev=next;
dict->next=afnext;
afnext->prev=dict;
}
return next;
} else {
dictionary *next = dict->next,*prev=dict->prev;
if (prev){
prev->next=next;
next->prev=prev;
next->next=dict;
dict->prev=next;
dict->next=NULL;
} else {
next->prev=NULL;
next->next=dict;
dict->prev=next;
dict->next=NULL;
}
}
}
}
}
void yon_dictionary_make_first(dictionary *dict){
for (dictionary *dct=dict->first;dct!=NULL;dct=dct->next){
dct->first=dict;
}
}
void yon_dictionary_make_nth(dictionary *dict, int nth){
dictionary *dct=dict->first;
for (int i=0;i<nth;i++){if (dct==NULL) return; else dct=dct->next;}
yon_dictionary_rip(dict);
dictionary *prev=dct->prev;
prev->next=dict;
dict->prev=prev;
dict->next=dct;
dct->prev=dict;
}
dictionary *yon_dictionary_create_with_data(char *key, void *data){
dictionary *dct=yon_dictionary_create_empty();
dct->key=yon_char_new(key);
dct->data=data;
dct->data_type=DICTIONARY_OTHER_TYPE;
return dct;
}
dictionary *yon_dictionary_create_with_data_connected(dictionary *dict, char *key, void *data){
dictionary *dct=yon_dictionary_create_conneced(dict);
dct->key=yon_char_new(key);
dct->data=data;
dct->data_type=DICTIONARY_OTHER_TYPE;
return dct;
}
dictionary *yon_dictionary_connect(dictionary *old, dictionary *toconnect){
dictionary *dict=yon_dictionary_get_last(old);
dict->next=toconnect;
toconnect->prev=dict;
toconnect->first=dict->first;
return toconnect;
}
dictionary *yon_dictionary_find(dictionary **dict, char *key){
dictionary *dct=*dict;
for (dictionary *pointer=dct->first;pointer!=NULL;pointer=pointer->next){
if (strcmp(pointer->key,key)==0){
*dict=pointer;
return pointer;
}
}
return NULL;
}
dictionary *yon_dictionary_rip(dictionary *dict){
if (!dict->next){
dictionary *prev=dict->prev;
if (prev){
prev->next=NULL;
return prev;
} else return dict;
}
else if (!dict->prev){
dictionary *next=dict->next;
if (next){
yon_dictionary_make_first(next);
next->prev=NULL;
return next;
}
else return dict;
}
else {
dictionary *next=dict->next, *prev=dict->prev;
next->prev=prev;
prev->next=next;
return next;
}
}
dictionary *yon_dictionary_get_nth(dictionary *dict, int place){
dict=dict->first;
for (int i=0;i<place; i++)
if(dict)
dict=dict->next;
if (dict) return dict;
else return NULL;
}
//char functions
/**
* creates new char string by combining two char strings.
*/
char *yon_char_get_augumented(char *source, char *append){
if (source&&append){
int size=strlen(source)+strlen(append)+1;
char *final=malloc(size);
memset(final,0,size);
if (strstr(source,"%%"))
sprintf(final,source,append);
else
sprintf(final,"%s%s",source,append);
return final;
} else
return NULL;
}
/**
* creates new char string by copying another char.
*/
char *yon_char_new(char *chr){
char *newchar=malloc(strlen(chr)+1);
memset(newchar,0,strlen(chr)+1);
memcpy(newchar,chr,strlen(chr));
return newchar;
}
/**
* cuts source string by size length from startpos position.
*/
char *yon_cut(char *source, int size, int startpos){
char *cut=NULL;
cut=malloc(size+1);
memset(cut,0,size+1);
memcpy(cut,source+startpos,size);
return cut;
}
/**
* divides source string in dividepos position,
* returning left part of divided string and
* inserting right part to source string.
*/
char *yon_char_divide(char *source, int dividepos){
char *cut=malloc(dividepos+1);
memset(cut,0,dividepos+1);
memcpy(cut,source,dividepos);
char *left=malloc(strlen(source)-strlen(cut));
memset(left,0,strlen(source)-strlen(cut));
memcpy(left,source+dividepos+1,(strlen(source)-dividepos));
memset(source,0,strlen(source));
memcpy(source,left,strlen(left));
return cut;
}
/**
* searches string dividepos in source string and divides it,
* returning left part of divided string and
* inserting right part to source string.
* if delete_divider is 0, left part will contain delete_divider substring, else
* it will stay in right part.
*/
char *yon_char_divide_search(char *source, char* dividepos, int delete_divider){
char *cut=strstr(source,dividepos);
int leng=strlen(source)-strlen(cut);
cut=yon_char_divide(source,leng);
return cut;
}
/**
* converts int to char.
*/
char *yon_char_from_int(int int_to_convert){
int i=1;
float convert_check=(float)int_to_convert;
for (i=1;convert_check>10;i++){
convert_check=convert_check/10;
}
char *ch=malloc(i*sizeof(char)+1);
sprintf(ch,"%d",int_to_convert);
return ch;
}
//parsing functions
apps *yon_apps_scan_and_parse_desktops(int *sizef){
int size=0;
struct apps *applist;
{
DIR *directory=opendir(DesktopPath);
struct dirent *de;
while ((de = readdir(directory)))
{
FILE *file;
char *path=yon_char_get_augumented(DesktopPath,de->d_name);
file=fopen(path,"r");
if (strlen(de->d_name)>9)
{
char *extension=strstr(path,".");
if (extension!=NULL)
{
if (strcmp(extension,".desktop")==0)
{
apps tempapp;
GKeyFile *gfile=g_key_file_new();
GError *err=NULL;
g_key_file_load_from_file(gfile,path,G_KEY_FILE_KEEP_TRANSLATIONS,NULL);
char *Type=g_key_file_get_string(gfile,"Desktop Entry", "Type",&err);
if (err){
printf("%s\n",err->message);
}
if (strcmp(Type,"Application")==0) tempapp.Type=1; else if (strcmp(Type,"pyApplication")==0) tempapp.Type=2; else continue;
tempapp.Name=g_key_file_get_locale_string(gfile,"Desktop Entry","Name",setlocale(LC_ALL,NULL),NULL);
if (tempapp.Name==NULL) continue;
tempapp.Categories=g_key_file_get_string(gfile,"Desktop Entry", "Categories",NULL);
if (tempapp.Categories==NULL) continue;
tempapp.Exec=g_key_file_get_string(gfile,"Desktop Entry", "Exec",NULL);
if (tempapp.Exec==NULL) continue;
tempapp.Icon=g_key_file_get_string(gfile,"Desktop Entry", "Icon",NULL);
if (tempapp.Icon==NULL) continue;
tempapp.Pluggable=g_key_file_get_boolean(gfile,"Desktop Entry", "Pluggable",NULL);
if (!tempapp.Pluggable) tempapp.Pluggable=g_key_file_get_boolean(gfile,"Desktop Entry", "X-XfcePluggable",NULL);
if (tempapp.Pluggable) tempapp.DualPluggable=g_key_file_get_boolean(gfile,"Desktop Entry", "X-UBLPluggable",NULL);
if (g_key_file_get_boolean(gfile,"Desktop Entry", "X-UBL-SettingsManager-Hidden",NULL)==0)
if (size==0){
applist=(apps*)malloc(size+1*sizeof(apps));
applist[0].Name=yon_char_new(tempapp.Name);
applist[0].Categories=yon_char_new(tempapp.Categories);
applist[0].Exec=yon_char_new(tempapp.Exec);
applist[0].Icon=yon_char_new(tempapp.Icon);
applist[0].Type=tempapp.Type;
applist[0].Pluggable=tempapp.Pluggable;
applist[0].DualPluggable=tempapp.DualPluggable;
size++;
} else {
applist=(apps*)realloc(applist,(size+1)*sizeof(apps));
applist[size].Name=yon_char_new(tempapp.Name);
applist[size].Categories=yon_char_new(tempapp.Categories);
applist[size].Exec=yon_char_new(tempapp.Exec);
applist[size].Icon=yon_char_new(tempapp.Icon);
applist[size].Pluggable=tempapp.Pluggable;
applist[size].DualPluggable=tempapp.DualPluggable;
applist[size].Type=tempapp.Type;
size++;
}
}
}
}
}
}
*sizef=size;
return applist;
};
void yon_apps_sort(apps *applist,int size){
apps tmp;
if (size>2)
{
for (int i=1;i<size;i++)
{
for (int j=1;j<size;j++)
{
if (strcmp(applist[j].Name,applist[j-1].Name)<0){
tmp=applist[j];
applist[j]=applist[j-1];
applist[j-1]=tmp;
};
}
};
}
};
apps *yon_apps_get_by_name(apps *applist,char *name, int size){
for (int i=0;i<size;i++){
if (strcmp(applist[i].Name,name)==0) return &applist[i];
}
return NULL;
};
//terminal-using functions
int yon_launch_app(char *name){
char *path=name;
thread_output *thread=malloc(sizeof(thread_output));
thread->command=path;
thread->exitcode=malloc(sizeof(int));
pthread_t thread_id;
pthread_create(&thread_id, NULL, (void*)yon_launch, thread);
return *thread->exitcode;
};
int yon_launch_app_with_arguments(char *name, char *args){
char *path=yon_char_get_augumented("/usr/bin/",name);
path=yon_char_get_augumented(path," ");
path=yon_char_get_augumented(path,args);
pthread_t thread_id;
thread_output *thread=malloc(sizeof(thread_output));
thread->command=path;
thread->exitcode=malloc(sizeof(int));
pthread_create(&thread_id, NULL, (void*)yon_launch, thread);
return *thread->exitcode;
};
int yon_launch(thread_output *thread){
int a=0;
a=system(thread->command);
*thread->exitcode=a;
return *thread->exitcode;
}
//Gtk functions
#ifdef __GTK_H__
// dictionary *yon_gtk_app_chooser_create(GtkBuilder *builder){
// GtkWidget *chooserWindow=gtk_window_new(GTK_WINDOW_TOPLEVEL);
// GtkWidget *Box=gtk_box_new(GTK_ORIENTATION_VERTICAL,5);
// GtkWidget *Frame=gtk_frame_new("");
// GtkWidget *Scroll=gtk_scrolled_window_new(NULL, gtk_adjustment_new(0,0,10000,1,10,100));
// GtkWidget *PackBox=gtk_box_new(GTK_ORIENTATION_VERTICAL,5);
// GtkWidget *ButtonsBox=gtk_box_new(GTK_ORIENTATION_HORIZONTAL,5);
// GtkWidget *ButtonsPlaceBox=gtk_box_new(GTK_ORIENTATION_HORIZONTAL,5);
// GtkWidget *CancelButton=gtk_button_new_with_label("Cancel");
// GtkWidget *AcceptButton=gtk_button_new_with_label("Accept");
// gtk_container_add(GTK_CONTAINER(chooserWindow),Box);
// gtk_box_pack_start(GTK_BOX(Box),Frame,1,1,0);
// gtk_container_add(GTK_CONTAINER(Frame),PackBox);
// gtk_box_pack_start(GTK_BOX(Box),ButtonsBox,0,0,0);
// gtk_box_pack_end(GTK_BOX(ButtonsBox),ButtonsPlaceBox,0,0,0);
// gtk_box_pack_end(GTK_BOX(ButtonsPlaceBox),AcceptButton,0,0,0);
// gtk_box_pack_end(GTK_BOX(ButtonsPlaceBox),CancelButton,0,0,0);
// gtk_box_pack_start(GTK_BOX(PackBox),(GtkWidget*)yon_gtk_app_chooser_apps_create(builder),0,0,0);
// gtk_widget_show_all(chooserWindow);
// }
/**
* yon_iv_segment_create:
* connect_to - dictionary, in the end of which new one will be connected;
* name - name of this segment, renders on label;
* categories - desktop file categories that application NEEDS to have to render in that category;
* segment_icon_name - icon name for this section;
* builder - newly allocated builder with glade file connected where template widgets are stored:
* - templateAppsIconView - setted up icon view;
* - templateAppsPack - setted up container for every template widget;
* - templateAppsImage - image for rendering section image;
* - templateAppsLabel - label for rendering section name;
*/
// dictionary *yon_iv_segment_create(dictionary *connect_to, char *name, char *categories, char *segment_icon_name){
// IVSegment *segment=malloc(sizeof(IVSegment));
// segment->name=name;
// segment->categories=categories;
// GtkBuilder *builder=gtk_builder_new_from_string(return_app_string(),-1);
// GtkWidget *iv=yon_gtk_builder_get_widget(builder,"templateAppsIconView");
// GtkWidget *expander=yon_gtk_builder_get_widget(builder,"templateAppsPack");
// GtkWidget *image=yon_gtk_builder_get_widget(builder,"templateAppsImage");
// GtkWidget *label=yon_gtk_builder_get_widget(builder,"templateAppsLabel");
// GtkIconTheme *theme=gtk_icon_theme_get_default();
// gtk_image_set_from_pixbuf(GTK_IMAGE(image),gtk_icon_theme_load_icon_for_scale(theme,segment_icon_name,20,1,GTK_ICON_LOOKUP_FORCE_SVG,NULL));
// gtk_label_set_text(GTK_LABEL(label),name);
// GtkListStore *ls=GTK_LIST_STORE(gtk_builder_get_object(builder,"liststore5"));
// // g_signal_connect(G_OBJECT(iv), "item-activated", G_CALLBACK(on_activate), videoconfig.applist);
// segment->Expander=expander;
// segment->IV=iv;
// segment->LS=ls;
// segment->Image=image;
// dictionary *dict=NULL;
// if (connect_to) {
// // connect_to=yon_dictionary_get_last(connect_to);
// dict=yon_dictionary_create_with_data_connected(connect_to,name,segment);
// } else
// dict=yon_dictionary_create_with_data(name,segment);
// return dict;
// }
// GtkWidget *yon_gtk_app_chooser_apps_create(){
// GtkWidget *Box=gtk_box_new(GTK_ORIENTATION_VERTICAL,0);
// dictionary *IVS=yon_iv_segment_create(NULL, "Graphics", "", "dialog-yes-symbolic");
// yon_iv_segment_create(IVS, "Tools", "", "dialog-yes-symbolic");
// yon_iv_segment_create(IVS, "Internet", "", "dialog-yes-symbolic");
// yon_iv_segment_create(IVS, "Multimedia", "", "dialog-yes-symbolic");
// yon_iv_segment_create(IVS, "Settings", "", "dialog-yes-symbolic");
// yon_iv_segment_create(IVS, "Education", "", "dialog-yes-symbolic");
// yon_iv_segment_create(IVS, "Office", "", "dialog-yes-symbolic");
// yon_iv_segment_create(IVS, "Other", "", "dialog-yes-symbolic");
// yon_iv_segment_create(IVS, "Development", "", "dialog-yes-symbolic");
// yon_iv_segment_create(IVS, "System", "", "dialog-yes-symbolic");
// dictionary *nd;
// for_dictionaries(nd,IVS){
// gtk_box_pack_start(GTK_BOX(Box),((IVSegment*)nd->data)->Expander,0,0,0);
// }
// return Box;
// }
// GtkWidget *yon_gtk_socket_create_new_with_connect(GtkWidget *container, gpointer data){
// GtkWidget *socket;
// socket = gtk_socket_new();
// g_signal_connect(G_OBJECT(socket),"plug-added",G_CALLBACK(yon_on_plug_added),data);
// g_signal_connect(G_OBJECT(socket),"plug-removed",G_CALLBACK(yon_on_plug_removed),data);
// g_signal_connect(G_OBJECT(socket),"destroy",G_CALLBACK(yon_on_plug_removed),data);
// gtk_box_pack_start(GTK_BOX(container),socket,1,1,0);
// return socket;
// };
int yon_dictionary_gtk_pack_start_multiple_widgets(dictionary *dict, GtkWidget *destination, gboolean expand, gboolean fill, int padding){
for (dictionary *dct=dict->first; dct!=NULL;dct=dct->next){
gtk_box_pack_start(GTK_BOX(destination),(GtkWidget*)dct->data,expand,fill,padding);
}
return 1;
}
int yon_dictionary_gtk_pack_end_multiple_widgets(dictionary *dict, GtkWidget *destination, gboolean expand, gboolean fill, int padding){
for (dictionary *dct=dict->first; dct!=NULL;dct=dct->next){
gtk_box_pack_end(GTK_BOX(destination),(GtkWidget*)dct->data,expand,fill,padding);
}
return 1;
}
void _yon_ubl_header_setup(GtkWidget *Overlay, GtkWidget *Head, GtkWidget *Image, char *image_path){
gtk_overlay_add_overlay(GTK_OVERLAY(Overlay),Head);
gtk_image_set_from_file(GTK_IMAGE(Image),image_path);
}
void _yon_ubl_status_box_render(GtkWidget *StatusBox, GtkWidget *StatusIcon, GtkWidget *StatusLabel, char *IconName, char* StatusText, BACKGROUND_IMAGE_TYPE BackgroundClass){
GtkIconTheme *ictheme=gtk_icon_theme_get_default();
GError *err=NULL;
gtk_image_set_from_pixbuf(GTK_IMAGE(StatusIcon),gtk_icon_theme_load_icon_for_scale(ictheme,IconName,25,1,GTK_ICON_LOOKUP_FORCE_SIZE,&err));
if (err){
printf("%s\n",err->message);
g_error_free(err);
}
gtk_label_set_text(GTK_LABEL(StatusLabel),StatusText);
if (BackgroundClass==BACKGROUND_IMAGE_SUCCESS_TYPE){
gtk_style_context_add_class(gtk_widget_get_style_context(StatusBox),"boxInfoMessOK");
} else if (BackgroundClass==BACKGROUND_IMAGE_FAIL_TYPE){
gtk_style_context_add_class(gtk_widget_get_style_context(StatusBox),"boxInfoMessError");
}
}
#endif

@ -0,0 +1,164 @@
#ifndef UBL_UTILS
#define UBL_UTILS
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <string.h>
#include <dirent.h>
#include <locale.h>
#include <gtk/gtk.h>
#include <gtk/gtkx.h>
#define DesktopPath "/usr/share/applications/"
#define for_dictionaries(obj,obj1) for(obj=obj1->first;obj!=NULL;obj=obj->next)
typedef enum {
DICTIONARY_ACTION_WIDGETS_TYPE,
DICTIONARY_IVGRAPHICALS_TYPE,
DICTIONARY_OTHER_TYPE
} DICT_TYPE;
typedef struct {
char *command;
int *exitcode;
} thread_output;
typedef struct dictionary {
char *key;
void *data;
struct dictionary *next;
struct dictionary *prev;
struct dictionary *first;
DICT_TYPE data_type;
} dictionary;
typedef struct apps{
char *Name;
int Type;
char *Categories;
char *Exec;
char *Icon;
int Pluggable;
int DualPluggable;
} apps;
//dictionary functions
dictionary *yon_dictionary_create_empty();
dictionary * yon_dictionary_create_conneced(dictionary *targetdict);
dictionary *yon_dictionary_get_last(dictionary *dict);
dictionary *yon_dictionary_switch_places(dictionary *dict,int aim);
void yon_dictionary_make_first(dictionary *dict);
void yon_dictionary_make_nth(dictionary *dict, int nth);
dictionary *yon_dictionary_create_with_data(char *key, void *data);
dictionary *yon_dictionary_create_with_data_connected(dictionary *dict, char *key, void *data);
dictionary *yon_dictionary_connect(dictionary *old, dictionary *toconnect);
dictionary *yon_dictionary_find(dictionary **dict, char *key);
dictionary *yon_dictionary_rip(dictionary *dict);
dictionary *yon_dictionary_get_nth(dictionary *dict, int place);
//char functions
char *yon_char_get_augumented(char *source, char *append);
char *yon_char_new(char *chr);
char *yon_cut(char *source, int size, int startpos);
char *yon_char_divide(char *source, int dividepos);
char *yon_char_divide_search(char *source, char* dividepos, int delete_divider);
char *yon_char_from_int(int int_to_convert);
//parsing functions
apps *yon_apps_scan_and_parse_desktops(int *sizef);
void yon_apps_sort(apps *applist,int size);
apps *yon_apps_get_by_name(apps *applist,char *name, int size);
//terminal-using functions
int yon_launch_app(char *name);
int yon_launch_app_with_arguments(char *name, char *args);
int yon_launch(thread_output *thread);
//Gtk functions
#ifdef __GTK_H__
#define yon_gtk_builder_get_widget(obj,obj2) GTK_WIDGET(gtk_builder_get_object(obj,obj2))
typedef struct {
GtkWidget *Icon;
GtkWidget *Label;
GtkWidget *IconView;
GtkListStore *List;
} expander_icon_view;
// GtkWidget *yon_gtk_app_chooser_apps_create();
// dictionary *yon_gtk_app_chooser_create();
// expander_icon_view yon_gtk_icon_view_expander_create(GtkWidget *pack, ...);
GtkWidget *yon_gtk_socket_create_new_with_connect(GtkWidget *container, gpointer data);
int yon_gtk_icon_view_hide_empty(dictionary *icon_view_segment);
int yon_dictionary_gtk_pack_start_multiple_widgets(dictionary *dict, GtkWidget *destination, gboolean expand, gboolean fill, int padding);
int yon_dictionary_gtk_pack_end_multiple_widgets(dictionary *dict, GtkWidget *destination, gboolean expand, gboolean fill, int padding);
//uninitialised
void yon_on_plug_added(GtkSocket* self, gpointer user_data);
void yon_on_plug_removed(GtkSocket* self, gpointer user_data);
#endif
typedef enum {
BACKGROUND_IMAGE_SUCCESS_TYPE,
BACKGROUND_IMAGE_FAIL_TYPE
} BACKGROUND_IMAGE_TYPE;
#ifdef __cplusplus
#define yon_ubl_header_setup(overlay,head,image,imag_path) _yon_ubl_header_setup(GTK_WIDGET(overlay.gobj()),GTK_WIDGET(head.gobj()),GTK_WIDGET(image.gobj()),(char*)imag_path)
#define yon_ubl_status_box_render(statusbox, statusicon, statuslabel, iconname, statustext, backgroundclass) _yon_ubl_status_box_render(GTK_WIDGET(statusbox.gobj()), GTK_WIDGET(statusicon.gobj()), GTK_WIDGET(statuslabel.gobj()), (char*)iconname, (char*)statustext, backgroundclass)
#else
#define yon_ubl_header_setup(overlay,head,image,imag_path) _yon_ubl_header_setup(GTK_WIDGET(overlay),GTK_WIDGET(head),GTK_WIDGET(image), (char*)imag_path)
#define yon_ubl_status_box_render(statusbox, statusicon, statuslabel, iconname, statustext, backgroundclass) _yon_ubl_status_box_render(statusbox, statusicon, statuslabel, iconname, statustext, backgroundclass)
#endif
void _yon_ubl_header_setup(GtkWidget *Overlay, GtkWidget *Head, GtkWidget *Image, char *image_path);
void _yon_ubl_status_box_render(GtkWidget *StatusBox, GtkWidget *StatusIcon, GtkWidget *StatusLabel, char *IconName, char* StatusText, BACKGROUND_IMAGE_TYPE BackgroundClass);
#endif

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

@ -0,0 +1,143 @@
.bannerbackground {
background-color: #404040;
}
.thin{
padding:0px;
margin:0px;
transition: 0ms ease-out;
}
.thin:active {
background-color: @theme_selected_bg_color;
transition: 10ms ease-out;
}
.transparent {
background:none;
border:none;
transition: 0ms ease-out;
}
#GnomeIcon{
border-style:solid;
border-bottom-width: 1px;
border-image: linear-gradient(90deg, alpha(@theme_text_color,0.4) 55%, alpha(@theme_bg_color, 0) 100%);
border-image-slice: 1;
}
#SepIcon{
background-color: alpha(@theme_text_color, 0.6);
}
#iconlabel {
font-size:14px;
font-weight: bold;
}
.roundborder > * {
border-width:0px;
}
.roundborder:backdrop > * {
border-width:0px;
border-radius:5px;
}
.noborder {
border: none;
}
.menuitembottom{
margin-top:0px;
margin-bottom:3px;
border-color:inherit;
border-left-width:inherit;
border-right-width:inherit;
}
.menuitemmiddle{
margin-top:0px;
margin-bottom:0px;
border-color:inherit;
border-left-width:inherit;
border-right-width:inherit;
}
.menuitemtop{
margin-bottom:0px;
border-color:inherit;
border-top-width:inherit;
border-left-width:inherit;
border-right-width:inherit;
}
.menuitemtop *{
margin:2px 2px 0 2px;
padding: 5px 10px 3px 5px;
border:transparent;
}
.menuitemmiddle *{
margin:0 2px 0 2px;
padding: 3px 10px 3px 5px;
border:transparent;
}
.menuitembottom *{
margin:0 2px 2px 2px;
padding: 3px 10px 5px 5px;
}
.menuitemtop:hover {
background:@theme_bg_color;
border-color:inherit;
border-top-width:inherit;
border-left-width:inherit;
border-right-width:inherit;
}
.menuitemmiddle:hover {
background:@theme_bg_color;
border-color:inherit;
border-left-width:inherit;
border-right-width:inherit;
}
.menuitembottom:hover {
background:@theme_bg_color;
border-color:inherit;
border-bottom-width:0px;
border-left-width:inherit;
border-right-width:inherit;
}
.menuitemtop:hover* {
margin:2px 2px 0 2px;
padding: 5px 10px 3px 5px;
background:@theme_selected_bg_color;
border-radius:2px;
}
.menuitemmiddle:hover* {
margin:0 2px 0 2px;
padding: 3px 10px 3px 5px;
background:@theme_selected_bg_color;
border-radius:2px;
}
.menuitembottom:hover* {
margin:0 2px 2px 2px;
padding: 3px 10px 5px 5px;
background:@theme_selected_bg_color;
border-radius:2px;
}
.workingbg, #workingbg {
background-color:@theme_base_color;
}
.workingbg.view.cell:selected {
background-color:@theme_selected_bg_color;
}
.workingbg.view.cell:hover {
background-color:darker(@theme_selected_bg_color);
color:@theme_selected_text_color;
border-radius:3px;
}
.bkim {
transition: 200ms ease-out;
background-image: none;
}

@ -0,0 +1,15 @@
[Desktop Entry]
Encoding=UTF-8
Name=ubl-settings-quotas
Name[ru]=Настройки квот
GenericName=ubl-settings-quotas
GenericName[ru]=Настройки квот
Comment=ubl-settings-quotas
Comment[ru]=Приложение для управления настройками квот
Type=Application
Exec=ubl-settings-quotas
Icon=com.ublinux.ubl-settings-quotas
Terminal=false
X-XfcePluggable=true
X-UBLPluggable=true
Categories=XFCE;GTK;Settings;DesktopSettings;X-XFCE-SettingsDialog;X-XFCE-SystemSettings;

File diff suppressed because it is too large Load Diff
Loading…
Cancel
Save