oclock.c revision 6ea72052
16ea72052Smrg/*
26ea72052Smrg * $Xorg: oclock.c,v 1.4 2001/02/09 02:05:33 xorgcvs Exp $
36ea72052Smrg *
46ea72052SmrgCopyright 1989, 1998  The Open Group
56ea72052Smrg
66ea72052SmrgPermission to use, copy, modify, distribute, and sell this software and its
76ea72052Smrgdocumentation for any purpose is hereby granted without fee, provided that
86ea72052Smrgthe above copyright notice appear in all copies and that both that
96ea72052Smrgcopyright notice and this permission notice appear in supporting
106ea72052Smrgdocumentation.
116ea72052Smrg
126ea72052SmrgThe above copyright notice and this permission notice shall be included in
136ea72052Smrgall copies or substantial portions of the Software.
146ea72052Smrg
156ea72052SmrgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
166ea72052SmrgIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
176ea72052SmrgFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
186ea72052SmrgOPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
196ea72052SmrgAN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
206ea72052SmrgCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
216ea72052Smrg
226ea72052SmrgExcept as contained in this notice, the name of The Open Group shall not be
236ea72052Smrgused in advertising or otherwise to promote the sale, use or other dealings
246ea72052Smrgin this Software without prior written authorization from The Open Group.
256ea72052Smrg */
266ea72052Smrg/* $XFree86: xc/programs/oclock/oclock.c,v 1.7tsi Exp $ */
276ea72052Smrg
286ea72052Smrg#include <X11/Intrinsic.h>
296ea72052Smrg#include <X11/Xatom.h>
306ea72052Smrg#include <X11/StringDefs.h>
316ea72052Smrg#include <X11/Shell.h>
326ea72052Smrg#include <X11/Xmu/Editres.h>
336ea72052Smrg#include "Clock.h"
346ea72052Smrg#include <stdio.h>
356ea72052Smrg#include <stdlib.h>
366ea72052Smrg
376ea72052Smrg#ifdef XKB
386ea72052Smrg#include <X11/extensions/XKBbells.h>
396ea72052Smrg#endif
406ea72052Smrg
416ea72052Smrg#include "oclock.bit"
426ea72052Smrg#include "oclmask.bit"
436ea72052Smrg
446ea72052Smrgstatic void die ( Widget w, XtPointer client_data, XtPointer call_data );
456ea72052Smrgstatic void save ( Widget w, XtPointer client_data, XtPointer call_data );
466ea72052Smrgstatic void usage ( void );
476ea72052Smrgstatic void quit ( Widget w, XEvent *event, String *params,
486ea72052Smrg		   Cardinal *num_params );
496ea72052Smrg
506ea72052Smrg
516ea72052Smrgstatic XtActionsRec actions[] = {
526ea72052Smrg    {"quit",	quit}
536ea72052Smrg};
546ea72052Smrg
556ea72052Smrgstatic Atom wm_delete_window;
566ea72052Smrg
576ea72052Smrgstatic void die(w, client_data, call_data)
586ea72052Smrg    Widget	w;
596ea72052Smrg    XtPointer	client_data, call_data;
606ea72052Smrg{
616ea72052Smrg    XCloseDisplay(XtDisplay(w));
626ea72052Smrg    exit(0);
636ea72052Smrg}
646ea72052Smrg
656ea72052Smrgstatic void save(w, client_data, call_data)
666ea72052Smrg    Widget w;
676ea72052Smrg    XtPointer client_data, call_data;
686ea72052Smrg{
696ea72052Smrg    return;	/* stateless */
706ea72052Smrg}
716ea72052Smrg
726ea72052Smrg/* Exit with message describing command line format */
736ea72052Smrg
746ea72052Smrgstatic void usage()
756ea72052Smrg{
766ea72052Smrg    fprintf(stderr,
776ea72052Smrg"usage: oclock\n");
786ea72052Smrg    fprintf (stderr,
796ea72052Smrg"       [-geometry [{width}][x{height}][{+-}{xoff}[{+-}{yoff}]]] [-display [{host}]:[{vs}]]\n");
806ea72052Smrg    fprintf(stderr,
816ea72052Smrg"       [-fg {color}] [-bg {color}] [-bd {color}] [-bw {pixels}]\n");
826ea72052Smrg    fprintf(stderr,
836ea72052Smrg"       [-minute {color}] [-hour {color}] [-jewel {color}]\n");
846ea72052Smrg    fprintf(stderr,
856ea72052Smrg"       [-backing {backing-store}] [-shape] [-noshape] [-transparent]\n");
866ea72052Smrg    exit(1);
876ea72052Smrg}
886ea72052Smrg
896ea72052Smrg/* Command line options table.  Only resources are entered here...there is a
906ea72052Smrg   pass over the remaining options after XtParseCommand is let loose. */
916ea72052Smrg
926ea72052Smrgstatic XrmOptionDescRec options[] = {
936ea72052Smrg{"-fg",		"*Foreground",		XrmoptionSepArg,	NULL},
946ea72052Smrg{"-bg",		"*Background",		XrmoptionSepArg,	NULL},
956ea72052Smrg{"-foreground",	"*Foreground",		XrmoptionSepArg,	NULL},
966ea72052Smrg{"-background",	"*Background",		XrmoptionSepArg,	NULL},
976ea72052Smrg{"-minute",	"*clock.minute",	XrmoptionSepArg,	NULL},
986ea72052Smrg{"-hour",	"*clock.hour",		XrmoptionSepArg,	NULL},
996ea72052Smrg{"-jewel",	"*clock.jewel",		XrmoptionSepArg,	NULL},
1006ea72052Smrg{"-backing",	"*clock.backingStore",	XrmoptionSepArg,	NULL},
1016ea72052Smrg{"-shape",	"*clock.shapeWindow",	XrmoptionNoArg,		"TRUE"},
1026ea72052Smrg{"-noshape",	"*clock.shapeWindow",	XrmoptionNoArg,		"FALSE"},
1036ea72052Smrg{"-transparent","*clock.transparent",	XrmoptionNoArg,		"TRUE"},
1046ea72052Smrg};
1056ea72052Smrg
1066ea72052Smrgint
1076ea72052Smrgmain(int argc, char *argv[])
1086ea72052Smrg{
1096ea72052Smrg    XtAppContext xtcontext;
1106ea72052Smrg    Widget toplevel;
1116ea72052Smrg    Arg arg[2];
1126ea72052Smrg    int	i;
1136ea72052Smrg
1146ea72052Smrg    toplevel = XtOpenApplication(&xtcontext, "Clock",
1156ea72052Smrg				 options, XtNumber(options), &argc, argv, NULL,
1166ea72052Smrg				 sessionShellWidgetClass, NULL, 0);
1176ea72052Smrg    if (argc != 1) usage();
1186ea72052Smrg    XtAddCallback(toplevel, XtNsaveCallback, save, NULL);
1196ea72052Smrg    XtAddCallback(toplevel, XtNdieCallback, die, NULL);
1206ea72052Smrg
1216ea72052Smrg    XtAppAddActions
1226ea72052Smrg	(xtcontext, actions, XtNumber(actions));
1236ea72052Smrg    XtOverrideTranslations
1246ea72052Smrg	(toplevel, XtParseTranslationTable ("<Message>WM_PROTOCOLS: quit()"));
1256ea72052Smrg
1266ea72052Smrg    i = 0;
1276ea72052Smrg    XtSetArg (arg[i], XtNiconPixmap,
1286ea72052Smrg	      XCreateBitmapFromData (XtDisplay(toplevel),
1296ea72052Smrg				     XtScreen(toplevel)->root,
1306ea72052Smrg				     (char *)oclock_bits,
1316ea72052Smrg				     oclock_width, oclock_height));
1326ea72052Smrg    i++;
1336ea72052Smrg    XtSetArg (arg[i], XtNiconMask,
1346ea72052Smrg	      XCreateBitmapFromData (XtDisplay(toplevel),
1356ea72052Smrg				     XtScreen(toplevel)->root,
1366ea72052Smrg				     (char *)oclmask_bits,
1376ea72052Smrg				     oclmask_width, oclmask_height));
1386ea72052Smrg    i++;
1396ea72052Smrg    XtSetValues (toplevel, arg, i);
1406ea72052Smrg
1416ea72052Smrg    (void) XtCreateManagedWidget("clock", clockWidgetClass, toplevel, NULL, 0);
1426ea72052Smrg    XtRealizeWidget (toplevel);
1436ea72052Smrg
1446ea72052Smrg    wm_delete_window = XInternAtom(XtDisplay(toplevel), "WM_DELETE_WINDOW",
1456ea72052Smrg				   False);
1466ea72052Smrg    (void) XSetWMProtocols (XtDisplay(toplevel), XtWindow(toplevel),
1476ea72052Smrg                            &wm_delete_window, 1);
1486ea72052Smrg
1496ea72052Smrg    XtAddEventHandler(toplevel, (EventMask) 0, TRUE,
1506ea72052Smrg		      _XEditResCheckMessages, NULL);
1516ea72052Smrg
1526ea72052Smrg    XtAppMainLoop(xtcontext);
1536ea72052Smrg    exit(0);
1546ea72052Smrg}
1556ea72052Smrg
1566ea72052Smrgstatic void quit(w, event, params, num_params)
1576ea72052Smrg    Widget w;
1586ea72052Smrg    XEvent *event;
1596ea72052Smrg    String *params;
1606ea72052Smrg    Cardinal *num_params;
1616ea72052Smrg{
1626ea72052Smrg    Arg arg;
1636ea72052Smrg
1646ea72052Smrg    if (event->type == ClientMessage &&
1656ea72052Smrg	event->xclient.data.l[0] != wm_delete_window) {
1666ea72052Smrg#ifdef XKB
1676ea72052Smrg	XkbStdBell(XtDisplay(w), XtWindow(w), 0, XkbBI_BadValue);
1686ea72052Smrg#else
1696ea72052Smrg	XBell(XtDisplay(w), 0);
1706ea72052Smrg#endif
1716ea72052Smrg    } else {
1726ea72052Smrg	XtSetArg(arg, XtNjoinSession, False);
1736ea72052Smrg	XtSetValues(w, &arg, (Cardinal)1);
1746ea72052Smrg	die(w, NULL, NULL);
1756ea72052Smrg    }
1766ea72052Smrg}
177