/* --------------------------------------------------------------------- * * main.c * * --------------------------------------------------------------------- * * This file is part of the nebula irc client * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ #include #include #include #include #include #include #include #include #include #include #include #include #include "main.h" #include "interpreter.h" #include "help.h" #include "preferences.h" #include "network.h" #include "filesave.h" #ifndef XmFONTLIST_DEFAULT_TAG #define XmFONTLIST_DEFAULT_TAG "" #endif void fileMenuCall(Widget w, XtPointer clientData, XtPointer callData); void userMenuCall(Widget w, XtPointer clientData, XtPointer callData); void helpMenuCall(Widget w, XtPointer clientData, XtPointer callData); void userListSelectCbk(Widget w, XtPointer data, XtPointer callData); void inputAreaCall(); Widget mainWindow; Widget inputArea; Widget outputArea; Widget userList; Widget aboutDlgBox; Widget commandsHelpDlgBox; XtAppContext nebulaIrcAppContext; XtInputId nebulaNetworkEventId; char *selectedUser; /* holds global information about the system */ systemStatusRecord sysState; int main (int argc, char *argv[]) { Widget topWidget; Widget mainForm; Widget userForm; /* Menu Stuff */ XmString filestr, userstr, prefstr, savconstr, quitstr, whostr, cliverstr, opstr, deopstr, abtstr, cmdstr; Widget menuBar, helpMenu; filestr = XmStringCreateLocalized("File"); userstr = XmStringCreateLocalized("User"); prefstr = XmStringCreateLocalized("Preferences..."); savconstr = XmStringCreateLocalized("Save Conversation"); quitstr = XmStringCreateLocalized("Quit"); whostr = XmStringCreateLocalized("Whois"); cliverstr = XmStringCreateLocalized("Client version"); opstr = XmStringCreateLocalized("Op"); deopstr = XmStringCreateLocalized("Deop"); abtstr = XmStringCreateLocalized("About"); cmdstr = XmStringCreateLocalized("Commands"); topWidget = XtVaAppInitialize(&nebulaIrcAppContext, "Nebula IRC", NULL, 0, &argc, argv, NULL, NULL); mainWindow = XtVaCreateManagedWidget("main_window", xmMainWindowWidgetClass, topWidget, XmNcommandWindowLocation, XmCOMMAND_BELOW_WORKSPACE, XmNwidth, 600, XmNheight, 500, NULL); menuBar = XmVaCreateSimpleMenuBar(mainWindow, "menubar", XmVaCASCADEBUTTON, filestr, 'F', XmVaCASCADEBUTTON, userstr, 'U', NULL); XmVaCreateSimplePulldownMenu(menuBar, "file_menu", 0, fileMenuCall, XmVaPUSHBUTTON, prefstr, 'P', NULL, NULL, XmVaPUSHBUTTON, savconstr, 'S', NULL, NULL, XmVaPUSHBUTTON, quitstr, 'Q', NULL, NULL, NULL); XmVaCreateSimplePulldownMenu(menuBar, "user_menu", 1, userMenuCall, XmVaPUSHBUTTON, whostr, 'W', NULL, NULL, XmVaPUSHBUTTON, cliverstr, '\0', NULL, NULL, XmVaPUSHBUTTON, opstr, 'O', NULL, NULL, XmVaPUSHBUTTON, deopstr, 'D', NULL, NULL, NULL); helpMenu = XtVaCreateManagedWidget("Help", xmCascadeButtonWidgetClass, menuBar, XmNmnemonic, 'H', NULL); XmVaCreateSimplePulldownMenu(menuBar, "Help", 2, helpMenuCall, XmVaPUSHBUTTON, abtstr, 'A', NULL, NULL, XmVaPUSHBUTTON, cmdstr, 'C', NULL, NULL, NULL); XtVaSetValues(menuBar, XmNmenuHelpWidget, helpMenu, NULL); XtManageChild(menuBar); XmStringFree(filestr); XmStringFree(userstr); XmStringFree(prefstr); XmStringFree(savconstr); XmStringFree(quitstr); XmStringFree(whostr); XmStringFree(cliverstr); XmStringFree(opstr); XmStringFree(deopstr); XmStringFree(abtstr); XmStringFree(cmdstr); mainForm = XtVaCreateWidget("form", xmFormWidgetClass, mainWindow, XmNfractionBase, 3, NULL); userForm = XtVaCreateWidget("userform", xmFormWidgetClass, mainForm, XmNfractionBase, 5, XmNtopAttachment, XmATTACH_FORM, XmNleftAttachment, XmATTACH_FORM, XmNbottomAttachment, XmATTACH_FORM, XmNrightAttachment, XmATTACH_FORM, NULL); Arg outputArgs[13]; XtSetArg(outputArgs[0], XmNeditable, False); XtSetArg(outputArgs[1], XmNeditMode, XmMULTI_LINE_EDIT); XtSetArg(outputArgs[2], XmNscrollHorizontal, False); XtSetArg(outputArgs[3], XmNwordWrap, True); XtSetArg(outputArgs[4], XmNtopAttachment, XmATTACH_POSITION); XtSetArg(outputArgs[5], XmNtopPosition, 0); XtSetArg(outputArgs[6], XmNbottomAttachment, XmATTACH_POSITION); XtSetArg(outputArgs[7], XmNbottomPosition, 5); XtSetArg(outputArgs[8], XmNleftAttachment, XmATTACH_POSITION); XtSetArg(outputArgs[9], XmNleftPosition, 0); XtSetArg(outputArgs[10], XmNrightAttachment, XmATTACH_POSITION); XtSetArg(outputArgs[11], XmNrightPosition, 4); XtSetArg(outputArgs[12], XmNcursorPositionVisible, False); outputArea = XmCreateScrolledText(userForm, "output", outputArgs, 13); if (outputArea == NULL) perror("outputArea: "); XtManageChild(outputArea); Arg ulistArgs[9]; XtSetArg(ulistArgs[0], XmNtopAttachment, XmATTACH_POSITION); XtSetArg(ulistArgs[1], XmNtopPosition, 0); XtSetArg(ulistArgs[2], XmNbottomAttachment, XmATTACH_POSITION); XtSetArg(ulistArgs[3], XmNbottomPosition, 5); XtSetArg(ulistArgs[4], XmNleftAttachment, XmATTACH_POSITION); XtSetArg(ulistArgs[5], XmNleftPosition, 4); XtSetArg(ulistArgs[6], XmNrightAttachment, XmATTACH_POSITION); XtSetArg(ulistArgs[7], XmNrightPosition, 5); XtSetArg(ulistArgs[8], XmNselectionPolicy, XmSINGLE_SELECT); userList = XmCreateScrolledList(userForm, "list", ulistArgs, 9); XtAddCallback(userList, XmNsingleSelectionCallback, userListSelectCbk, NULL); XtManageChild(userList); XtManageChild(userForm); XtManageChild(mainForm); inputArea = XtVaCreateWidget("input", xmTextFieldWidgetClass, mainWindow, XmNmaxLength, MAX_INPUT_LEN, NULL); XtAddCallback(inputArea, XmNactivateCallback, inputAreaCall, NULL); XtManageChild(inputArea); XtVaSetValues(mainWindow, XmNmenuBar, menuBar, XmNworkWindow, mainForm, XmNcommandWindow, inputArea, NULL); XtManageChild(mainWindow); XtRealizeWidget(topWidget); /* initialize System Status */ sysState.isConnected = NO; /* set focus to input area */ /* For Motif 1.0 we should use _XmGrabTheFocus(target) according to FAQ */ XmProcessTraversal(inputArea, XmTRAVERSE_CURRENT); /* initialize hostname and system info */ /* should switch back to ARCHOS if uname not available */ { struct utsname sysInfo; char tempName[2*SYSINFO_LEN]; gethostname(sysState.myHostName, MAXHOSTNAMELEN); uname(&sysInfo); sprintf(tempName, "%s %s running on %s", sysInfo.sysname, sysInfo.release, sysInfo.machine); tempName[SYSINFO_LEN] = '\0'; strcpy(sysState.systemInfo, tempName); } /* get the user login name from unix */ { char *tempName; tempName = getenv("USER"); if (tempName == NULL) tempName = getenv("LOGNAME"); if (strlen(tempName) > MAX_NAME_LEN || tempName == NULL) { strcpy(sysState.myUnixname, "noname"); printf("Failed to get a proper Unix login name. Using: %s\n", sysState.myUnixname); } strcpy(sysState.myUnixname, tempName); } /* create unmanaged dialogs */ createAboutBox(mainWindow); createCommandsHelpBox(mainWindow); while(1) { XEvent theEvent; XtAppNextEvent(nebulaIrcAppContext, &theEvent); XtDispatchEvent(&theEvent); } } /* saves the text in the conversation window */ void fileMenuCall(Widget w, XtPointer clientData, XtPointer callData) { long int itemNum; itemNum = (long int) clientData; switch (itemNum) { case 0: setPreferences(mainWindow); break; case 1: saveFile(mainWindow); break; case 2: quitApplication(); break; default: break; } } void helpMenuCall(Widget w, XtPointer clientData, XtPointer callData) { long int itemNum; fprintf(stderr, "Size of clientData: %lu\nSize of itemNum: %lu\n", sizeof(clientData), sizeof(itemNum)); itemNum = (long int) clientData; switch (itemNum) { case 0: displayAboutBox(); break; case 1: displayCommandsHelpBox(); break; default: break; } } void userMenuCall(Widget w, XtPointer clientData, XtPointer callData) { long int itemNum; #ifdef DEBUG printf("user: %s\n", selectedUser); #endif if (selectedUser == NULL) return; itemNum = (long int) clientData; switch (itemNum) { case 0: printf("Whois!\n"); doWhois(selectedUser); break; case 1: printf("version!\n"); doCTCPVersion(selectedUser); break; case 2: printf("op!\n"); doMode(sysState.currentChannel, "+o", selectedUser, NULL, NULL); break; case 3: printf("deop!\n"); doMode(sysState.currentChannel, "-o", selectedUser, NULL, NULL); break; default: break; } } void userListSelectCbk(Widget w, XtPointer data, XtPointer callData) { XmListCallbackStruct *listCbs; listCbs = (XmListCallbackStruct *)callData; XmStringGetLtoR(listCbs->item, XmFONTLIST_DEFAULT_TAG, &selectedUser); } void inputAreaCall() { interpretCommand(XmTextGetString(inputArea)); XmTextSetString(inputArea,""); } void quitApplication() { disconnectFromServer(); exit(0); } /* appends text at the bottom of the main text widget */ void appendText(char *msg) { XmTextPosition lastPos; lastPos = XmTextGetLastPosition(outputArea); XmTextInsert(outputArea, lastPos, msg); lastPos = XmTextGetLastPosition(outputArea); XmTextSetInsertionPosition(outputArea, lastPos); } #include "copyright.h"