#include <stdio.h>
#include <X11/Intrinsic.h>
#include <X11/Shell.h>
#include "Logo.h"
#include <X11/Xaw/Cardinals.h>
#ifdef XKB
#include <X11/extensions/XKBbells.h>
#endif
#include <stdlib.h>
static void quit(Widget w, XEvent *event, String *params,
Cardinal *num_params);
static XrmOptionDescRec options[] = {
{ "-shape", "*shapeWindow", XrmoptionNoArg, (XPointer) "on" },
#ifdef XRENDER
{"-render", "*render",XrmoptionNoArg, "TRUE"},
{"-sharp", "*sharp", XrmoptionNoArg, "TRUE"},
#endif
};
static XtActionsRec actions[] = {
{"quit", quit}
};
static Atom wm_delete_window;
String fallback_resources[] = {
"*iconPixmap: xlogo32",
"*iconMask: xlogo32",
NULL,
};
static void
die(Widget w, XtPointer client_data, XtPointer call_data)
{
XCloseDisplay(XtDisplay(w));
exit(0);
}
static void
save(Widget w, XtPointer client_data, XtPointer call_data)
{
return;
}
static void
Syntax(Widget toplevel, char *call)
{
Arg arg;
SmcConn connection;
String reasons[7];
int i, num_reasons = 7;
reasons[0] = "Usage: ";
reasons[1] = call;
reasons[2] = " [-fg <color>] [-bg <color>] [-rv] [-bw <pixels>] [-bd <color>]\n";
reasons[3] = " [-d [<host>]:[<vs>]]\n";
reasons[4] = " [-g [<width>][x<height>][<+-><xoff>[<+-><yoff>]]]\n";
#ifdef XRENDER
reasons[5] = " [-render] [-sharp]\n";
#else
reasons[5] = "";
#endif
reasons[6] = " [-shape]\n\n";
XtSetArg(arg, XtNconnection, &connection);
XtGetValues(toplevel, &arg, (Cardinal)1);
if (connection)
SmcCloseConnection(connection, num_reasons, reasons);
else {
for (i=0; i < num_reasons; i++)
printf(reasons[i]);
}
exit(1);
}
int
main(int argc, char *argv[])
{
Widget toplevel;
XtAppContext app_con;
toplevel = XtOpenApplication(&app_con, "XLogo",
options, XtNumber(options),
&argc, argv, fallback_resources,
sessionShellWidgetClass, NULL, ZERO);
if (argc != 1)
Syntax(toplevel, argv[0]);
XtAddCallback(toplevel, XtNsaveCallback, save, NULL);
XtAddCallback(toplevel, XtNdieCallback, die, NULL);
XtAppAddActions
(XtWidgetToApplicationContext(toplevel), actions, XtNumber(actions));
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);
exit(0);
}
static void
quit(Widget w, XEvent *event, String *params, Cardinal *num_params)
{
Arg arg;
if (event->type == ClientMessage &&
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);
}
}