diff --git a/arguments.c b/arguments.c index ccec590..66b4101 100644 --- a/arguments.c +++ b/arguments.c @@ -10,28 +10,38 @@ #include "node_settings.h" #include "concat.h" +#include "xrandr.h" + void settingsLoad() { - addParameterKey(PARAMETER_XFREERDP, "xfreerdp", true, true); - addParameterKey(PARAMETER_SERVER, "/v:", true, true); - addParameterKey(PARAMETER_USERNAME, "/u:", true, true); - addParameterKey(PARAMETER_PASSWORD, "/p:", true, true); - addParameterKey(PARAMETER_CERTIGNORE, "/cert-ignore", false, true); - addParameterKey(PARAMETER_THEMES, "-themes", false, true); - addParameterKey(PARAMETER_WALLPAPER, "-wallpaper", false, true); - addParameterKey(PARAMETER_FULLSCREEN, "/f", true, true); - addParameterKey(PARAMETER_MULTIMONITOR, "/multimon", true, true); - addParameterKey(PARAMETER_AUTHENTICATION, "-authentication", true, true); - addParameterKey(PARAMETER_SECURITY, "/sec:", true, true); + addParameterKey(PARAMETER_XFREERDP, "xfreerdp", true, true, NULL, NULL); + addParameterKey(PARAMETER_SERVER, "/v:", true, true, NULL, NULL); + addParameterKey(PARAMETER_USERNAME, "/u:", true, true, NULL, NULL); + addParameterKey(PARAMETER_PASSWORD, "/p:", true, true, NULL, NULL); + addParameterKey(PARAMETER_CERTIGNORE, "/cert-ignore", false, true, NULL, NULL); + addParameterKey(PARAMETER_THEMES, "-themes", false, true, NULL, NULL); + addParameterKey(PARAMETER_WALLPAPER, "-wallpaper", false, true, NULL, NULL); + addParameterKey(PARAMETER_FULLSCREEN, "/f", false, true, NULL, NULL); + addParameterKey(PARAMETER_MULTIMONITOR, "/multimon", false, true, getParameter(PARAMETER_FULLSCREEN), NULL); + addParameterKey(PARAMETER_AUTHENTICATION, "-authentication", true, true, NULL, NULL); + addParameterKey(PARAMETER_SECURITY, "/sec:", true, true, NULL, NULL); addParameterValue(PARAMETER_SECURITY, VALUE_SECURITY_TLS, "tls", true); addParameterValue(PARAMETER_SECURITY, VALUE_SECURITY_RDP, "rdp", false); addParameterValue(PARAMETER_SECURITY, VALUE_SECURITY_NLA, "nla", false); addParameterValue(PARAMETER_SECURITY, VALUE_SECURITY_EXT, "ext", false); - addParameterKey(PARAMETER_BITSPERPIXEL, "/bpp:", true, true); + addParameterKey(PARAMETER_BITSPERPIXEL, "/bpp:", true, true, NULL, NULL); addParameterValue(PARAMETER_BITSPERPIXEL, VALUES_BITSPERPIXEL_8, "8", true); addParameterValue(PARAMETER_BITSPERPIXEL, VALUES_BITSPERPIXEL_16, "16", false); addParameterValue(PARAMETER_BITSPERPIXEL, VALUES_BITSPERPIXEL_24, "24", false); addParameterValue(PARAMETER_BITSPERPIXEL, VALUES_BITSPERPIXEL_32, "32", false); + + addParameterKey(PARAMETER_MONITORS, "/monitors:", false, true, getParameter(PARAMETER_FULLSCREEN), getParameter(PARAMETER_MULTIMONITOR)); + x_info *monitors = getXInfo(); + for (size_t i = 0; i < monitors->count; ++i) + { + addParameterValue(PARAMETER_MONITORS, i, monitors->monitor[i].ptrIndexMonitor, !i); + } + freeXInfo(monitors); } void settingsFree() diff --git a/node_settings.c b/node_settings.c index 64b8bd1..ba9b908 100644 --- a/node_settings.c +++ b/node_settings.c @@ -48,7 +48,7 @@ static void freeAllNodeValue(NodeValue *node) } } -static NodeParameter* newNodeParameter(Parameter name, char *key, bool set, bool singleValue) +static NodeParameter* newNodeParameter(Parameter name, char *key, bool set, bool singleValue, NodeParameter *dependence, NodeParameter *conflict) { NodeParameter *node = (NodeParameter*) malloc(sizeof(NodeParameter)); node->name = name; @@ -56,7 +56,10 @@ static NodeParameter* newNodeParameter(Parameter name, char *key, bool set, bool node->change = false; node->value = NULL; node->countValue = 0; + node->countValueSet = 0; node->singleValue = singleValue; + node->dependence = dependence; + node->conflict = conflict; node->next = NULL; node->key = (char*) malloc(sizeof(char) * strlen(key)); @@ -116,11 +119,25 @@ static NodeParameter* getNodeParameter(Parameter name) return NULL; } -void addParameterKey(Parameter name, char *key, bool set, bool singleValue) +NodeParameter* getParameter(Parameter name) +{ + for (NodeParameter *head = settings.parameter; head; head = head->next) + { + if (head->name == name) + { + return head; + } + } + + return NULL; +} + + +void addParameterKey(Parameter name, char *key, bool set, bool singleValue, NodeParameter *dependence, NodeParameter *conflict) { if (!settings.parameter) { - settings.parameter = newNodeParameter(name, key, set, singleValue); + settings.parameter = newNodeParameter(name, key, set, singleValue, dependence, conflict); ++settings.countParameter; if (set) { @@ -138,7 +155,7 @@ void addParameterKey(Parameter name, char *key, bool set, bool singleValue) else { node = getLastNodeParameter(); - node->next = newNodeParameter(name, key, set, singleValue); + node->next = newNodeParameter(name, key, set, singleValue, dependence, conflict); ++settings.countParameter; if (set) { @@ -306,6 +323,12 @@ void changeParameter(Parameter name) } +void setParameter(Parameter name, bool set) +{ + NodeParameter *node = getNodeParameter(name); + node->set = set; +} + void changeValue(Parameter pName, Value vName) { NodeParameter *pNode = getNodeParameter(pName); @@ -344,7 +367,10 @@ static void saveChangeSingleValueSettings(NodeParameter *node) { nChange->change = false; nChange->set = true; - nSet->set = false; + if (nSet) + { + nSet->set = false; + } ++node->countValueSet; } } @@ -376,6 +402,14 @@ void saveChangeSettings() pHead->change = false; pHead->set = !pHead->set; } + if (pHead->dependence && !pHead->dependence->set) + { + pHead->set = false; + } + if (pHead->conflict && pHead->conflict->set) + { + pHead->set = false; + } if (pHead->set) { ++settings.countParameterSet; @@ -431,3 +465,13 @@ bool getSetValue(Parameter pName, Value vName) return false; } + +int getCountValue(Parameter name) +{ + NodeParameter *node = getNodeParameter(name); + if (!node) + { + return -1; + } + return node->countValue; +} diff --git a/node_settings.h b/node_settings.h index 8efd5b1..c04935c 100644 --- a/node_settings.h +++ b/node_settings.h @@ -32,6 +32,8 @@ typedef struct NodeParameter bool singleValue; size_t countValue; size_t countValueSet; + struct NodeParameter *dependence; + struct NodeParameter *conflict; struct NodeParameter *next; } NodeParameter; @@ -44,18 +46,20 @@ typedef struct NodeHead extern NodeHead settings; -void addParameterKey(Parameter name, char *key, bool set, bool singleValue); +NodeParameter* getParameter(Parameter name); +void addParameterKey(Parameter name, char *key, bool set, bool singleValue, NodeParameter *dependence, NodeParameter *conflict); void addParameterValue(Parameter pName, Value vName, char *current, bool set); void freeSettings(); NodeValue *getSetNodeValue(NodeParameter *node); bool getSetParameter(Parameter name); bool getSetValue(Parameter pName, Value vName); +int getCountValue(Parameter name); void changeParameter(Parameter name); void changeValue(Parameter pName, Value vName); void saveChangeSettings(); void resetChangeSettings(); - +void setParameter(Parameter name, bool set); void setParameterValue(Parameter pName, Value vName, char *current); #endif /* SETTINGS_H_ */ diff --git a/parameter.h b/parameter.h index 9685f87..36011a0 100644 --- a/parameter.h +++ b/parameter.h @@ -17,6 +17,7 @@ typedef enum PARAMETER_CERTIGNORE, PARAMETER_THEMES, PARAMETER_WALLPAPER, + PARAMETER_MONITORS, PARAMETER_MULTIMONITOR, PARAMETER_FULLSCREEN, PARAMETER_AUTHENTICATION, diff --git a/settings.c b/settings.c index 0c02aa4..cf7c7fe 100644 --- a/settings.c +++ b/settings.c @@ -11,6 +11,7 @@ #include #include "xrandr.h" +#include #include "settings.h" #include "arguments.h" @@ -37,18 +38,6 @@ static int settingsSave(Ihandle *self) return IUP_DEFAULT; } -static int settingsTglMultimonitor(Ihandle *self) -{ - changeParameter(PARAMETER_MULTIMONITOR); - return IUP_DEFAULT; -} - -static int settingsTglFullscreen(Ihandle *self) -{ - changeParameter(PARAMETER_FULLSCREEN); - return IUP_DEFAULT; -} - static int settingsTglAuthentication(Ihandle *self) { changeParameter(PARAMETER_AUTHENTICATION); @@ -157,9 +146,31 @@ static void settingsChooseBitsPerPixel(Ihandle *self, int state) } } -static int settingsChooseMonitor(Ihandle *self) +static int settingsChooseMonitor(Ihandle *ih, char *text, int item, int state) { -// printf("%d\n", IupGetInt(IupGetDialogChild(self, "VALUE"), "ACTIVE")); + if (state == 1) + { + changeValue(PARAMETER_MONITORS, item - 1); + } + + return IUP_DEFAULT; +} + +static int settingsTglMultimonitor(Ihandle *self) +{ + changeParameter(PARAMETER_MULTIMONITOR); + + IupSetInt(IupGetDialogChild(self, "MONITORS"), "ACTIVE", !IupGetInt(IupGetDialogChild(self, "SETTINGS_TGL_MULTIMONITOR"), "VALUE")); + setParameter(PARAMETER_MONITORS, !IupGetInt(IupGetDialogChild(self, "SETTINGS_TGL_MULTIMONITOR"), "VALUE")); + return IUP_DEFAULT; +} + +static int settingsTglFullscreen(Ihandle *self) +{ + changeParameter(PARAMETER_FULLSCREEN); + toggleActive(self, "SETTINGS_TGL_MULTIMONITOR"); + IupSetInt(IupGetDialogChild(self, "MONITORS"), "ACTIVE", !IupGetInt(IupGetDialogChild(self, "SETTINGS_TGL_MULTIMONITOR"), "VALUE")); + setParameter(PARAMETER_MONITORS, !IupGetInt(IupGetDialogChild(self, "SETTINGS_TGL_MULTIMONITOR"), "VALUE")); return IUP_DEFAULT; } @@ -168,39 +179,30 @@ static int settingsChooseMonitor(Ihandle *self) */ static Ihandle* settingsBoxCheckbox() { - Ihandle *tglMultimonitor, *tglFullscreen, *tglAuthentication, *tglCertIgnore, *tglThemes, *tglWallpaper; + Ihandle *tglAuthentication, *tglCertIgnore, *tglThemes, *tglWallpaper; - tglMultimonitor = IupToggle("Несколько мониторов", NULL); - tglFullscreen = IupToggle("На весь экран", NULL); tglAuthentication = IupToggle("Аутентификация", NULL); tglCertIgnore = IupToggle("Игнорировать сертификат", NULL); tglThemes = IupToggle("Отключить темы", NULL); tglWallpaper = IupToggle("Отключить обои", NULL); - IupSetInt(tglMultimonitor, "VALUE", getSetParameter(PARAMETER_MULTIMONITOR)); - IupSetInt(tglFullscreen, "VALUE", getSetParameter(PARAMETER_FULLSCREEN)); IupSetInt(tglAuthentication, "VALUE", getSetParameter(PARAMETER_AUTHENTICATION)); IupSetInt(tglCertIgnore, "VALUE", getSetParameter(PARAMETER_CERTIGNORE)); IupSetInt(tglThemes, "VALUE", getSetParameter(PARAMETER_THEMES)); IupSetInt(tglWallpaper, "VALUE", getSetParameter(PARAMETER_WALLPAPER)); - return IupHbox( - IupSetAttributes( - IupFrame( - IupVbox( - IupSetCallbacks(IupSetAttributes(tglMultimonitor, "NAME=SETTINGS_TGL_MULTIMONITOR"), "ACTION", - (Icallback) settingsTglMultimonitor, NULL), - IupSetCallbacks(IupSetAttributes(tglFullscreen, "NAME=SETTINGS_TGL_FULLSCREEN"), "ACTION", - (Icallback) settingsTglFullscreen, NULL), - IupSetCallbacks(IupSetAttributes(tglAuthentication, "NAME=SETTINGS_TGL_AUTHENTICATION"), "ACTION", - (Icallback) settingsTglAuthentication, NULL), - IupSetCallbacks(IupSetAttributes(tglCertIgnore, "NAME=SETTINGS_TGL_AUTHENTICATION"), "ACTION", - (Icallback) settingsTglCertIgnore, NULL), - IupSetCallbacks(IupSetAttributes(tglThemes, "NAME=SETTINGS_TGL_THEMES"), "ACTION", (Icallback) settingsTglThemes, - NULL), - IupSetCallbacks(IupSetAttributes(tglWallpaper, "NAME=SETTINGS_TGL_WALLPAPER"), "ACTION", - (Icallback) settingsTglWallpaper, NULL), - NULL)), "TITLE=\"Общие\""), NULL); + return IupSetAttributes( + IupFrame( + IupVbox( + IupSetCallbacks(IupSetAttributes(tglAuthentication, "NAME=SETTINGS_TGL_AUTHENTICATION"), "ACTION", + (Icallback) settingsTglAuthentication, NULL), + IupSetCallbacks(IupSetAttributes(tglCertIgnore, "NAME=SETTINGS_TGL_AUTHENTICATION"), "ACTION", + (Icallback) settingsTglCertIgnore, NULL), + IupSetCallbacks(IupSetAttributes(tglThemes, "NAME=SETTINGS_TGL_THEMES"), "ACTION", (Icallback) settingsTglThemes, + NULL), + IupSetCallbacks(IupSetAttributes(tglWallpaper, "NAME=SETTINGS_TGL_WALLPAPER"), "ACTION", (Icallback) settingsTglWallpaper, + NULL), + NULL)), "TITLE=\"Общие\", MARGIN=10x10"); } static Ihandle* settingsBoxSecurity() @@ -273,26 +275,49 @@ static Ihandle* settingsBoxBitsPerPixel() static Ihandle* settingsBoxMonitor() { - Ihandle *ddMonitor; + Ihandle *tglFullscreen, *tglMultimonitor, *ddMonitor; + tglMultimonitor = IupToggle("Все мониторы", NULL); + tglFullscreen = IupToggle("На весь экран", NULL); ddMonitor = IupList(NULL); x_info *monitors = getXInfo(); + char *allMonitorIndex = (char*) malloc(sizeof(char) * 3); + sprintf(allMonitorIndex, "%hu", monitors->count + 1); + size_t setValueIndex = 0; for (short i = 0; i < monitors->count; ++i) { - IupSetAttribute(ddMonitor, monitors->monitor[i].ptrIndex, monitors->monitor[i].ptrName); + IupSetAttribute(ddMonitor, monitors->monitor[i].ptrIndexItem, monitors->monitor[i].ptrName); + if (getSetValue(PARAMETER_MONITORS, i)) + setValueIndex = i + 1; } + IupSetInt(ddMonitor, "VALUE", setValueIndex ? setValueIndex : 1); + IupSetInt(tglMultimonitor, "VALUE", getSetParameter(PARAMETER_MULTIMONITOR)); + IupSetInt(tglFullscreen, "VALUE", getSetParameter(PARAMETER_FULLSCREEN)); + + IupSetInt(tglMultimonitor, "ACTIVE", getSetParameter(PARAMETER_FULLSCREEN)); + IupSetInt(ddMonitor, "ACTIVE", getSetParameter(PARAMETER_FULLSCREEN) && !getSetParameter(PARAMETER_MULTIMONITOR)); + free(monitors); - return IupSetCallbacks(IupSetAttributes(ddMonitor, - "DROPDOWN=YES, VALUE=1"), "ACTION", (Icallback) settingsChooseMonitor, NULL); + return IupSetAttributes( + IupFrame( + IupVbox( + IupSetCallbacks(IupSetAttributes(tglFullscreen, "NAME=SETTINGS_TGL_FULLSCREEN, EXPAND=YES"), "ACTION", + (Icallback) settingsTglFullscreen, NULL), + IupSetCallbacks(IupSetAttributes(tglMultimonitor, "NAME=SETTINGS_TGL_MULTIMONITOR"), "ACTION", + (Icallback) settingsTglMultimonitor, NULL), + IupSetCallbacks(IupSetAttributes(ddMonitor, "NAME=MONITORS, DROPDOWN=YES, EXPAND=YES"), "ACTION", + (Icallback) settingsChooseMonitor, NULL), + NULL)), "TITLE=\"Монитор\", MARGIN=10x10, CGAP=5"); } static Ihandle* settingsHorizontalBox() { - return IupSetAttributes(IupHbox(IupVbox(settingsBoxCheckbox(), settingsBoxMonitor(), NULL), settingsBoxSecurity(), settingsBoxBitsPerPixel(), NULL), "MARGIN=5x5"); + return IupSetAttributes( + IupHbox(IupVbox(settingsBoxCheckbox(), settingsBoxMonitor(), NULL), settingsBoxSecurity(), settingsBoxBitsPerPixel(), NULL), "MARGIN=5x5"); } /* diff --git a/xrandr.h b/xrandr.h index c6bc869..babce80 100644 --- a/xrandr.h +++ b/xrandr.h @@ -12,7 +12,8 @@ typedef struct { char name[10]; char *ptrName; - char *ptrIndex; + char *ptrIndexItem; + char *ptrIndexMonitor; int width; int height; int primary; @@ -26,5 +27,6 @@ typedef struct int XInfo(x_info *info); x_info *getXInfo(); +void freeXInfo(x_info *info); #endif /* XRANDR_H_ */ diff --git a/xrandr_broker.c b/xrandr_broker.c index 1dcb81f..e94d549 100644 --- a/xrandr_broker.c +++ b/xrandr_broker.c @@ -19,11 +19,27 @@ x_info *getXInfo() for (int i = 0; i < monitors->count; ++i) { monitors->monitor[i].ptrName = (char *)malloc(sizeof(char) * strlen(monitors->monitor[i].name)); - monitors->monitor[i].ptrIndex = (char *)malloc(sizeof(char) * 3); + monitors->monitor[i].ptrIndexItem = (char *)malloc(sizeof(char) * 3); + monitors->monitor[i].ptrIndexMonitor = (char *)malloc(sizeof(char) * 3); strcpy(monitors->monitor[i].ptrName, monitors->monitor[i].name); - sprintf(monitors->monitor[i].ptrIndex, "%d", i + 1); + sprintf(monitors->monitor[i].ptrIndexItem, "%d", i + 1); + sprintf(monitors->monitor[i].ptrIndexMonitor, "%d", i); } return monitors; } + +void freeXInfo(x_info *info) +{ + for (int i = 0; i < info->count; ++i) + { + if (info->monitor[i].ptrName) + free(info->monitor[i].ptrName); + if (info->monitor[i].ptrIndexItem) + free(info->monitor[i].ptrIndexItem); + if (info->monitor[i].ptrIndexMonitor) + free(info->monitor[i].ptrIndexMonitor); + } + free(info); +}