#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <X11/Intrinsic.h>
#include <X11/StringDefs.h>
#include <X11/Shell.h>
#include "xlogo.h"
#include "Logo.h"
#include <X11/Xaw/Cardinals.h>
#ifdef INCLUDE_XPRINT_SUPPORT
#include "print.h"
#endif
#ifdef XKB
#include <X11/extensions/XKBbells.h>
#endif
#include <stdio.h>
#include <stdlib.h>
const char *ProgramName;
static void quit(Widget w, XEvent *event, String *params, Cardinal *num_params);
#ifdef INCLUDE_XPRINT_SUPPORT
static void print(Widget w, XEvent *event, String *params, Cardinal *num_params);
#endif
static XrmOptionDescRec options[] = {
{ "-shape", "*shapeWindow", XrmoptionNoArg, (XPointer) "on" },
#ifdef XRENDER
{"-render", "*render",XrmoptionNoArg, "TRUE"},
{"-sharp", "*sharp", XrmoptionNoArg, "TRUE"},
#endif
{"-v", "Verbose", XrmoptionNoArg, "TRUE"},
{"-q", "Quiet", XrmoptionNoArg, "TRUE"},
#ifdef INCLUDE_XPRINT_SUPPORT
{"-print", "Print", XrmoptionNoArg, "TRUE"},
{"-printer", "printer", XrmoptionSepArg, NULL},
{"-printfile", "printFile", XrmoptionSepArg, NULL},
#endif
};
static XtActionsRec actions[] = {
{"quit", quit },
#ifdef INCLUDE_XPRINT_SUPPORT
{"print", print}
#endif
};
static Atom wm_delete_window;
XLogoResourceData userOptions;
#define Offset(field) XtOffsetOf(XLogoResourceData, field)
XtResource resources[] = {
{"verbose", "Verbose", XtRBoolean, sizeof(Boolean), Offset(verbose), XtRImmediate, (XtPointer)False},
{"quiet", "Quiet", XtRBoolean, sizeof(Boolean), Offset(quiet), XtRImmediate, (XtPointer)False},
#ifdef INCLUDE_XPRINT_SUPPORT
{"print", "Print", XtRBoolean, sizeof(Boolean), Offset(printAndExit), XtRImmediate, (XtPointer)False},
{"printer", "Printer", XtRString, sizeof(String), Offset(printername), XtRImmediate, (XtPointer)NULL},
{"printFile", "PrintFile", XtRString, sizeof(String), Offset(printfile), XtRImmediate, (XtPointer)NULL}
#endif
};
String fallback_resources[] = {
"*iconPixmap: xlogo32",
"*iconMask: xlogo32",
"*baseTranslations: #override \\"
#ifdef INCLUDE_XPRINT_SUPPORT
"\t<Key>q: quit()\\n\\"
"\t<Key>p: print()",
#else
"\t<Key>q: quit()",
#endif
NULL,
};
static void
die(Widget w, XtPointer client_data, XtPointer call_data)
{
XtAppSetExitFlag(XtWidgetToApplicationContext(w));
}
static void
save(Widget w, XtPointer client_data, XtPointer call_data)
{
return;
}
static void
Syntax(Widget toplevel)
{
Arg arg;
SmcConn connection;
String reasons[10];
int i, n = 0;
reasons[n++] = "Usage: ";
reasons[n++] = (String)ProgramName;
reasons[n++] = " [-fg <color>] [-bg <color>] [-rv] [-bw <pixels>] [-bd <color>]\n";
reasons[n++] = " [-v] [-q]\n";
reasons[n++] = " [-d [<host>]:[<vs>]]\n";
reasons[n++] = " [-g [<width>][x<height>][<+-><xoff>[<+-><yoff>]]]\n";
#ifdef INCLUDE_XPRINT_SUPPORT
reasons[n++] = " [-print] [-printname <name>] [-printfile <file>]\n";
#endif
#ifdef XRENDER
reasons[n++] = " [-render] [-sharp]\n";
#endif
reasons[n++] = " [-shape]\n\n";
XtSetArg(arg, XtNconnection, &connection);
XtGetValues(toplevel, &arg, (Cardinal)1);
if (connection)
SmcCloseConnection(connection, n, reasons);
else {
for (i=0; i < n; i++)
printf(reasons[i]);
}
exit(EXIT_FAILURE);
}
int
main(int argc, char *argv[])
{
Widget toplevel;
XtAppContext app_con;
ProgramName = argv[0];
toplevel = XtOpenApplication(&app_con, "XLogo",
options, XtNumber(options),
&argc, argv, fallback_resources,
sessionShellWidgetClass, NULL, ZERO);
if (argc != 1)
Syntax(toplevel);
XtGetApplicationResources(toplevel, (XtPointer)&userOptions, resources,
XtNumber(resources), NULL, 0);
XtAppAddActions(app_con, actions, XtNumber(actions));
#ifdef INCLUDE_XPRINT_SUPPORT
if (userOptions.printAndExit) {
XtCallActionProc(toplevel, "print", NULL, NULL, 0);
}
else
#endif
{
XtAddCallback(toplevel, XtNsaveCallback, save, NULL);
XtAddCallback(toplevel, XtNdieCallback, die, NULL);
XtOverrideTranslations
(toplevel, XtParseTranslationTable ("<Message>WM_PROTOCOLS: quit()"));
XtCreateManagedWidget("xlogo", logoWidgetClass, toplevel, NULL, ZERO);
XtRealizeWidget(toplevel);
wm_delete_window = XInternAtom(XtDisplay(toplevel), "WM_DELETE_WINDOW",
False);
(void) XSetWMProtocols (XtDisplay(toplevel), XtWindow(toplevel),
&wm_delete_window, 1);
}
XtAppMainLoop(app_con);
return EXIT_SUCCESS;
}
static void
quit(Widget w, XEvent *event, String *params, Cardinal *num_params)
{
Arg arg;
if (event->type == ClientMessage &&
(Atom)event->xclient.data.l[0] != wm_delete_window) {
#ifdef XKB
XkbStdBell(XtDisplay(w), XtWindow(w), 0, XkbBI_BadValue);
#else
XBell(XtDisplay(w), 0);
#endif
} else {
XtSetArg(arg, XtNjoinSession, False);
XtSetValues(w, &arg, ONE);
die(w, NULL, NULL);
}
}
#ifdef INCLUDE_XPRINT_SUPPORT
static void
print(Widget w, XEvent *event, String *params, Cardinal *num_params)
{
DoPrint(w, userOptions.printername, userOptions.printfile);
}
#endif