diff --git a/.gitignore b/.gitignore
index 6b9beb7..041dc72 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,5 @@
.vscode/
ubl-settings-video
ubl-settings-video.glade~
-*ubl-settings-video.glade#
\ No newline at end of file
+*ubl-settings-video.glade#
+compile/
\ No newline at end of file
diff --git a/com.ublinux.ubl-settings-video.checked.svg b/com.ublinux.ubl-settings-video.checked.svg
new file mode 100644
index 0000000..e3cab42
--- /dev/null
+++ b/com.ublinux.ubl-settings-video.checked.svg
@@ -0,0 +1,327 @@
+
+
diff --git a/com.ublinux.ubl-settings-video.warning.svg b/com.ublinux.ubl-settings-video.warning.svg
new file mode 100644
index 0000000..9a90dba
--- /dev/null
+++ b/com.ublinux.ubl-settings-video.warning.svg
@@ -0,0 +1,55 @@
+
+
diff --git a/source/ubl-settings-video.c b/source/ubl-settings-video.c
index 4783211..54d83f8 100644
--- a/source/ubl-settings-video.c
+++ b/source/ubl-settings-video.c
@@ -1,13 +1,13 @@
#include "ubl-settings-video.h"
#include "ubl-utils.h"
-// #include
config videoconfig;
void yon_on_plug_added(GtkSocket* self, gpointer user_data){
}
+
void yon_on_plug_removed(GtkSocket* self, gpointer user_data){
}
@@ -17,24 +17,127 @@ void on_auto_choose_drivers(GtkWidget *self, widgets_dict *widgets){
gtk_widget_set_sensitive(widgets->mainDriverFailsafeNvidiaLabel,!state);
gtk_widget_set_sensitive(widgets->mainDriverProprietaryDriverCombo,!state);
+ gtk_widget_set_sensitive(widgets->mainDriverProprietaryDriverButton,!state);
gtk_widget_set_sensitive(widgets->mainDriverProprietaryDriverLabel,!state);
gtk_widget_set_sensitive(widgets->mainDriverFailsafeAMDCombo,!state);
gtk_widget_set_sensitive(widgets->mainDriverFailsafeAMDLabel,!state);
gtk_widget_set_sensitive(widgets->mainDriverFailsafeNvidiaCombo,!state);
}
-void on_manual_config_moniitors(GtkWidget *self, widgets_dict *widgets){
- int state=gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(self));
+void on_closed_configuration(GtkWidget *self, MonitorSettings *monitors){
+ gtk_widget_destroy(monitors->templateMonitorConfigurationWindow);
+}
+
+void on_save_configuration_local(GtkWidget *self){
- gtk_widget_set_sensitive(widgets->mainMonitorVisualConfigurationBox,state);
}
+void on_save_configuration_global(GtkWidget *self){
+
+}
+void on_load_configuration_local(GtkWidget *self){
+
+}
+void on_load_configuration_global(GtkWidget *self){
-void on_closed_configuration(GtkWidget *self, MonitorSettings *monitors){
- gtk_widget_destroy(monitors->templateMonitorConfigurationWindow);
}
-void on_save_configuration(GtkWidget self, MonitorSettings *monitors){
+void on_accept_monitor_settings(GtkWidget *self){
+}
+void on_check_optisun(GtkWidget *self){
+
+}
+void on_check_primusrun(GtkWidget *self){
+
+}
+void on_check_discrete_only(GtkWidget *self){
+
+}
+
+void yon_parse_monitor(dictionary *monitor,char *string_of_settings){
+ char *result=NULL;
+ if ((strstr(string_of_settings,","))){
+ result=yon_char_divide_search(string_of_settings,",",1);
+ ((monitorconfig*)monitor->data)->resolution=result;
+ }
+ char *tmp=NULL;
+ if (tmp=strstr(string_of_settings,"rotate:")) ((monitorconfig*)monitor->data)->rotation=tmp;
+
+}
+
+void yon_setup_config(){
+ FILE *videoports = popen(get_ports_command, "r");
+ char str[1000];
+ while (fgets(str,1000,videoports)){
+ printf("%s\n",str);
+ char *strng=yon_char_divide_search(str,"\n",0);
+ monitorconfig *monitor=malloc(sizeof(monitorconfig));
+ monitor->port=yon_char_new(strng);
+ if (!videoconfig.monitors) {
+ videoconfig.monitors=yon_dictionary_create_with_data(strng,monitor);}
+ else {
+ videoconfig.monitors=yon_dictionary_create_with_data_connected(videoconfig.monitors,strng,monitor);
+ }
+ memset(str,0,1000);
+ }
+ char *command=load_drivers_local_command;
+ dictionary *dct;
+ for_dictionaries(dct,videoconfig.monitors){
+ command=yon_char_get_augumented(command,(yon_char_get_augumented(" XORG_MONITOR[",yon_char_get_augumented(((monitorconfig*)dct->data)->port,"]"))));
+ }
+ FILE *local = popen(command, "r");
+ char result[1000];
+ memset(result,0,1000);
+ if (fgets(result,1000,local)&&strcmp(result,"(null)\n")!=0)
+ videoconfig.failsafenVidia=result;
+ else videoconfig.failsafenVidia=NULL;
+ memset(result,0,1000);
+ if (fgets(result,1000,local)&&strcmp(result,"(null)\n")!=0)
+ videoconfig.failsafeATI=result;
+ else videoconfig.failsafeATI=NULL;
+ memset(result,0,1000);
+ if (fgets(result,1000,local)&&strcmp(result,"(null)\n")!=0)
+ videoconfig.optirun=result;
+ else videoconfig.optirun=NULL;
+ memset(result,0,1000);
+ if (fgets(result,1000,local)&&strcmp(result,"(null)\n")!=0)
+ videoconfig.primusrun=result;
+ else videoconfig.primusrun=NULL;
+ for_dictionaries(dct,videoconfig.monitors){
+ fgets(result,1000,local);
+ if (strcmp(result,"(null)\n")!=0){
+ char *curmonitor=strstr(result,"=")+1;
+ yon_parse_monitor(dct,curmonitor);
+ }
+ }
+}
+
+void on_apps_chooser_open (GtkWidget *self,widgets_dict *widgets, int mode){
+ GtkBuilder *builder=gtk_builder_new_from_file(glade_path);\
+ // FILE *output=popen("");
+
+ printf("not implemented yet\n");
+}
+
+void yon_fill_ui(widgets_dict *widgets){
+ if (!videoconfig.proprietary||strstr(videoconfig.proprietary,"\n")==0)
+ gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->mainDriverProprietaryDriverCombo),0);
+
+ if (!videoconfig.failsafenVidia||strstr(videoconfig.failsafenVidia,"\n")==0)
+ gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->mainDriverFailsafeNvidiaCombo),0);
+
+ if (!videoconfig.failsafeATI||strstr(videoconfig.failsafeATI,"\n")==0)
+ gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->mainDriverFailsafeAMDCombo),0);
+
+ if (!videoconfig.optirun||strstr(videoconfig.optirun,"\n")==0)
+ gtk_entry_set_text(GTK_ENTRY(widgets->mainExtraLaunchOptirunEntry),videoconfig.optirun);
+
+ if (!videoconfig.primusrun||strstr(videoconfig.primusrun,"\n")==0)
+ gtk_entry_set_text(GTK_ENTRY(widgets->mainExtraLaunchPrismusunEntry),videoconfig.primusrun);
+
+ if (videoconfig.gapfix==0)
+ gtk_combo_box_set_active(GTK_COMBO_BOX(widgets->mainExtraFixGapCombo),0);
+
}
void on_confugure_monitor_settings(GtkWidget *self, MonitorSettings *settings){
@@ -60,7 +163,7 @@ void on_confugure_monitor_settings(GtkWidget *self, MonitorSettings *settings){
monitors->templateMonitorConfigurationSaveButton=GTK_WIDGET(gtk_builder_get_object(builder,"templateMonitorConfigurationSaveButton"));
g_signal_connect(G_OBJECT(monitors->templateMonitorConfigurationCancelButton), "clicked", G_CALLBACK(on_closed_configuration), monitors);
- g_signal_connect(G_OBJECT(monitors->templateMonitorConfigurationSaveButton), "clicked", G_CALLBACK(on_save_configuration), monitors);
+ // g_signal_connect(G_OBJECT(monitors->templateMonitorConfigurationSaveButton), "clicked", G_CALLBACK(on_save_configuration), monitors);
// if (i!=0)
// gtk_radio_button_join_group(GTK_RADIO_BUTTON(monitors[i].templateMonitorConfigurationMainRadio),GTK_RADIO_BUTTON(monitors[i-1].templateMonitorConfigurationMainRadio));
@@ -68,18 +171,24 @@ void on_confugure_monitor_settings(GtkWidget *self, MonitorSettings *settings){
gtk_label_set_text(GTK_LABEL(monitors->templateMonitorConfigurationResolutionLabel),_("Resolution (px): "));
gtk_label_set_text(GTK_LABEL(monitors->templateMonitorConfigurationFrequencyLabel),_("Frequency (Hz): "));
gtk_label_set_text(GTK_LABEL(monitors->templateMonitorConfigurationRotationLabel),_("Rotation: "));
- gtk_label_set_text(GTK_LABEL(monitors->templateMonitorConfigurationDoNotSwitchOffLabel),_("Do not switch display off"));
-
+ // gtk_label_set_text(GTK_LABEL(monitors->templateMonitorConfigurationDoNotSwitchOffLabel),_("Do not switch display off"));
gtk_button_set_label(GTK_BUTTON(monitors->templateMonitorConfigurationMainRadio),_("Main monitor"));
gtk_button_set_label(GTK_BUTTON(monitors->templateMonitorConfigurationParameterLineCheck),_("through parameter line:"));
gtk_button_set_label(GTK_BUTTON(monitors->templateMonitorConfigurationDoNotSwitchOffCheck),_("DPMS off"));
gtk_widget_show(monitors->templateMonitorConfigurationWindow);
+ char *addln=NULL;
+ if (!monitors->curconfig||!((monitorconfig*)monitors->curconfig->data)->resolution) addln=_("Default Settings");
+ else addln=((monitorconfig*)monitors->curconfig->data)->resolution;
+ gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(monitors->templateMonitorConfigurationResolutionCombo),addln);
+ gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(monitors->templateMonitorConfigurationFrequencyCombo),_("Default Settings"));
+ gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(monitors->templateMonitorConfigurationRotationCombo),_("Default Settings"));
}
MonitorSettings *yon_setup_monitor_settings(){
int monitors_n=yon_check_for_monitors();
MonitorSettings *monitors = NULL;
monitors=malloc(sizeof(MonitorSettings)*monitors_n);
+ // videoconfig.videoconfig=videoconfig.videoconfig->first;
for (int i=0;idata)->port));
+ char *res=yon_char_get_augumented(((monitorconfig*)monitors[i].curconfig->data)->resolution,"");
+ if (!res) res=_("Default settings");
+ gtk_label_set_text(GTK_LABEL(monitors[i].templateMonitorInfoResolutionLabel),res);
gtk_overlay_add_overlay(GTK_OVERLAY(monitors[i].templateMonitorscreenOverlay),monitors[i].templateMonitorInfoBox);
g_signal_connect(G_OBJECT(monitors[i].templateMonitorInfoConfigureButton), "clicked", G_CALLBACK(on_confugure_monitor_settings), &monitors[i]);
+
+ if(videoconfig.monitors->next)
+ videoconfig.monitors=videoconfig.monitors->next;
}
return monitors;
}
@@ -118,18 +234,24 @@ dictionary *yon_dictionary_pack_overlays(MonitorSettings *monitors, int size){
void yon_setup_widgets(widgets_dict *widgets){
widgets->builder=gtk_builder_new_from_file(glade_path);
+ widgets->appsPackWindow=yon_gtk_builder_get_widget(widgets->builder,"appsPackWindow");
+ widgets->appsPackBox=yon_gtk_builder_get_widget(widgets->builder,"appsPackBox");
widgets->MainWindow=yon_gtk_builder_get_widget(widgets->builder,"MainWindow");
widgets->headBox=yon_gtk_builder_get_widget(widgets->builder,"headBox");
widgets->headInfoLabel=yon_gtk_builder_get_widget(widgets->builder,"headInfoLabel");
widgets->mainPlugBox=yon_gtk_builder_get_widget(widgets->builder,"mainPlugBox");
widgets->mainErrorBox=yon_gtk_builder_get_widget(widgets->builder,"mainErrorBox");
widgets->mainHeadOverlay=yon_gtk_builder_get_widget(widgets->builder,"mainHeadOverlay");
+ widgets->extraOptirunChooseAppsButton=yon_gtk_builder_get_widget(widgets->builder,"extraOptirunChooseAppsButton");
+ widgets->extraPrimusunChooseAppsButton=yon_gtk_builder_get_widget(widgets->builder,"extraPrimusunChooseAppsButton");
widgets->mainHeadBackgroundImage=yon_gtk_builder_get_widget(widgets->builder,"mainHeadBackgroundImage");
widgets->mainDriverAutomaticallyChooseCheck=yon_gtk_builder_get_widget(widgets->builder,"mainDriverAutomaticallyChooseCheck");
widgets->mainDriverProprietaryDriverLabel=yon_gtk_builder_get_widget(widgets->builder,"mainDriverProprietaryDriverLabel");
widgets->mainDriverFailsafeNvidiaLabel=yon_gtk_builder_get_widget(widgets->builder,"mainDriverFailsafeNvidiaLabel");
widgets->mainDriverFailsafeAMDLabel=yon_gtk_builder_get_widget(widgets->builder,"mainDriverFailsafeAMDLabel");
widgets->mainDriverProprietaryDriverCombo=yon_gtk_builder_get_widget(widgets->builder,"mainDriverProprietaryDriverCombo");
+ widgets->mainExtraFixGapCombo=yon_gtk_builder_get_widget(widgets->builder,"mainExtraFixGapCombo");
+ widgets->mainDriverProprietaryDriverButton=yon_gtk_builder_get_widget(widgets->builder,"mainDriverProprietaryDriverButton");
widgets->mainDriverFailsafeNvidiaCombo=yon_gtk_builder_get_widget(widgets->builder,"mainDriverFailsafeNvidiaCombo");
widgets->mainDriverFailsafeAMDCombo=yon_gtk_builder_get_widget(widgets->builder,"mainDriverFailsafeAMDCombo");
widgets->mainDriverFrameLabel=yon_gtk_builder_get_widget(widgets->builder,"mainDriverFrameLabel");
@@ -182,7 +304,8 @@ void yon_setup_widgets(widgets_dict *widgets){
g_signal_connect(G_OBJECT(widgets->mainDriverAutomaticallyChooseCheck), "toggled", G_CALLBACK(on_auto_choose_drivers), widgets);
g_signal_connect(G_OBJECT(widgets->MainWindow), "destroy", G_CALLBACK(gtk_main_quit), NULL);
-
+ g_signal_connect(G_OBJECT(widgets->extraOptirunChooseAppsButton), "clicked", G_CALLBACK(on_apps_chooser_open), widgets);
+ g_signal_connect(G_OBJECT(widgets->extraPrimusunChooseAppsButton), "clicked", G_CALLBACK(on_apps_chooser_open), widgets);
gtk_label_set_text(GTK_LABEL(widgets->headInfoLabel),_("Video output configuration"));
gtk_label_set_text(GTK_LABEL(widgets->mainDriverProprietaryDriverLabel),_("Proprietary driver: "));
@@ -213,15 +336,16 @@ void yon_setup_widgets(widgets_dict *widgets){
gtk_menu_item_set_label(GTK_MENU_ITEM(widgets->mainHeaderSettingsAboutMenuItem),_("About"));
// gtk_button_set_label(GTK_BUTTON(widgets->mainExtraLaunchThroughButton),_("Change"));
+ yon_ubl_header_setup(widgets->mainHeadOverlay,widgets->headBox,widgets->mainHeadBackgroundImage, banner_path);
+ // gtk_overlay_add_overlay(GTK_OVERLAY(widgets->mainHeadOverlay),widgets->headBox);
- gtk_overlay_add_overlay(GTK_OVERLAY(widgets->mainHeadOverlay),widgets->headBox);
-
- gtk_image_set_from_file(GTK_IMAGE(widgets->mainHeadBackgroundImage),banner_path);
+ // gtk_image_set_from_file(GTK_IMAGE(widgets->mainHeadBackgroundImage),banner_path);
MonitorSettings *monitors = yon_setup_monitor_settings();
- widgets->monitors=yon_dictionary_pack_monitors(monitors,yon_check_for_monitors());
+ videoconfig.monitors=yon_dictionary_pack_monitors(monitors,yon_check_for_monitors());
widgets->overlays=yon_dictionary_pack_overlays(monitors,yon_check_for_monitors());
yon_dictionary_gtk_pack_start_multiple_widgets(widgets->overlays,widgets->mainMonitorVisualConfigurationBox,0,0,0);
// yon_dictionary_gtk_pack_start_multiple_widgets(widgets->monitors,widgets->mainMonitorConfigurationBox,0,0,0);
+
}
int main(int argc, char *argv[]){
@@ -233,12 +357,13 @@ int main(int argc, char *argv[]){
GError error;
// xfconf_init (&error);
// display_channel = xfconf_channel_new ("displays");
-
-
+ videoconfig.applist=yon_apps_scan_and_parse_desktops(&videoconfig.appsize);
+ yon_setup_config();
widgets_dict widgets;
yon_setup_widgets(&widgets);
gtk_widget_show(widgets.MainWindow);
-
+ yon_fill_ui(&widgets);
+ yon_ubl_status_box_render(widgets.mainStatusBox,widgets.mainStatusIcon,widgets.mainStatusLabel,"com.ublinux.ubl-settings-video.checked","Configuration has been loaded",BACKGROUND_IMAGE_SUCCESS_TYPE);
GtkCssProvider *css=gtk_css_provider_new();
gtk_css_provider_load_from_path(css,CssPath,NULL);
gtk_style_context_add_provider_for_screen(gdk_screen_get_default(),
diff --git a/source/ubl-settings-video.h b/source/ubl-settings-video.h
index f329a68..2af67ef 100644
--- a/source/ubl-settings-video.h
+++ b/source/ubl-settings-video.h
@@ -5,10 +5,14 @@
#include
#include
#include
+#include
+#include
#include "ubl-utils.h"
#ifndef UBL_SETINGS_VIDEO_H
#define UBL_SETINGS_VIDEO_H
+#define icon_name "com.ublinux.ubl-settings-video"
+
#define banner_path "/usr/share/ubl-settings-video/ui/ubl-settings-video-banner.png"
#define glade_path "/usr/share/ubl-settings-video/ui/ubl-settings-video.glade"
@@ -21,6 +25,18 @@
#define StatusSaveGlobalFailed _("Saving to global configuration Succeeded")
#define StatusSaveLocalFailed _("Saving to local configuration Succeeded")
+#define get_ports_command "xrandr |grep -E \"^[A-Z0-9]* connected\" |cut -d' ' -f1"
+
+#define load_drivers_command "/usr/bin/ubconfig --default --source "
+
+#define load_drivers_global_command "/usr/bin/ubconfig --default --source global get video FAILSAFENVIDIA FAILSAFEATI OPTIRUN PRIMUSRUN "
+
+#define save_drivers_global_command "/usr/bin/ubconfig --default --source global set video FAILSAFENVIDIA=%s FAILSAFEATI=%s OPTIRUN=%s PRIMUSRUN=%s "
+
+#define load_drivers_local_command "/usr/bin/ubconfig --default --source system get video FAILSAFENVIDIA FAILSAFEATI OPTIRUN PRIMUSRUN "
+
+#define save_drivers_local_command "/usr/bin/ubconfig --default --source system set video FAILSAFENVIDIA=%s FAILSAFEATI=%s OPTIRUN=%s PRIMUSRUN=%s "
+
char *local;
typedef char* string;
@@ -32,13 +48,38 @@ string version_application = "";
#define _(String) gettext(String)
typedef struct {
+ int autoChooseDrivers;
dictionary *videoconfig;
+ dictionary *monitors;
+ char *proprietary;
+ char *failsafenVidia;
+ char *failsafeATI;
+ int descreteOnly;
+ char *optirun;
+ char *primusrun;
+ int gapfix;
+ int optiorprimus;
+ apps *applist;
+ int appsize;
} config;
+typedef struct {
+ int main;
+ char *port;
+ char *resolution;
+ char *resolutionCapabilities;
+ char *frequency;
+ char *rotation;
+ char *stringparameters;
+} monitorconfig;
typedef struct {
dictionary *monitors;
dictionary *overlays;
GtkBuilder *builder;
+ GtkWidget *appsPackBox;
+ GtkWidget *appsPackWindow;
+ GtkWidget *extraOptirunChooseAppsButton;
+ GtkWidget *extraPrimusunChooseAppsButton;
GtkWidget *MainWindow;
GtkWidget *headBox;
GtkWidget *headInfoLabel;
@@ -51,6 +92,8 @@ typedef struct {
GtkWidget *mainDriverFailsafeNvidiaLabel;
GtkWidget *mainDriverFailsafeAMDLabel;
GtkWidget *mainDriverProprietaryDriverCombo;
+ GtkWidget *mainDriverProprietaryDriverButton;
+ GtkWidget *mainExtraFixGapCombo;
GtkWidget *mainDriverFailsafeNvidiaCombo;
GtkWidget *mainDriverFailsafeAMDCombo;
GtkWidget *mainDriverFrameLabel;
@@ -125,10 +168,12 @@ typedef struct {
GtkWidget *templateMonitorInfoNameLabel;
GtkWidget *templateMonitorInfoResolutionLabel;
GtkWidget *templateMonitorInfoConfigureButton;
+ dictionary *curconfig;
} MonitorSettings;
+
int yon_check_for_monitors();
MonitorSettings *yon_setup_monitor_settings();
dictionary *yon_dictionary_pack_monitors(MonitorSettings *monitors, int size);
diff --git a/source/ubl-utils.c b/source/ubl-utils.c
index befb9a1..ed01b97 100644
--- a/source/ubl-utils.c
+++ b/source/ubl-utils.c
@@ -49,6 +49,10 @@ typedef struct IVGrapgicals{
//dictionary functions
+/**
+ * yon_dictionary_create_empty:
+ * Creates and returns empty dictionary
+*/
dictionary *yon_dictionary_create_empty(){
dictionary *dict=malloc(sizeof(dictionary));
dict->data=NULL;
@@ -66,7 +70,7 @@ void yon_dictionary_switch_to_last(dictionary **dict){
}
dictionary * yon_dictionary_create_conneced(dictionary *targetdict){
- yon_dictionary_switch_to_last(&targetdict);
+ targetdict=yon_dictionary_get_last(targetdict);
targetdict->next=yon_dictionary_create_empty();
targetdict->next->prev=targetdict;
targetdict->next->first=targetdict->first;
@@ -176,7 +180,7 @@ void yon_dictionary_make_nth(dictionary *dict, int nth){
dictionary *yon_dictionary_create_with_data(char *key, void *data){
dictionary *dct=yon_dictionary_create_empty();
- dct->key=key;
+ dct->key=yon_char_new(key);
dct->data=data;
dct->data_type=DICTIONARY_OTHER_TYPE;
return dct;
@@ -184,7 +188,7 @@ dictionary *yon_dictionary_create_with_data(char *key, void *data){
dictionary *yon_dictionary_create_with_data_connected(dictionary *dict, char *key, void *data){
dictionary *dct=yon_dictionary_create_conneced(dict);
- dct->key=key;
+ dct->key=yon_char_new(key);
dct->data=data;
dct->data_type=DICTIONARY_OTHER_TYPE;
return dct;
@@ -236,21 +240,36 @@ dictionary *yon_dictionary_rip(dictionary *dict){
}
dictionary *yon_dictionary_get_nth(dictionary *dict, int place){
+ dict=dict->first;
for (int i=0;inext;
- return dict;
+ 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);
- sprintf(final,"%s%s",source,append);
+ 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);
@@ -258,6 +277,9 @@ char *yon_char_new(char *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);
@@ -265,7 +287,11 @@ char *yon_cut(char *source, int size, int startpos){
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);
@@ -278,13 +304,22 @@ char *yon_char_divide(char *source, int dividepos){
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;
@@ -319,8 +354,12 @@ apps *yon_apps_scan_and_parse_desktops(int *sizef){
{
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",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;
@@ -432,30 +471,96 @@ int yon_launch(thread_output *thread){
#ifdef __GTK_H__
-
-
-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_gtk_icon_view_hide_empty(dictionary *icon_view_segment){
- if (icon_view_segment->data_type==DICTIONARY_IVGRAPHICALS_TYPE){
- for (dictionary *icvd=icon_view_segment->first;icvd!=NULL;icvd=icvd->next){
- IVGraphicals *icv=icvd->data;
- GtkTreeIter iter;
- if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(icv->LV),&iter)==0){
- gtk_widget_hide(icv->Box);
- // gtk_widget_hide(GTK_WIDGET(icv->sep));
- }
- }
- }
-}
+// 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){
@@ -471,4 +576,24 @@ int yon_dictionary_gtk_pack_end_multiple_widgets(dictionary *dict, GtkWidget *de
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
\ No newline at end of file
diff --git a/source/ubl-utils.h b/source/ubl-utils.h
index 73de3e8..444fd93 100644
--- a/source/ubl-utils.h
+++ b/source/ubl-utils.h
@@ -10,8 +10,9 @@
#include
#include
+#define DesktopPath "/usr/share/applications/"
-#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,
@@ -48,6 +49,9 @@ typedef struct apps{
//dictionary functions
+dictionary *yon_dictionary_create_empty();
+
+dictionary * yon_dictionary_create_conneced(dictionary *targetdict);
dictionary *yon_dictionary_get_last(dictionary *dict);
@@ -113,29 +117,48 @@ int yon_launch(thread_output *thread);
#ifdef __GTK_H__
#define yon_gtk_builder_get_widget(obj,obj2) GTK_WIDGET(gtk_builder_get_object(obj,obj2))
-typedef struct IVGrapgicals{
- char *sectionName;
- char *categories;
- GtkListStore *LV;
- GtkWidget *Box;
- GtkWidget *IV;
- GtkWidget *label;
- GtkWidget *sep;
- GtkCellRendererPixbuf *iconRender;
-} IVGraphicals;
+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);
-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);
#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
\ No newline at end of file
diff --git a/ubl-settings-video.css b/ubl-settings-video.css
index 79796fe..499b1e8 100644
--- a/ubl-settings-video.css
+++ b/ubl-settings-video.css
@@ -5,6 +5,10 @@
margin:0px;
padding:0px;
}
+
+.workingbg {
+ background:@theme_base_color;
+}
.textoutline {
text-shadow: 0.5px 0 0.5px @theme_bg_color,
0 0.5px 0.5px @theme_bg_color,
@@ -88,4 +92,12 @@
padding: 3px 10px 5px 5px;
background:@theme_selected_bg_color;
border-radius:2px;
- }
\ No newline at end of file
+ }
+
+ .boxInfoMessError{
+ background-color: #ea9999;
+}
+
+.boxInfoMessOK{
+ background-color: #f3f0ac;
+}
\ No newline at end of file
diff --git a/ubl-settings-video.glade b/ubl-settings-video.glade
index 0564f91..f6ac563 100644
--- a/ubl-settings-video.glade
+++ b/ubl-settings-video.glade
@@ -3,24 +3,7 @@
-
-
-
+
-
-
-
- True
- False
-
-
- 90
- True
- False
- 5
- 5
- 5
- 5
- 6
- 6
- 69
- com.ublinux.ubl-settings-video
-
-
- False
- True
- 0
-
-
-
-
- True
- False
-
-
- True
- False
-
-
- True
- False
- vertical
-
-
- 255
- True
- False
- Video output configuration
-
-
-
-
-
-
-
-
- True
- True
- 0
-
-
-
-
- False
- True
- 0
-
-
-
-
- True
- True
- 0
-
-
-
-
- True
- False
-
-
- False
- True
- 1
-
-
-
-
- True
- True
- 1
-
-
-
-
- True
- False
- document-edit-symbolic
-
-
- True
- False
- document-edit-symbolic
-
+ 800
+ 600
False
800
600
@@ -289,6 +129,7 @@
5
6
6
+ 25
False
@@ -360,65 +201,56 @@
-
+
+ 165
True
- False
+ True
+ 5
+ 5
5
5
- 5
- vertical
+ external
-
+
True
False
- 0.019999999552965164
- in
-
+
True
False
- 5
- 5
- 12
- 5
+ 5
+ 5
+ 5
+ 5
+ 5
+ vertical
-
+
True
False
- vertical
-
-
- Automatically choose and use driver
- True
- True
- False
- start
- True
-
-
- False
- True
- 0
-
-
+ 0.019999999552965164
+ in
-
+
True
False
- 5
+ 5
+ 5
+ 12
+ 5
-
+
True
False
vertical
- 5
-
+
+ Automatically choose and use driver
True
- False
+ True
+ False
start
- Proprietary driver:
- 0
+ True
False
@@ -427,12 +259,152 @@
-
+
True
False
- start
- Failsafe driver nVidia:
- 0
+ 5
+
+
+ True
+ False
+ vertical
+ 5
+
+
+ True
+ False
+ start
+ Proprietary driver:
+ 0
+
+
+ False
+ True
+ 0
+
+
+
+
+ True
+ False
+ start
+ Failsafe driver nVidia:
+ 0
+
+
+ False
+ True
+ 1
+
+
+
+
+ True
+ False
+ start
+ Failsafe driver AMD/ATI:
+ 0
+
+
+ False
+ True
+ 2
+
+
+
+
+ False
+ True
+ 0
+
+
+
+
+ True
+ False
+ vertical
+ 5
+
+
+ True
+ False
+ 5
+
+
+ True
+ False
+
+ - ubm-nvidia-340
+ - ubm-nvidia-390
+ - ubm-nvidia-470
+ - ubm-nvidia-510
+ - ubm-nvidia-515
+ - ubm-nvidia-optimus
+
+
+
+ True
+ True
+ 0
+
+
+
+
+ True
+ True
+ True
+ image8
+
+
+ False
+ True
+ 1
+
+
+
+
+ False
+ True
+ 0
+
+
+
+
+ True
+ False
+
+ - Off
+ - fbdev
+
+
+
+ False
+ True
+ 1
+
+
+
+
+ True
+ False
+
+ - Off
+ - fbdev
+
+
+
+ False
+ True
+ 2
+
+
+
+
+ True
+ True
+ 1
+
+
False
@@ -440,45 +412,54 @@
1
-
-
- True
- False
- start
- Failsafe driver AMD/ATI:
- 0
-
-
- False
- True
- 2
-
-
-
- False
- True
- 0
-
+
+
+
+
+ True
+ False
+ Driver
+
+
+
+
+ False
+ True
+ 0
+
+
+
+
+ True
+ False
+ vertical
+
+
+ True
+ False
+ 0.019999999552965164
+ in
-
+
True
False
vertical
- 5
-
+
True
False
-
- - ubm-nvidia-340
- - ubm-nvidia-390
- - ubm-nvidia-470
- - ubm-nvidia-510
- - ubm-nvidia-515
- - ubm-nvidia-optimus
-
+ 5
+ 5
+ 5
+ 5
+ 5
+ 5
+ 10
+
+
+
False
@@ -486,306 +467,228 @@
0
-
-
- True
- False
-
- - Off
- - fbdev
-
-
-
- False
- True
- 1
-
-
-
-
- True
- False
-
- - Off
- - fbdev
-
-
-
- False
- True
- 2
-
-
-
- True
- True
- 1
-
+
+
+
+ True
+ False
+ Monitor configuration
+
- False
+ True
True
- 1
+ 0
+
+ True
+ True
+ 1
+
-
-
-
-
- True
- False
- Driver
-
-
-
-
- False
- True
- 0
-
-
-
-
- True
- False
- vertical
-
-
- True
- False
- 0.019999999552965164
- in
-
+
True
False
- 5
- 5
+ 0.019999999552965164
+ in
-
- 165
+
True
- True
- 12
- 5
- 12
- 5
- external
+ False
+ 5
+ 5
+ 12
+ 5
-
+
True
False
-
+
+ discrete video only (AMD/ATI)
True
- False
- 5
- 5
- 10
-
-
-
+ True
+ False
+ 5
+ 5
+ True
+
+ False
+ True
+ 1
+
-
-
-
-
- True
- False
- Monitor configuration
-
-
-
-
- True
- True
- 0
-
-
-
-
- True
- True
- 1
-
-
-
-
- True
- False
- 0.019999999552965164
- in
-
-
- True
- False
- 5
- 5
- 12
- 5
-
-
- True
- False
-
-
- discrete video only (AMD/ATI)
+
+
True
- True
- False
- 5
- True
+ False
+ 0
+ Hybrid graphics
-
- False
- True
- 1
-
+
+ False
+ True
+ 2
+
-
-
-
-
- True
- False
- 0
- Hybrid graphics
-
-
-
-
- False
- True
- 2
-
-
-
-
- True
- False
- 5
- 0.019999999552965164
- in
-
-
- True
- False
- 5
- 5
- 12
- 5
-
+
True
False
- vertical
+ 5
+ 0.019999999552965164
+ in
-
+
True
False
- 5
-
-
- True
- False
- vertical
- 5
-
-
- Launch programms through optirun (nVidia):
- True
- True
- False
- True
-
-
- False
- True
- 0
-
-
-
-
- Launch programs through primusun (nVidia):
- True
- True
- False
- True
-
-
- False
- True
- 1
-
-
-
-
- False
- True
- 0
-
-
-
-
- True
- False
- vertical
- 5
-
-
- True
- True
- steam
-
-
- True
- True
- 0
-
-
-
-
- True
- True
- steam
-
-
- True
- True
- 1
-
-
-
-
- True
- True
- 1
-
-
+ 5
+ 5
+ 12
+ 5
True
False
vertical
- 5
-
+
True
- False
- True
- True
- image1
+ False
+ 5
+
+
+ True
+ False
+ vertical
+ 5
+
+
+ Launch programms through optirun (nVidia):
+ True
+ True
+ False
+ True
+
+
+ False
+ True
+ 0
+
+
+
+
+ Launch programs through primusun (nVidia):
+ True
+ True
+ False
+ True
+
+
+ False
+ True
+ 1
+
+
+
+
+ False
+ True
+ 0
+
+
+
+
+ True
+ False
+ vertical
+ 5
+
+
+ True
+ False
+ True
+ steam
+
+
+ True
+ True
+ 0
+
+
+
+
+ True
+ False
+ True
+ steam
+
+
+ True
+ True
+ 1
+
+
+
+
+ True
+ True
+ 1
+
+
+
+
+ True
+ False
+ vertical
+ 5
+
+
+
+ False
+ True
+ 0
+
+
+
+
+
+ False
+ True
+ 1
+
+
+
+
+ False
+ True
+ 2
+
+
False
@@ -794,12 +697,38 @@
-
+
True
- False
- True
- True
- image2
+ False
+ 5
+ 5
+
+
+ True
+ False
+ Fix frame gap (nVidia):
+ 0
+
+
+ False
+ True
+ 0
+
+
+
+
+ True
+ False
+
+ - 1st variant
+
+
+
+ True
+ True
+ 1
+
+
False
@@ -808,76 +737,26 @@
-
- False
- True
- 2
-
-
- False
- True
- 0
-
-
-
+
+
True
False
- 5
- 5
-
-
- True
- False
- Fix frame gap (nVidia):
- 0
-
-
- False
- True
- 0
-
-
-
-
- True
- False
-
- - 1st variant
-
-
-
- True
- True
- 1
-
-
+ Extra
-
- False
- True
- 1
-
+
+ False
+ True
+ 3
+
-
-
- True
- False
- Extra
-
-
-
- False
- True
- 3
-
@@ -1044,54 +923,320 @@
-
+
+ True
+ True
+ False
+ True
+ True
+ SettingsMenu
+ none
+
+
+
+
+
+ False
+ True
+ 1
+
+
+
+
+ end
+ 3
+
+
+
+
+
+
+ vertical
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ False
+ О Программе
+ False
+ True
+ center
+ com.ublinux.ubl-settings-video
+ dialog
+ True
+ ubl-settings-video
+ 1.2
+ Copyright © 2023 - UBSoft Software LLC
+ Settings for video output
+ 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
+ com.ublinux.ubl-settings-video
+ True
+ gpl-2-0
+
+
+ False
+ vertical
+ 2
+
+
+ False
+ False
+ top
+ spread
+
+
+ False
+ False
+ 0
+
+
+
+
+
+
+
+
+
+ False
+ ubl-settings-video
+ 800
+ 558
+ com.ublinux.ubl-settings-video
+
+
+ True
+ False
+ 5
+ 5
+ 5
+ 5
+ vertical
+
+
+ True
+ True
+ external
+ in
+
+
+ True
+ False
+
+
+ True
+ False
+ vertical
+
+
+
+
+
+
+
+
+
+
+ True
+ True
+ 0
+
+
+
+
+ True
+ False
+
+
+
+
+
+ True
+ False
+ 5
+ 5
+ True
+
+
+ Cancel
+ True
+ True
+ True
+
+
+ False
+ True
+ 0
+
+
+
+
+ OK
+ True
+ True
+ True
+
+
+ False
+ True
+ 1
+
+
+
+
+ False
+ True
+ end
+ 1
+
+
+
+
+ False
+ True
+ 1
+
+
+
+
+
+
+ True
+ False
+
+
+ 90
+ True
+ False
+ 5
+ 5
+ 5
+ 5
+ 6
+ 6
+ 69
+ com.ublinux.ubl-settings-video
+
+
+ False
+ True
+ 0
+
+
+
+
+ True
+ False
+
+
+ True
+ False
+
+
True
- True
- False
- True
- True
- SettingsMenu
- none
+ False
+ vertical
-
+
+ 255
+ True
+ False
+ Video output configuration
+
+
+
+
+
+
+
+
+ True
+ True
+ 0
+
False
True
- 1
+ 0
- end
- 3
+ True
+ True
+ 0
+
+
+
+
+ True
+ False
+
+
+ False
+ True
+ 1
+
+ True
+ True
+ 1
+
-
- vertical
-
-
-
-
-
-
-
-
-
+
+ True
+ False
+ document-edit-symbolic
-
-
-
-
-
-
-
-
-
+
+ True
+ False
+ document-edit-symbolic
True
@@ -1108,13 +1253,16 @@
False
center
center
+ 3
+ 3
20
vertical
True
False
- Monitor
+ Monitor
+ True
@@ -1132,6 +1280,8 @@
True
False
+ 5
+ 5
1920x1200:60Hz
@@ -1176,12 +1326,265 @@
False
emblem-ok-symbolic
+
+ True
+ False
+ process-stop-symbolic
+
+
+ True
+ False
+ emblem-ok-symbolic
+
+
+ True
+ False
+ system-run-symbolic
+
+
+
+
+
+
+
+
+
+
+
+
+ g89
+ Settings
+ Settings
+
+
+
+
+ True
+ True
+
+
+ True
+ False
+ vertical
+
+
+ True
+ True
+ 15
+ 15
+ 6
+ multiple
+ horizontal
+ liststore5
+ 1
+ True
+
+
+
+ 0
+
+
+
+
+ 0
+ True
+ word
+
+
+ 1
+
+
+
+
+ True
+ True
+ 0
+
+
+
+
+
+
+ True
+ False
+ 5
+
+
+ True
+ False
+ 25
+ applications-system
+
+
+ False
+ True
+ 0
+
+
+
+
+ True
+ False
+ Settings
+
+
+ False
+ True
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ argadrh
+ ssfasfasf
+ khjgkj
+
+
+
+
+ 450
+ 300
+ False
+ com.ublinux.ubl-settings-video
+
+
+ True
+ False
+ 5
+ 5
+ 5
+ 5
+ vertical
+ 5
+
+
+ True
+ True
+ liststore6
+ True
+ 2
+
+
+
+
+
+ Driver
+
+
+
+ 0
+
+
+
+
+
+
+ Description
+
+
+
+ 1
+
+
+
+
+
+
+ True
+ True
+ 0
+
+
+
+
+ True
+ False
+ 5
+
+
+
+
+
+ True
+ False
+ 5
+ True
+
+
+ Cancel
+ True
+ True
+ True
+ image6
+
+
+ False
+ True
+ 0
+
+
+
+
+ Accept
+ True
+ True
+ True
+ image7
+
+
+ False
+ True
+ 1
+
+
+
+
+ False
+ True
+ end
+ 1
+
+
+
+
+ False
+ True
+ 1
+
+
+
+
+
+
+ radiobutton
+ True
+ True
+ False
+ True
+ True
+
False
+ True
com.ublinux.ubl-settings-video
@@ -1238,8 +1641,8 @@
False
15
15
- True
True
+ radioMainMonitor
False
@@ -1273,10 +1676,11 @@
-
+
True
False
center
+ 0
True
@@ -1302,7 +1706,7 @@
-
+
True
False
center
@@ -1322,7 +1726,7 @@
- True
+ False
True
1
@@ -1346,7 +1750,7 @@
-
+
True
False
@@ -1400,6 +1804,7 @@
True
+ False
True
center
@@ -1416,6 +1821,20 @@
3
+
+
+ True
+ False
+
+
+
+
+
+ True
+ True
+ 4
+
+
True
@@ -1424,7 +1843,7 @@
False
True
- 4
+ 5
@@ -1480,7 +1899,7 @@
False
True
- 5
+ 6
@@ -1493,6 +1912,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
True
False