2006-11-25 13:07:29 -07:00
|
|
|
/*
|
2012-02-18 02:08:55 -07:00
|
|
|
|
2006-11-25 13:07:29 -07:00
|
|
|
Copyright 1989, 1998 The Open Group
|
|
|
|
|
|
|
|
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.
|
|
|
|
|
|
|
|
The above copyright notice and this permission notice shall be included in
|
|
|
|
all copies or substantial portions of the Software.
|
|
|
|
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
|
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
|
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
|
|
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
|
|
|
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
|
|
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
|
|
|
|
|
|
Except as contained in this notice, the name of The Open Group shall not be
|
|
|
|
used in advertising or otherwise to promote the sale, use or other dealings
|
|
|
|
in this Software without prior written authorization from The Open Group.
|
2012-02-18 02:08:55 -07:00
|
|
|
|
2006-11-25 13:07:29 -07:00
|
|
|
*/
|
2012-02-18 02:08:55 -07:00
|
|
|
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
|
|
#include "config.h"
|
|
|
|
#endif
|
2006-11-25 13:07:29 -07:00
|
|
|
|
|
|
|
#include <X11/Intrinsic.h>
|
|
|
|
#include <X11/Xatom.h>
|
|
|
|
#include <X11/StringDefs.h>
|
|
|
|
#include <X11/Shell.h>
|
|
|
|
#include <X11/Xmu/Editres.h>
|
|
|
|
#include "Clock.h"
|
2012-02-18 02:08:55 -07:00
|
|
|
#include <stdio.h>
|
2006-11-25 13:07:29 -07:00
|
|
|
#include <stdlib.h>
|
|
|
|
|
|
|
|
#ifdef XKB
|
|
|
|
#include <X11/extensions/XKBbells.h>
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#include "oclock.bit"
|
|
|
|
#include "oclmask.bit"
|
|
|
|
|
|
|
|
static void die ( Widget w, XtPointer client_data, XtPointer call_data );
|
|
|
|
static void save ( Widget w, XtPointer client_data, XtPointer call_data );
|
|
|
|
static void usage ( void );
|
2012-02-18 02:08:55 -07:00
|
|
|
static void quit ( Widget w, XEvent *event, String *params,
|
2006-11-25 13:07:29 -07:00
|
|
|
Cardinal *num_params );
|
|
|
|
|
|
|
|
|
|
|
|
static XtActionsRec actions[] = {
|
|
|
|
{"quit", quit}
|
|
|
|
};
|
|
|
|
|
|
|
|
static Atom wm_delete_window;
|
|
|
|
|
2010-10-05 23:31:56 -06:00
|
|
|
static void die(Widget w, XtPointer client_data, XtPointer call_data)
|
2006-11-25 13:07:29 -07:00
|
|
|
{
|
|
|
|
XCloseDisplay(XtDisplay(w));
|
|
|
|
exit(0);
|
|
|
|
}
|
|
|
|
|
2010-10-05 23:31:56 -06:00
|
|
|
static void save(Widget w, XtPointer client_data, XtPointer call_data)
|
2006-11-25 13:07:29 -07:00
|
|
|
{
|
|
|
|
return; /* stateless */
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Exit with message describing command line format */
|
|
|
|
|
2010-10-05 23:31:56 -06:00
|
|
|
static void usage(void)
|
2006-11-25 13:07:29 -07:00
|
|
|
{
|
|
|
|
fprintf(stderr,
|
2012-02-18 02:08:55 -07:00
|
|
|
"usage: oclock\n"
|
|
|
|
" [-geometry [{width}][x{height}][{+-}{xoff}[{+-}{yoff}]]]\n"
|
|
|
|
" [-display [{host}]:[{vs}]]\n"
|
|
|
|
" [-fg {color}] [-bg {color}] [-bd {color}] [-bw {pixels}]\n"
|
|
|
|
" [-minute {color}] [-hour {color}] [-jewel {color}]\n"
|
2006-11-25 13:07:29 -07:00
|
|
|
" [-backing {backing-store}] [-shape] [-noshape] [-transparent]\n");
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* 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[] = {
|
|
|
|
{"-fg", "*Foreground", XrmoptionSepArg, NULL},
|
|
|
|
{"-bg", "*Background", XrmoptionSepArg, NULL},
|
|
|
|
{"-foreground", "*Foreground", XrmoptionSepArg, NULL},
|
|
|
|
{"-background", "*Background", XrmoptionSepArg, NULL},
|
|
|
|
{"-minute", "*clock.minute", XrmoptionSepArg, NULL},
|
|
|
|
{"-hour", "*clock.hour", XrmoptionSepArg, NULL},
|
|
|
|
{"-jewel", "*clock.jewel", XrmoptionSepArg, NULL},
|
|
|
|
{"-backing", "*clock.backingStore", XrmoptionSepArg, NULL},
|
|
|
|
{"-shape", "*clock.shapeWindow", XrmoptionNoArg, "TRUE"},
|
|
|
|
{"-noshape", "*clock.shapeWindow", XrmoptionNoArg, "FALSE"},
|
|
|
|
{"-transparent","*clock.transparent", XrmoptionNoArg, "TRUE"},
|
|
|
|
};
|
|
|
|
|
2012-02-18 02:08:55 -07:00
|
|
|
int
|
2006-11-25 13:07:29 -07:00
|
|
|
main(int argc, char *argv[])
|
|
|
|
{
|
|
|
|
XtAppContext xtcontext;
|
|
|
|
Widget toplevel;
|
|
|
|
Arg arg[2];
|
|
|
|
int i;
|
2012-02-18 02:08:55 -07:00
|
|
|
|
2006-11-25 13:07:29 -07:00
|
|
|
toplevel = XtOpenApplication(&xtcontext, "Clock",
|
|
|
|
options, XtNumber(options), &argc, argv, NULL,
|
|
|
|
sessionShellWidgetClass, NULL, 0);
|
|
|
|
if (argc != 1) usage();
|
|
|
|
XtAddCallback(toplevel, XtNsaveCallback, save, NULL);
|
|
|
|
XtAddCallback(toplevel, XtNdieCallback, die, NULL);
|
|
|
|
|
|
|
|
XtAppAddActions
|
|
|
|
(xtcontext, actions, XtNumber(actions));
|
|
|
|
XtOverrideTranslations
|
|
|
|
(toplevel, XtParseTranslationTable ("<Message>WM_PROTOCOLS: quit()"));
|
|
|
|
|
|
|
|
i = 0;
|
2012-02-18 02:08:55 -07:00
|
|
|
XtSetArg (arg[i], XtNiconPixmap,
|
2006-11-25 13:07:29 -07:00
|
|
|
XCreateBitmapFromData (XtDisplay(toplevel),
|
|
|
|
XtScreen(toplevel)->root,
|
|
|
|
(char *)oclock_bits,
|
|
|
|
oclock_width, oclock_height));
|
|
|
|
i++;
|
|
|
|
XtSetArg (arg[i], XtNiconMask,
|
|
|
|
XCreateBitmapFromData (XtDisplay(toplevel),
|
|
|
|
XtScreen(toplevel)->root,
|
|
|
|
(char *)oclmask_bits,
|
|
|
|
oclmask_width, oclmask_height));
|
|
|
|
i++;
|
|
|
|
XtSetValues (toplevel, arg, i);
|
|
|
|
|
|
|
|
(void) XtCreateManagedWidget("clock", clockWidgetClass, toplevel, NULL, 0);
|
|
|
|
XtRealizeWidget (toplevel);
|
|
|
|
|
|
|
|
wm_delete_window = XInternAtom(XtDisplay(toplevel), "WM_DELETE_WINDOW",
|
|
|
|
False);
|
|
|
|
(void) XSetWMProtocols (XtDisplay(toplevel), XtWindow(toplevel),
|
|
|
|
&wm_delete_window, 1);
|
|
|
|
|
2012-02-18 02:08:55 -07:00
|
|
|
XtAddEventHandler(toplevel, (EventMask) 0, TRUE,
|
2006-11-25 13:07:29 -07:00
|
|
|
_XEditResCheckMessages, NULL);
|
|
|
|
|
|
|
|
XtAppMainLoop(xtcontext);
|
|
|
|
exit(0);
|
|
|
|
}
|
|
|
|
|
2010-10-05 23:31:56 -06:00
|
|
|
static void quit(Widget w, XEvent *event, String *params, Cardinal *num_params)
|
2006-11-25 13:07:29 -07:00
|
|
|
{
|
|
|
|
Arg arg;
|
|
|
|
|
2012-02-18 02:08:55 -07:00
|
|
|
if (event->type == ClientMessage &&
|
2006-11-25 13:07:29 -07:00
|
|
|
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, (Cardinal)1);
|
|
|
|
die(w, NULL, NULL);
|
|
|
|
}
|
|
|
|
}
|