/* * Copyright (C) 2002-2003 RealVNC Ltd. * Copyright (C) 1999 AT&T Laboratories Cambridge. All Rights Reserved. * * This is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this software; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, * USA. */ /* * argsresources.c - deal with command-line args and resources. */ #include "vncviewer.h" #include /* * fallback_resources - these are used if there is no app-defaults file * installed in one of the standard places. */ char *fallback_resources[] = { "Vnc2Swf.title: VNC2SWF %s: %s", "Vnc2Swf.translations:\ : SelectionToVNC()\\n\ : SelectionFromVNC()", "*form.background: black", "*viewport.allowHoriz: True", "*viewport.allowVert: True", "*viewport.useBottom: True", "*viewport.useRight: True", "*viewport*Scrollbar*thumb: None", "*desktop.baseTranslations:\ F8: ShowPopup()\\n\ F9: ToggleRecording()\\n\ F11: ToggleStatus()\\n\ : SendRFBEvent()\\n\ : SendRFBEvent()\\n\ : SendRFBEvent()\\n\ : SendRFBEvent()\\n\ : SendRFBEvent()", "*desktop.statusFont: -*-helvetica-bold-r-*-*-12-*-*-*-*-*-*-*", "*desktop.statusColor: white", "*serverDialog.dialog.label: VNC server:", "*serverDialog.dialog.value:", "*serverDialog.dialog.value.translations: #override\\n\ Return: ServerDialogDone()", "*passwordDialog.dialog.label: Password:", "*passwordDialog.dialog.value:", "*passwordDialog.dialog.value.AsciiSink.echo: False", "*passwordDialog.dialog.value.translations: #override\\n\ Return: PasswordDialogDone()", "*popup.title: VNC2SWF popup", "*popup*background: grey", "*popup*font: -*-helvetica-bold-r-*-*-16-*-*-*-*-*-*-*", "*popup.buttonForm.Command.borderWidth: 0", "*popup.buttonForm.Toggle.borderWidth: 0", "*popup.translations: #override\\n\ WM_PROTOCOLS: HidePopup()", "*popup.buttonForm.translations: #override\\n\ F: ToggleFullScreen() HidePopup()\\n\ R: SelectionToVNC(always) HidePopup()\\n\ L: SelectionFromVNC(always) HidePopup()\\n\ D: SendRFBEvent(keydown,Control_L)\ SendRFBEvent(keydown,Alt_L)\ SendRFBEvent(key,Delete)\ SendRFBEvent(keyup,Alt_L)\ SendRFBEvent(keyup,Control_L)\ HidePopup()\\n\ 8: SendRFBEvent(key,F8) HidePopup()\\n\ 9: SendRFBEvent(key,F9) HidePopup()\\n\ space: ToggleRecording() HidePopup()\\n\ CtrlR: ResetRecording() HidePopup()\\n\ Q: Quit()\\n\ F8: HidePopup()\\n\ Escape: HidePopup()", "*popupButtonCount: 10", "*popup*button1.label: F) Full Screen", "*popup*button1.type: toggle", "*popup*button1.translations: #override\\n\ : SetFullScreenState()\\n\ ,: ToggleFullScreen() HidePopup()", "*popup*button2.label: R) Clipboard: local -> remote", "*popup*button2.translations: #override\\n\ ,: SelectionToVNC(always) HidePopup()", "*popup*button3.label: L) Clipboard: local <- remote", "*popup*button3.translations: #override\\n\ ,: SelectionFromVNC(always) HidePopup()", "*popup*button4.label: D) Send Ctrl-Alt-Del", "*popup*button4.translations: #override\\n\ ,: SendRFBEvent(keydown,Control_L)\ SendRFBEvent(keydown,Alt_L)\ SendRFBEvent(key,Delete)\ SendRFBEvent(keyup,Alt_L)\ SendRFBEvent(keyup,Control_L)\ HidePopup()", "*popup*button5.label: 8) Send F8", "*popup*button5.translations: #override\\n\ ,: SendRFBEvent(key,F8) HidePopup()", "*popup*button6.label: 9) Send F9", "*popup*button6.translations: #override\\n\ ,: SendRFBEvent(key,F9) HidePopup()", "*popup*button7.label: SPC) Start/Stop Recording", "*popup*button7.type: toggle", "*popup*button7.translations: #override\\n\ : SetRecordingState()\\n\ ,: ToggleRecording() HidePopup()", "*popup*button8.label: C-R) Reset Recording", "*popup*button8.translations: #override\\n\ ,: ResetRecording() HidePopup()", "*popup*button9.label: Q) Quit Vnc2Swf", "*popup*button9.translations: #override\\n\ ,: Quit()", "*popup*button10.label: ESC) Close Popup", "*popup*button10.translations: #override\\n\ ,: HidePopup()", NULL }; /* * vncServerHost and vncServerPort are set either from the command line or * from a dialog box. */ char vncServerHost[256]; int vncServerPort = 0; /* * appData is our application-specific data which can be set by the user with * application resource specs. The AppData structure is defined in the header * file. */ AppData appData; static XtResource appDataResourceList[] = { {"shareDesktop", "ShareDesktop", XtRBool, sizeof(Bool), XtOffsetOf(AppData, shareDesktop), XtRImmediate, (XtPointer) False}, {"viewOnly", "ViewOnly", XtRBool, sizeof(Bool), XtOffsetOf(AppData, viewOnly), XtRImmediate, (XtPointer) False}, {"fullScreen", "FullScreen", XtRBool, sizeof(Bool), XtOffsetOf(AppData, fullScreen), XtRImmediate, (XtPointer) False}, {"passwordFile", "PasswordFile", XtRString, sizeof(String), XtOffsetOf(AppData, passwordFile), XtRImmediate, (XtPointer) 0}, {"passwordDialog", "PasswordDialog", XtRBool, sizeof(Bool), XtOffsetOf(AppData, passwordDialog), XtRImmediate, (XtPointer) False}, {"autoDetect", "AutoDetect", XtRBool, sizeof(Bool), XtOffsetOf(AppData, autoDetect), XtRImmediate, (XtPointer) False}, {"encodings", "Encodings", XtRString, sizeof(String), XtOffsetOf(AppData, encodingsString), XtRImmediate, (XtPointer) "raw"}, {"useBGR233", "UseBGR233", XtRBool, sizeof(Bool), XtOffsetOf(AppData, useBGR233), XtRImmediate, (XtPointer) False}, {"nColours", "NColours", XtRInt, sizeof(int), XtOffsetOf(AppData, nColours), XtRImmediate, (XtPointer) 256}, {"useSharedColours", "UseSharedColours", XtRBool, sizeof(Bool), XtOffsetOf(AppData, useSharedColours), XtRImmediate, (XtPointer) True}, {"forceOwnCmap", "ForceOwnCmap", XtRBool, sizeof(Bool), XtOffsetOf(AppData, forceOwnCmap), XtRImmediate, (XtPointer) False}, {"forceTrueColour", "ForceTrueColour", XtRBool, sizeof(Bool), XtOffsetOf(AppData, forceTrueColour), XtRImmediate, (XtPointer) False}, {"requestedDepth", "RequestedDepth", XtRInt, sizeof(int), XtOffsetOf(AppData, requestedDepth), XtRImmediate, (XtPointer) 0}, {"useSharedMemory", "UseSharedMemory", XtRBool, sizeof(Bool), XtOffsetOf(AppData, useShm), XtRImmediate, (XtPointer) True}, {"wmDecorationWidth", "WmDecorationWidth", XtRInt, sizeof(int), XtOffsetOf(AppData, wmDecorationWidth), XtRImmediate, (XtPointer) 4}, {"wmDecorationHeight", "WmDecorationHeight", XtRInt, sizeof(int), XtOffsetOf(AppData, wmDecorationHeight), XtRImmediate, (XtPointer) 24}, {"popupButtonCount", "PopupButtonCount", XtRInt, sizeof(int), XtOffsetOf(AppData, popupButtonCount), XtRImmediate, (XtPointer) 0}, {"debug", "Debug", XtRBool, sizeof(Bool), XtOffsetOf(AppData, debug), XtRImmediate, (XtPointer) False}, {"rawDelay", "RawDelay", XtRInt, sizeof(int), XtOffsetOf(AppData, rawDelay), XtRImmediate, (XtPointer) 0}, {"copyRectDelay", "CopyRectDelay", XtRInt, sizeof(int), XtOffsetOf(AppData, copyRectDelay), XtRImmediate, (XtPointer) 0}, {"bumpScrollTime", "BumpScrollTime", XtRInt, sizeof(int), XtOffsetOf(AppData, bumpScrollTime), XtRImmediate, (XtPointer) 25}, {"bumpScrollPixels", "BumpScrollPixels", XtRInt, sizeof(int), XtOffsetOf(AppData, bumpScrollPixels), XtRImmediate, (XtPointer) 20}, /* vnc2swf options */ {"frameRate", "FrameRate", XtRInt, sizeof(int), XtOffsetOf(AppData, frameRate), XtRImmediate, (XtPointer) 12}, {"startRecording", "StartRecording", XtRBool, sizeof(Bool), XtOffsetOf(AppData, startRecording), XtRImmediate, (XtPointer) False}, {"showDesktop", "ShowDesktop", XtRBool, sizeof(Bool), XtOffsetOf(AppData, showDesktop), XtRImmediate, (XtPointer) True}, {"showStatus", "ShowStatus", XtRBool, sizeof(Bool), XtOffsetOf(AppData, showStatus), XtRImmediate, (XtPointer) True}, {"clippingGeometry", "ClippingGeometry", XtRString, sizeof(String), XtOffsetOf(AppData, clippingGeometry), XtRImmediate, (XtPointer) 0}, }; /* * The cmdLineOptions array specifies how certain app resource specs can be set * with command-line options. */ XrmOptionDescRec cmdLineOptions[] = { {"-shared", "*shareDesktop", XrmoptionNoArg, "True"}, {"-viewonly", "*viewOnly", XrmoptionNoArg, "True"}, {"-fullscreen", "*fullScreen", XrmoptionNoArg, "True"}, {"-passwd", "*passwordFile", XrmoptionSepArg, 0}, {"-noauto", "*autoDetect", XrmoptionNoArg, "False"}, {"-encodings", "*encodings", XrmoptionSepArg, 0}, {"-bgr233", "*useBGR233", XrmoptionNoArg, "True"}, {"-8bit", "*useBGR233", XrmoptionNoArg, "True"}, {"-owncmap", "*forceOwnCmap", XrmoptionNoArg, "True"}, {"-truecolor", "*forceTrueColour", XrmoptionNoArg, "True"}, {"-truecolour", "*forceTrueColour", XrmoptionNoArg, "True"}, {"-depth", "*requestedDepth", XrmoptionSepArg, 0}, /* vnc2swf options */ {"-framerate", "*frameRate", XrmoptionSepArg, 0}, {"-startrecording", "*startRecording", XrmoptionNoArg, "True"}, {"-nowindow", "*showDesktop", XrmoptionNoArg, "False"}, {"-nostatus", "*showStatus", XrmoptionNoArg, "False"}, {"-clippinggeometry", "*clippingGeometry", XrmoptionSepArg, 0}, }; int numCmdLineOptions = XtNumber(cmdLineOptions); /* * actions[] specifies actions that can be used in widget resource specs. */ static XtActionsRec actions[] = { {"SendRFBEvent", SendRFBEvent}, {"ShowPopup", ShowPopup}, {"HidePopup", HidePopup}, {"ToggleFullScreen", ToggleFullScreen}, {"SetFullScreenState", SetFullScreenState}, {"ToggleBGR233", ToggleBGR233}, {"SetBGR233State", SetBGR233State}, {"ToggleAuto", ToggleAuto}, {"SetAutoState", SetAutoState}, {"SelectionFromVNC", SelectionFromVNC}, {"SelectionToVNC", SelectionToVNC}, {"ServerDialogDone", ServerDialogDone}, {"PasswordDialogDone", PasswordDialogDone}, {"Pause", Pause}, {"Quit", Quit}, /* vnc2swf actions */ {"SetRecordingState", SetRecordingState }, {"ToggleRecording", ToggleRecording }, {"ToggleStatus", ToggleStatus }, {"ResetRecording", ResetRecording }, }; /* * usage() prints out the usage message. */ void usage() { fprintf(stderr,"\n" "usage: %s [] :\n" " %s [] -listen []\n" "\n" " are standard Xt options, or:\n" " -shared\n" " -viewonly\n" " -fullscreen\n" " -passwd \n" " -noauto\n" " -encodings (e.g. \"raw copyrect\")\n" " -geometry \n" " -bgr233\n" " -owncmap\n" " -truecolour\n" " -depth \n" " -framerate \n" " -startrecording\n" " -nowindow\n" " -nostatus\n" " -clippinggeometry \n" ,programName,programName); exit(1); } /* * GetArgsAndResources() deals with resources and any command-line arguments * not already processed by XtVaAppInitialize(). It sets vncServerHost and * vncServerPort and all the fields in appData. */ void GetArgsAndResources(int argc, char *argv[]) { int i; char *vncServerName = 0; /* Obtain the output swf filename. */ if (argc < 2 || argv[1][0] == '-') { usage(); } appData.dumpfileString = argv[1]; /* Turn app resource specs into our appData structure for the rest of the program to use */ XtGetApplicationResources(toplevel, &appData, appDataResourceList, XtNumber(appDataResourceList), 0, 0); if (appData.encodingsString || appData.useBGR233) { appData.autoDetect = False; } if (appData.autoDetect) { appData.useBGR233 = True; } /* Add our actions to the actions table so they can be used in widget resource specs */ XtAppAddActions(appContext, actions, XtNumber(actions)); /* Check any remaining command-line arguments. If -listen was specified there should be none. Otherwise the only argument should be the VNC server name. If not given then pop up a dialog box and wait for the server name to be entered. */ if (listenSpecified) { if (argc != 3) { fprintf(stderr,"\n%s -listen: invalid command line argument: %s\n", programName, argv[2]); usage(); } return; } if (argc == 2) { vncServerName = DoServerDialog(); appData.passwordDialog = True; } else if (argc == 3) { vncServerName = argv[2]; } else { usage(); } if (strlen(vncServerName) > 255) { fprintf(stderr,"VNC server name too long\n"); exit(1); } for (i = 0; vncServerName[i] != ':' && vncServerName[i] != 0; i++); strncpy(vncServerHost, vncServerName, i); vncServerHost[i] = 0; if (vncServerName[i] == ':') { vncServerPort = atoi(&vncServerName[i+1]); } else { vncServerPort = 0; } if (vncServerPort < 100) vncServerPort += SERVER_PORT_OFFSET; } /* * SetXXXState is an action which sets the "state" resource of a toggle * widget to reflect the value of a boolean flag. */ void SetFullScreenState(Widget w, XEvent *ev, String *params, Cardinal *num) { XtVaSetValues(w, XtNstate, appData.fullScreen, NULL); } void SetBGR233State(Widget w, XEvent *ev, String *params, Cardinal *num) { XtVaSetValues(w, XtNstate, appData.useBGR233, NULL); } void SetAutoState(Widget w, XEvent *ev, String *params, Cardinal *num) { XtVaSetValues(w, XtNstate, appData.autoDetect, NULL); } /* * ToggleAuto() toggles the use of autoDetect, if appropriate. */ void ToggleAuto(Widget w, XEvent *event, String *params, Cardinal *num) { if (vis->class == TrueColor) { /* only makes sense if using a TrueColor visual */ appData.autoDetect = !appData.autoDetect; } else { XBell(dpy,100); } SetAutoState(w, event, 0, 0); } /* * ToggleBGR233() toggles the use of bgr233, if appropriate. */ void ToggleBGR233(Widget w, XEvent *event, String *params, Cardinal *num) { if (vis->class == TrueColor) { /* only makes sense if using a TrueColor visual */ appData.useBGR233 = !appData.useBGR233; if (appData.useBGR233) appData.autoDetect = False; /* otherwise autoDetect may just turn it off again */ pendingFormatChange = True; } else { XBell(dpy,100); } SetBGR233State(w, event, 0, 0); }