Nebula/src/main.c

354 lines
9.8 KiB
C

/* --------------------------------------------------------------------- *
* main.c *
* --------------------------------------------------------------------- *
* This file is part of the nebula irc client *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <sys/utsname.h>
#include <Xm/Xm.h>
#include <Xm/MainW.h>
#include <Xm/Form.h>
#include <Xm/Text.h>
#include <Xm/TextF.h>
#include <Xm/CascadeB.h>
#include <Xm/PanedW.h>
#include <Xm/List.h>
#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"