/* --------------------------------------------------------------------- * * preferences.c * * --------------------------------------------------------------------- * * This file is part of the nebula irc client * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ #include #include #include #include #include #include #include #include #include #include #include #include "main.h" #include "preferences.h" #include "network.h" #ifndef XmFONTLIST_DEFAULT_TAG #define XmFONTLIST_DEFAULT_TAG "" #endif #define FILE_BUFF_SIZE 1024 extern systemStatusRecord sysState; extern XtAppContext nebulaIrcAppContext; Widget startPref; Widget startPrefDiag; void okButtStartupCbk(); void helpButtStartupCbk(); void okButtPrefCbk(); void helpButtPrefCbk(); Widget nickTextForm; Widget nameTextForm; Widget serverTextForm; Widget portTextForm; void okButtStartupCbk() { char *nick; char *name; char *server; char *port; char theServer[MAX_SERVERNAME_LEN]; nick = XmTextGetString(nickTextForm); name = XmTextGetString(nameTextForm); server = XmTextGetString(serverTextForm); port = XmTextGetString(portTextForm); if (strlen(nick) > 0 && strlen(nick) <= MAX_NICK_LEN) strcpy(sysState.myNick, nick); else strcpy(sysState.myNick, ""); if (strlen(name) > 0 && strlen(name) <= MAX_NAME_LEN) strcpy(sysState.myName, name); else strcpy(sysState.myName, "noname"); if (strlen(server) > 0 &&strlen(server) <= MAX_SERVERNAME_LEN) strcpy(theServer, server); else strcpy(theServer, ""); printf("port: %s, %d\n", port, atoi(port)); if (strlen(port) > 0 && strlen(port) <= 5) { sysState.port = atoi(port); if (sysState.port <= 0) sysState.port = 6666; } else sysState.port = 6666; connectToServer(theServer, sysState.port); } void helpButtStartupCbk() { XmString theXmString, theXmString2; Arg args[8]; int argcount; Widget remove; Widget startupPrefsHelpDlgBox; argcount = 0; theXmString = XmStringCreateLocalized("Help"); XtSetArg(args[argcount], XmNdialogTitle, theXmString); argcount++; theXmString2 = XmStringGenerate("Set nickname and name you want to use.\n\nEnter the server you want to connect to.", XmFONTLIST_DEFAULT_TAG, XmCHARSET_TEXT, NULL); XtSetArg(args[argcount], XmNmessageString, theXmString2); argcount++; XtSetArg(args[argcount], XmNautoUnmanage, True); argcount++; startupPrefsHelpDlgBox = XmCreateInformationDialog(startPrefDiag, "help", args, argcount); XmStringFree(theXmString); XmStringFree(theXmString2); /* Now get rid of the things we don't want */ remove = XmMessageBoxGetChild(startupPrefsHelpDlgBox, XmDIALOG_HELP_BUTTON); XtUnmanageChild(remove); remove = XmMessageBoxGetChild(startupPrefsHelpDlgBox, XmDIALOG_CANCEL_BUTTON); XtUnmanageChild(remove); XtManageChild(startupPrefsHelpDlgBox); } /* ---- set preferences ----- */ void setPreferences(Widget mainWin) { Widget prefForm; Widget portLabel; Widget child; XmString labelString; Arg args[4]; int argcount; FILE *confFile; char serverPortNum[6]; char *confFilePath; char serverName[MAX_SERVERNAME_LEN]; char myNick[MAX_NICK_LEN]; char myName[MAX_NAME_LEN]; argcount = 0; labelString = XmStringCreateLocalized("Startup Prefs"); XtSetArg(args[argcount], XmNdialogTitle, labelString); argcount++; XtSetArg(args[argcount], XmNautoUnmanage, True); argcount++; startPrefDiag = XmCreatePromptDialog(mainWin, "startup_prefs", args, argcount); XmStringFree(labelString); /* Now get rid of the things we don't want */ child = XmSelectionBoxGetChild(startPrefDiag, XmDIALOG_SELECTION_LABEL); XtUnmanageChild(child); child = XmSelectionBoxGetChild(startPrefDiag, XmDIALOG_TEXT); XtUnmanageChild(child); prefForm = XtVaCreateWidget("form", xmFormWidgetClass, startPrefDiag, XmNfractionBase, 18, NULL); labelString = XmStringCreateLocalized("Name:"); XtVaCreateManagedWidget("name_label", xmLabelWidgetClass, prefForm, XmNlabelString, labelString, XmNtopAttachment, XmATTACH_POSITION, XmNtopPosition, 0, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 0, NULL); XmStringFree(labelString); labelString = XmStringCreateLocalized("Nick:"); XtVaCreateManagedWidget("nick_label", xmLabelWidgetClass, prefForm, XmNlabelString, labelString, XmNtopAttachment, XmATTACH_POSITION, XmNtopPosition, 6, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 0, NULL); XmStringFree(labelString); labelString = XmStringCreateLocalized("Server:"); XtVaCreateManagedWidget("server_label", xmLabelWidgetClass, prefForm, XmNlabelString, labelString, XmNtopAttachment, XmATTACH_POSITION, XmNtopPosition, 12, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 0, NULL); XmStringFree(labelString); nameTextForm = XtVaCreateManagedWidget("name_form", xmTextFieldWidgetClass, prefForm, XmNmaxLength, MAX_NAME_LEN, XmNtopAttachment, XmATTACH_POSITION, XmNtopPosition, 0, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 4, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 18, NULL); nickTextForm = XtVaCreateManagedWidget("nick_form", xmTextFieldWidgetClass, prefForm, XmNmaxLength, MAX_NICK_LEN, XmNtopAttachment, XmATTACH_POSITION, XmNtopPosition, 6, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 4, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 18, NULL); portTextForm = XtVaCreateManagedWidget("port_form", xmTextFieldWidgetClass, prefForm, XmNmaxLength, 5, XmNcolumns, 5, XmNtopAttachment, XmATTACH_POSITION, XmNtopPosition, 12, XmNrightAttachment, XmATTACH_POSITION, XmNrightPosition, 18, NULL); labelString = XmStringCreateLocalized("Port: "); portLabel = XtVaCreateManagedWidget("port_label", xmLabelWidgetClass, prefForm, XmNlabelString, labelString, XmNtopAttachment, XmATTACH_POSITION, XmNtopPosition, 12, XmNrightAttachment, XmATTACH_WIDGET, XmNrightWidget, portTextForm, NULL); XmStringFree(labelString); serverTextForm = XtVaCreateManagedWidget("server_form", xmTextFieldWidgetClass, prefForm, XmNmaxLength, MAX_SERVERNAME_LEN, XmNtopAttachment, XmATTACH_POSITION, XmNtopPosition, 12, XmNleftAttachment, XmATTACH_POSITION, XmNleftPosition, 4, XmNrightAttachment, XmATTACH_WIDGET, XmNrightWidget, portLabel, NULL); XtAddCallback(startPrefDiag, XmNokCallback, okButtPrefCbk, NULL); XtAddCallback(startPrefDiag, XmNhelpCallback, helpButtPrefCbk, NULL); XtManageChild(prefForm); XtManageChild(startPrefDiag); /* read configuration file */ if ((confFilePath = getPreferencesFilePath())) { confFile = fopen (confFilePath, "r"); if (confFile) { char buff[FILE_BUFF_SIZE]; char *pos; fgets(buff, FILE_BUFF_SIZE, confFile); if (buff[strlen(buff)-1] == '\n') buff[strlen(buff)-1] = '\0'; if(!strncmp(buff, "DefaultNick", strlen("DefaultNick"))) if ((pos = strchr(buff, ' '))) strcpy(myNick, pos+1); fgets(buff, FILE_BUFF_SIZE, confFile); if (buff[strlen(buff)-1] == '\n') buff[strlen(buff)-1] = '\0'; if(!strncmp(buff, "DefaultName", strlen("DefaultName"))) if ((pos = strchr(buff, ' '))) strcpy(myName, pos+1); fgets(buff, FILE_BUFF_SIZE, confFile); if (buff[strlen(buff)-1] == '\n') buff[strlen(buff)-1] = '\0'; if(!strncmp(buff, "DefaultServer", strlen("DefaultServer"))) if ((pos = strchr(buff, ' '))) strcpy(serverName, pos+1); fgets(buff, FILE_BUFF_SIZE, confFile); if (buff[strlen(buff)-1] == '\n') buff[strlen(buff)-1] = '\0'; if(!strncmp(buff, "DefaultPortNum", strlen("DefaultPortNum"))) if ((pos = strchr(buff, ' '))) strcpy(serverPortNum, pos+1); fclose(confFile); } else { printf("config file not found.\n"); strcpy(myNick, ""); strcpy(myName, ""); strcpy(serverName, ""); strcpy(serverPortNum, ""); } free(confFilePath); } XmTextSetString(nickTextForm, myNick); XmTextSetString(nameTextForm, myName); XmTextSetString(serverTextForm, serverName); XmTextSetString(portTextForm, serverPortNum); } void okButtPrefCbk() { char *nick; char *name; char *server; char *port; char theServer[MAX_SERVERNAME_LEN]; char myNick[MAX_NICK_LEN]; char myName[MAX_NAME_LEN]; char serverPort[6]; FILE *confFile; char *confFilePath; nick = XmTextGetString(nickTextForm); name = XmTextGetString(nameTextForm); server = XmTextGetString(serverTextForm); port = XmTextGetString(portTextForm); if (strlen(nick) > 0 && strlen(nick) <= MAX_NICK_LEN) strcpy(myNick, nick); else strcpy(myNick, ""); if (strlen(name) > 0 && strlen(name) <= MAX_NAME_LEN) strcpy(myName, name); else strcpy(myName, "noname"); if (strlen(server) > 0 &&strlen(server) <= MAX_SERVERNAME_LEN) strcpy(theServer, server); else strcpy(theServer, ""); if (strlen(port) > 0 && strlen(port) <= 5) strcpy(serverPort, port); else strcpy(serverPort, ""); /* write out configuration file */ if((confFilePath = getPreferencesFilePath())) { confFile = fopen (confFilePath, "w"); if (confFile) { fprintf(confFile, "DefaultNick: %s\n", myNick); fprintf(confFile, "DefaultName: %s\n", myName); fprintf(confFile, "DefaultServer: %s\n", theServer); fprintf(confFile, "DefaultPortNum: %s\n", port); fclose(confFile); } free(confFilePath); } } void helpButtPrefCbk() { XmString theXmString, theXmString2; Arg args[8]; int argcount; Widget remove; Widget startupPrefsHelpDlgBox; argcount = 0; theXmString = XmStringCreateLocalized("Help"); XtSetArg(args[argcount], XmNdialogTitle, theXmString); argcount++; theXmString2 = XmStringGenerate("This panel provides easy access to preferences.\nOK will save them to your dotfile.", XmFONTLIST_DEFAULT_TAG, XmCHARSET_TEXT, NULL); XtSetArg(args[argcount], XmNmessageString, theXmString2); argcount++; XtSetArg(args[argcount], XmNautoUnmanage, True); argcount++; startupPrefsHelpDlgBox = XmCreateInformationDialog(startPrefDiag, "help", args, argcount); XmStringFree(theXmString); XmStringFree(theXmString2); /* Now get rid of the things we don't want */ remove = XmMessageBoxGetChild(startupPrefsHelpDlgBox, XmDIALOG_HELP_BUTTON); XtUnmanageChild(remove); remove = XmMessageBoxGetChild(startupPrefsHelpDlgBox, XmDIALOG_CANCEL_BUTTON); XtUnmanageChild(remove); XtManageChild(startupPrefsHelpDlgBox); } /* * Return the full path to the user preferences file * the caller is responsible of freeing the string if the call was successful * failure will return a NULL pointer */ char* getPreferencesFilePath() { char *homeDirPath; char *filePath; filePath = NULL; homeDirPath = getenv("HOME"); if (homeDirPath) { filePath = malloc ((strlen(homeDirPath) + strlen(PREF_FILE_NAME) + 1) * sizeof(char)); /* 1 is for the slash */ if (filePath == NULL) { perror("Could not allocate string buffer for config file Path"); } else { strcpy(filePath, homeDirPath); strcat(filePath, "/"); strcat(filePath, PREF_FILE_NAME); } } else { perror("Could not determine home path of the user."); } return filePath; } #include "copyright.h"