#ifndef lint
static char rcsid[] = "$XConsortium: xclock.c,v 1.28 89/12/11 15:51:32 kit Exp $";
#endif /* lint */

/*
 * Copyright 1989 Massachusetts Institute of Technology
 *
 * Permission to use, copy, modify, distribute, and sell this software and its
 * documentation for any purpose is hereby granted without fee, provided that
 * the above copyright notice appear in all copies and that both that
 * copyright notice and this permission notice appear in supporting
 * documentation, and that the name of M.I.T. not be used in advertising or
 * publicity pertaining to distribution of the software without specific,
 * written prior permission.  M.I.T. makes no representations about the
 * suitability of this software for any purpose.  It is provided "as is"
 * without express or implied warranty.
 *
 * M.I.T. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL M.I.T.
 * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
 * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN 
 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */

/*
 * xclock --  Hacked from Tony Della Fera.
 */

/*
 * xarclock --  By Jaime Garcia Ghirelli.
 */


#include <X11/Xatom.h>
#include <X11/Intrinsic.h>
#include <X11/StringDefs.h>
#include <X11/Shell.h>

#include <X11/Xaw/Cardinals.h>
#include <Clock.h>
#include "clock.bit"
#include "clmask.bit"

extern void exit();
static void quit();

/* Command line options table.  Only resources are entered here...there is a
   pass over the remaining options after XtParseCommand is let loose. */

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"},
  {"-arabic",	  "*clock.roman",	XrmoptionNoArg,		"FALSE"},
  {"-roman",	  "*clock.roman",	XrmoptionNoArg,		"TRUE"},
  {"-south",	  "*clock.north",	XrmoptionNoArg,		"FALSE"},
  {"-north",	  "*clock.north",	XrmoptionNoArg,		"TRUE"},
};


static XtActionsRec xclock_actions[] = {
  { "quit", quit },
};

static Atom wm_delete_window;

/*
 * Report the syntax for calling xarclock.
 */
Syntax(call)
     char *call;
{
  (void) printf ("Usage: %s \n", call);
  (void) printf ("[-roman] [-arabic] [-south] [-north] \n");
  (void) printf ("[-analog] [-digital] [-bw <pixels>] \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");
  (void) printf ("[-geometry geom] \n\n");
  exit(1);
}

void main(argc, argv)
     int argc;
     char **argv;
{
  Widget toplevel;
  Arg arg;
  Pixmap icon_pixmap = None;
  XtAppContext app_con;
  
  toplevel = XtAppInitialize (&app_con, "XClock", options, XtNumber(options),
			      &argc, argv, NULL, NULL, ZERO);
  if (argc != 1) Syntax(argv[0]);
  
  XtAppAddActions (app_con, xclock_actions, XtNumber(xclock_actions));
  
  /*
   * This is a hack so that f.delete will do something useful in this
   * single-window application.
   */
  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,
						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,
						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);
}


static void quit (w, event, params, num_params)
     Widget w;
     XEvent *event;
     String *params;
     Cardinal *num_params;
{
  if (event->type == ClientMessage &&
      event->xclient.data.l[0] != wm_delete_window) {
    XBell (XtDisplay(w), 0);
    return;
  }
  XCloseDisplay (XtDisplay(w));
  exit (0);
}
