#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 #include #ifdef VMS #include #include #include #endif /* #include Does not work on my version of Lesstif */ #include #include #include #include #include #include #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)); }