354 lines
9.8 KiB
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"
|