305 lines
8.9 KiB
C
305 lines
8.9 KiB
C
|
#if !defined( lint ) && !defined( SABER )
|
||
|
static const char sccsid[] = "@(#)option.c 4.00 97/01/01 xlockmore";
|
||
|
|
||
|
#endif
|
||
|
|
||
|
/*-
|
||
|
* option.c - option stuff for xmlock, the gui interface to xlock.
|
||
|
*
|
||
|
* Copyright (c) 1996 by Charles Vidal
|
||
|
*
|
||
|
* See xlock.c for copying information.
|
||
|
*
|
||
|
* Revision History:
|
||
|
* Nov-96: written.
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
/*-
|
||
|
* if you want add some options, so it's not really difficult
|
||
|
* 1: Learn Motif ... but only if you want to :)
|
||
|
* 2: add a name of widget after geometry,font,program
|
||
|
* 3: add a string ( char * ) after *inval=NULL,*geo=NULL
|
||
|
* 4: add a callback like f_username with your new string
|
||
|
* 5: copy and paste after
|
||
|
geometry=XtVaCreateManagedWidget("geometry",xmPushButtonGadgetClass,options,NULL);
|
||
|
XtAddCallback(geometry,XmNactivateCallback,f_geometry,NULL);
|
||
|
* change geometry by your name of widget, and f_geometry by the name
|
||
|
* of your new callback
|
||
|
* 6: go to the church , call god for a miracle :)
|
||
|
* GOOD LUCK
|
||
|
*/
|
||
|
|
||
|
#include <stdio.h>
|
||
|
#include <stdlib.h>
|
||
|
#ifdef VMS
|
||
|
#include <vms_x_fix.h>
|
||
|
#include <descrip.h>
|
||
|
#include <lib$routines.h>
|
||
|
#endif
|
||
|
|
||
|
/* #include <Xm/XmAll.h> Does not work on my version of Lesstif */
|
||
|
#include <Xm/RowColumn.h>
|
||
|
#include <Xm/SelectioB.h>
|
||
|
#include <Xm/CascadeB.h>
|
||
|
#include <Xm/PushBG.h>
|
||
|
#include <Xm/List.h>
|
||
|
#include <Xm/ToggleBG.h>
|
||
|
|
||
|
#include "option.h"
|
||
|
|
||
|
/*#define OPTIONS 8*/
|
||
|
/*#define REGULAR_OPTIONS (OPTIONS-2)*/
|
||
|
|
||
|
#define NBPROGNAME 3
|
||
|
#define MAXNAMES 10000
|
||
|
Widget Menuoption;
|
||
|
static Widget Options[OPTIONS];
|
||
|
|
||
|
/* extern variables */
|
||
|
extern Widget toplevel;
|
||
|
|
||
|
void exitcallback(Widget w, XtPointer client_data, XtPointer call_data);
|
||
|
|
||
|
|
||
|
/* Widget */
|
||
|
static Widget PromptDialog, FontSelectionDialog, ProgramSelectionDialog;
|
||
|
|
||
|
Widget Toggles[TOGGLES];
|
||
|
|
||
|
/****************************************
|
||
|
* This describe the options of user menu
|
||
|
* but not the radio button
|
||
|
* it associates the message , the command and the user data
|
||
|
* this structure is describe in option.h
|
||
|
****************************************/
|
||
|
OptionStruct Opt[]={
|
||
|
{(char *)"Enter the user name.",(char *)"username",NULL},
|
||
|
{(char *)"Enter the password message.",(char *)"password",NULL},
|
||
|
{(char *)"Enter the info message.",(char *)"info",NULL},
|
||
|
{(char *)"Enter the valid message.",(char *)"validate",NULL},
|
||
|
{(char *)"Enter the invalid message.",(char *)"invalid",NULL},
|
||
|
{(char *)"Enter the geometry mxn.",(char *)"geometry",NULL}
|
||
|
};
|
||
|
|
||
|
|
||
|
static char *prognames[NBPROGNAME] =
|
||
|
{
|
||
|
(char *) "fortune",
|
||
|
(char *) "finger",
|
||
|
(char *) "echo hello world"
|
||
|
};
|
||
|
|
||
|
char *r_Toggles[TOGGLES] =
|
||
|
{
|
||
|
(char *) "allowaccess",
|
||
|
(char *) "allowroot",
|
||
|
(char *) "debug",
|
||
|
(char *) "echokeys",
|
||
|
(char *) "echokeys",
|
||
|
(char *) "enablesaver",
|
||
|
(char *) "fullrandom",
|
||
|
(char *) "grabmouse",
|
||
|
(char *) "grabmouse",
|
||
|
(char *) "grabserver",
|
||
|
(char *) "install",
|
||
|
(char *) "mousemotion",
|
||
|
(char *) "nolock",
|
||
|
(char *) "remote",
|
||
|
(char *) "sound",
|
||
|
(char *) "timeelapsed",
|
||
|
(char *) "trackmouse",
|
||
|
(char *) "use3d",
|
||
|
(char *) "usefirst",
|
||
|
(char *) "usefirst",
|
||
|
(char *) "verbose",
|
||
|
(char *) "wireframe",
|
||
|
(char *) "mono"
|
||
|
|
||
|
};
|
||
|
|
||
|
/* string temp */
|
||
|
static char **whichone;
|
||
|
|
||
|
|
||
|
static void
|
||
|
managePrompt(char *s)
|
||
|
{
|
||
|
int ac;
|
||
|
Arg args[3];
|
||
|
XmString label_str1, label_str2;
|
||
|
|
||
|
ac = 0;
|
||
|
label_str1 = XmStringCreateSimple(s);
|
||
|
XtSetArg(args[ac], XmNselectionLabelString, label_str1);
|
||
|
ac++;
|
||
|
if (*whichone != NULL) {
|
||
|
label_str2 = XmStringCreateSimple(*whichone);
|
||
|
XtSetArg(args[ac], XmNtextString, label_str2);
|
||
|
ac++;
|
||
|
} else {
|
||
|
label_str2 = XmStringCreateSimple((char *) "");
|
||
|
XtSetArg(args[ac], XmNtextString, label_str2);
|
||
|
ac++;
|
||
|
}
|
||
|
|
||
|
XtSetValues(PromptDialog, args, ac);
|
||
|
/* PURIFY 4.0.1 on Solaris 2 reports a 71 byte memory leak on the next line. */
|
||
|
XtManageChild(PromptDialog);
|
||
|
XmStringFree(label_str1);
|
||
|
XmStringFree(label_str2);
|
||
|
}
|
||
|
|
||
|
/* CallBack */
|
||
|
static void
|
||
|
f_option(Widget w, XtPointer client_data, XtPointer call_data)
|
||
|
{
|
||
|
whichone = &Opt[(int) client_data].userdata;
|
||
|
managePrompt(Opt[(int) client_data].description);
|
||
|
}
|
||
|
|
||
|
#if 0
|
||
|
static int loadfont = 0;
|
||
|
|
||
|
/******************************
|
||
|
* Callback for the font dialog
|
||
|
******************************/
|
||
|
static void
|
||
|
f_fontdia(Widget w, XtPointer client_data, XtPointer call_data)
|
||
|
{
|
||
|
int numdirnames, i;
|
||
|
char **dirnames;
|
||
|
XmString label_str;
|
||
|
Widget listtmp;
|
||
|
Cursor tmp;
|
||
|
|
||
|
whichone = &Opt[OPTIONS].userdata;
|
||
|
if (!loadfont) {
|
||
|
tmp = XCreateFontCursor(XtDisplay(toplevel), XC_watch);
|
||
|
XDefineCursor(XtDisplay(toplevel), XtWindow(toplevel), tmp);
|
||
|
dirnames = XListFonts(XtDisplay(toplevel), "*", MAXNAMES, &numdirnames);
|
||
|
listtmp = XmSelectionBoxGetChild(FontSelectionDialog, XmDIALOG_LIST);
|
||
|
for (i = 0; i < numdirnames; i++) {
|
||
|
label_str = XmStringCreateSimple(dirnames[i]);
|
||
|
XmListAddItemUnselected(listtmp, label_str, 0);
|
||
|
XmStringFree(label_str);
|
||
|
}
|
||
|
tmp = XCreateFontCursor(XtDisplay(toplevel), XC_left_ptr);
|
||
|
XDefineCursor(XtDisplay(toplevel), XtWindow(toplevel), tmp);
|
||
|
loadfont = 1;
|
||
|
XFreeFontNames(dirnames);
|
||
|
}
|
||
|
XtManageChild(FontSelectionDialog);
|
||
|
}
|
||
|
|
||
|
/******************************
|
||
|
* Callback for the program dialog
|
||
|
******************************/
|
||
|
static void f_programdia(Widget w, XtPointer client_data, XtPointer call_data) {
|
||
|
/*whichone = &c_Options[REGULAR_OPTIONS + 1];*/
|
||
|
/* PURIFY 4.0.1 on Solaris 2 reports a 71 byte memory leak on the next line. */
|
||
|
XtManageChild(ProgramSelectionDialog);
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
static void
|
||
|
f_Dialog(Widget w, XtPointer client_data, XtPointer call_data)
|
||
|
{
|
||
|
static char *quoted_text;
|
||
|
char *nonquoted_text = (char *) NULL;
|
||
|
XmSelectionBoxCallbackStruct *scb =
|
||
|
(XmSelectionBoxCallbackStruct *) call_data;
|
||
|
|
||
|
if (whichone != NULL)
|
||
|
XtFree(*whichone);
|
||
|
XmStringGetLtoR(scb->value, XmSTRING_DEFAULT_CHARSET, &nonquoted_text);
|
||
|
if ((quoted_text = (char *) malloc(strlen(nonquoted_text) + 3)) ==
|
||
|
NULL) {
|
||
|
(void) fprintf(stderr, "Memory error\n");
|
||
|
return;
|
||
|
}
|
||
|
(void) sprintf(quoted_text, "\"%s\"", nonquoted_text);
|
||
|
free(nonquoted_text);
|
||
|
*whichone = quoted_text;
|
||
|
}
|
||
|
|
||
|
/* Setup Widget */
|
||
|
void
|
||
|
setup_Option(Widget MenuBar)
|
||
|
{
|
||
|
Arg args[15];
|
||
|
int i, ac = 0;
|
||
|
XmString label_str;
|
||
|
Widget listtmp, pulldownmenu,exitwidget;
|
||
|
|
||
|
/**
|
||
|
** Popup Menu File
|
||
|
**/
|
||
|
pulldownmenu = XmCreatePulldownMenu(MenuBar, (char *) "PopupFile",
|
||
|
(Arg *) NULL, 0);
|
||
|
label_str = XmStringCreateSimple((char *) "File");
|
||
|
XtVaCreateManagedWidget("File", xmCascadeButtonWidgetClass, MenuBar,
|
||
|
XmNlabelString, label_str, XmNsubMenuId, pulldownmenu, NULL);
|
||
|
XmStringFree(label_str);
|
||
|
exitwidget = XtVaCreateManagedWidget("Exit", xmPushButtonGadgetClass,
|
||
|
pulldownmenu, NULL);
|
||
|
XtAddCallback(exitwidget, XmNactivateCallback, exitcallback,NULL);
|
||
|
|
||
|
pulldownmenu = XmCreatePulldownMenu(MenuBar, (char *) "PopupOptions",
|
||
|
(Arg *) NULL, 0);
|
||
|
label_str = XmStringCreateSimple((char *) "Options");
|
||
|
XtVaCreateManagedWidget("Options", xmCascadeButtonWidgetClass, MenuBar,
|
||
|
XmNlabelString, label_str, XmNsubMenuId, pulldownmenu, NULL);
|
||
|
XmStringFree(label_str);
|
||
|
|
||
|
for (i = 0; i < (int) (sizeof(Opt)/sizeof(OptionStruct)); i++) {
|
||
|
Options[i] = XtVaCreateManagedWidget(Opt[i].description,
|
||
|
/*xmToggleButtonGadgetClass, pulldownmenu, NULL);*/
|
||
|
xmPushButtonGadgetClass, pulldownmenu, NULL);
|
||
|
XtAddCallback(Options[i], XmNactivateCallback, f_option, (XtPointer) i);
|
||
|
}
|
||
|
/* PURIFY 4.0.1 on Solaris 2 reports a 12 byte memory leak on the next line. */
|
||
|
PromptDialog = XmCreatePromptDialog(toplevel, (char *) "PromptDialog",
|
||
|
args, ac);
|
||
|
XtAddCallback(PromptDialog, XmNokCallback, f_Dialog, NULL);
|
||
|
|
||
|
/* PURIFY 4.0.1 on Solaris 2 reports a 28 byte and a 12 byte memory leak on
|
||
|
the next line. */
|
||
|
FontSelectionDialog = XmCreateSelectionDialog(toplevel,
|
||
|
(char *) "FontSelectionDialog", (Arg *) NULL, 0);
|
||
|
XtAddCallback(FontSelectionDialog, XmNokCallback, f_Dialog, NULL);
|
||
|
|
||
|
/* PURIFY 4.0.1 on Solaris 2 reports a 38 byte memory leak on the next line. */
|
||
|
ProgramSelectionDialog = XmCreateSelectionDialog(toplevel,
|
||
|
(char *) "ProgramSelectionDialog", (Arg *) NULL, 0);
|
||
|
XtAddCallback(ProgramSelectionDialog, XmNokCallback, f_Dialog, NULL);
|
||
|
listtmp = XmSelectionBoxGetChild(ProgramSelectionDialog, XmDIALOG_LIST);
|
||
|
for (i = 0; i < NBPROGNAME; i++) {
|
||
|
label_str = XmStringCreateSimple(prognames[i]);
|
||
|
XmListAddItemUnselected(listtmp, label_str, 0);
|
||
|
XmStringFree(label_str);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
** Make the menu with all options boolean
|
||
|
***/
|
||
|
pulldownmenu = XmCreatePulldownMenu(MenuBar, (char *) "PopupSwitches",
|
||
|
(Arg *) NULL, 0);
|
||
|
label_str = XmStringCreateSimple((char *) "Switches");
|
||
|
XtVaCreateManagedWidget("Switches", xmCascadeButtonWidgetClass, MenuBar,
|
||
|
XmNlabelString, label_str, XmNsubMenuId, pulldownmenu, NULL);
|
||
|
XmStringFree(label_str);
|
||
|
|
||
|
for (i = 0; i < TOGGLES; i++) {
|
||
|
Toggles[i] = XtVaCreateManagedWidget(r_Toggles[i],
|
||
|
xmToggleButtonGadgetClass, pulldownmenu, NULL);
|
||
|
}
|
||
|
}
|
||
|
/*************************
|
||
|
* this fonction return the number of
|
||
|
* element of the array Opt
|
||
|
**************************/
|
||
|
int getNumberofElementofOpt() {
|
||
|
return( sizeof(Opt)/sizeof(OptionStruct));
|
||
|
}
|