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 @@ + + + + + + image/svg+xml + + + + + + + + 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 @@ -114,152 +97,9 @@ - - - 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 - - - - - - - - - - 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 + + + True + False + True + True + image1 + + + False + True + 0 + + + + + True + False + True + True + image2 + + + 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