#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include <stdio.h>
#include <stdlib.h>
#include <X11/Xatom.h>
#include <X11/Intrinsic.h>
#include <X11/StringDefs.h>
#include <X11/Shell.h>
#include "Clock.h"
#include <X11/Xaw/Cardinals.h>
#include "clock.bit"
#include "clmask.bit"
#ifdef XKB
#include <X11/extensions/XKBbells.h>
#endif
#ifndef NO_I18N
#include <locale.h>
Boolean no_locale = True;
#endif
static XrmOptionDescRec options[] = {
{"-chime", "*clock.chime", XrmoptionNoArg, "TRUE"},
{"-hd", "*clock.hands", XrmoptionSepArg, NULL},
{"-hands", "*clock.hands", XrmoptionSepArg, NULL},
{"-hl", "*clock.highlight", XrmoptionSepArg, NULL},
{"-highlight", "*clock.highlight", XrmoptionSepArg, NULL},
{"-update", "*clock.update", XrmoptionSepArg, NULL},
{"-padding", "*clock.padding", XrmoptionSepArg, NULL},
{"-d", "*clock.analog", XrmoptionNoArg, "FALSE"},
{"-digital", "*clock.analog", XrmoptionNoArg, "FALSE"},
{"-analog", "*clock.analog", XrmoptionNoArg, "TRUE"},
{"-twelve", "*clock.twentyfour", XrmoptionNoArg, "FALSE"},
{"-twentyfour", "*clock.twentyfour", XrmoptionNoArg, "TRUE"},
{"-brief", "*clock.brief", XrmoptionNoArg, "TRUE"},
{"-utime", "*clock.utime", XrmoptionNoArg, "TRUE"},
{"-strftime", "*clock.strftime", XrmoptionSepArg, NULL},
#ifdef XRENDER
{"-face", "*clock.face", XrmoptionSepArg, NULL},
{"-render", "*clock.render", XrmoptionNoArg, "TRUE"},
{"-norender", "*clock.render", XrmoptionNoArg, "FALSE"},
{"-sharp", "*clock.sharp", XrmoptionNoArg, "TRUE"},
#endif
};
static void quit ( Widget w, XEvent *event, String *params,
Cardinal *num_params );
static XtActionsRec xclock_actions[] = {
{ "quit", quit },
};
static Atom wm_delete_window;
static void
Syntax(char *call)
{
(void) printf ("Usage: %s [-analog] [-bw <pixels>] [-digital] [-brief]\n", call);
(void) printf (" [-utime] [-strftime <fmt-str>]\n");
(void) printf (" [-fg <color>] [-bg <color>] [-hd <color>]\n");
(void) printf (" [-hl <color>] [-bd <color>]\n");
(void) printf (" [-fn <font_name>] [-help] [-padding <pixels>]\n");
(void) printf (" [-rv] [-update <seconds>] [-display displayname]\n");
#ifdef XRENDER
(void) printf (" [-[no]render] [-face <face name>] [-sharp]\n");
#endif
(void) printf (" [-geometry geom] [-twelve] [-twentyfour]\n\n");
exit(1);
}
static void
die(Widget w, XtPointer client_data, XtPointer call_data)
{
XCloseDisplay(XtDisplayOfObject(w));
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_MinorError);
#else
XBell (XtDisplay(w), 0);
#endif
} else {
XtSetArg(arg, XtNjoinSession, False);
XtSetValues(w, &arg, ONE);
die(w, NULL, NULL);
}
}
static void
save(Widget w, XtPointer client_data, XtPointer call_data)
{
XtCheckpointToken token = (XtCheckpointToken) call_data;
token->save_success = True;
}
int
main(int argc, char *argv[])
{
Widget toplevel;
Arg arg;
Pixmap icon_pixmap = None;
XtAppContext app_con;
#ifndef NO_I18N
char *locale_name = setlocale(LC_ALL,"");
XtSetLanguageProc ( NULL, NULL, NULL );
if(!locale_name || 0 == strcmp(locale_name,"C")) {
no_locale = True;
}
else {
no_locale = False;
}
#endif
toplevel = XtOpenApplication(&app_con, "XClock",
options, XtNumber(options), &argc, argv, NULL,
sessionShellWidgetClass, NULL, ZERO);
if (argc != 1) Syntax(argv[0]);
XtAddCallback(toplevel, XtNdieCallback, die, NULL);
XtAddCallback(toplevel, XtNsaveCallback, save, NULL);
XtAppAddActions (app_con, xclock_actions, XtNumber(xclock_actions));
XtOverrideTranslations(toplevel,
XtParseTranslationTable ("<Message>WM_PROTOCOLS: quit()"));
XtSetArg(arg, XtNiconPixmap, &icon_pixmap);
XtGetValues(toplevel, &arg, ONE);
if (icon_pixmap == None) {
arg.value = (XtArgVal)XCreateBitmapFromData(XtDisplay(toplevel),
XtScreen(toplevel)->root,
(char *)clock_bits, clock_width, clock_height);
XtSetValues (toplevel, &arg, ONE);
}
XtSetArg(arg, XtNiconMask, &icon_pixmap);
XtGetValues(toplevel, &arg, ONE);
if (icon_pixmap == None) {
arg.value = (XtArgVal)XCreateBitmapFromData(XtDisplay(toplevel),
XtScreen(toplevel)->root,
(char *)clock_mask_bits, clock_mask_width,
clock_mask_height);
XtSetValues (toplevel, &arg, ONE);
}
XtCreateManagedWidget ("clock", clockWidgetClass, 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);
}