oclock.c revision 168023fe
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 57168023feSmrgstatic void die(Widget w, XtPointer client_data, XtPointer call_data) 586ea72052Smrg{ 596ea72052Smrg XCloseDisplay(XtDisplay(w)); 606ea72052Smrg exit(0); 616ea72052Smrg} 626ea72052Smrg 63168023feSmrgstatic void save(Widget w, XtPointer client_data, XtPointer call_data) 646ea72052Smrg{ 656ea72052Smrg return; /* stateless */ 666ea72052Smrg} 676ea72052Smrg 686ea72052Smrg/* Exit with message describing command line format */ 696ea72052Smrg 70168023feSmrgstatic void usage(void) 716ea72052Smrg{ 726ea72052Smrg fprintf(stderr, 736ea72052Smrg"usage: oclock\n"); 746ea72052Smrg fprintf (stderr, 756ea72052Smrg" [-geometry [{width}][x{height}][{+-}{xoff}[{+-}{yoff}]]] [-display [{host}]:[{vs}]]\n"); 766ea72052Smrg fprintf(stderr, 776ea72052Smrg" [-fg {color}] [-bg {color}] [-bd {color}] [-bw {pixels}]\n"); 786ea72052Smrg fprintf(stderr, 796ea72052Smrg" [-minute {color}] [-hour {color}] [-jewel {color}]\n"); 806ea72052Smrg fprintf(stderr, 816ea72052Smrg" [-backing {backing-store}] [-shape] [-noshape] [-transparent]\n"); 826ea72052Smrg exit(1); 836ea72052Smrg} 846ea72052Smrg 856ea72052Smrg/* Command line options table. Only resources are entered here...there is a 866ea72052Smrg pass over the remaining options after XtParseCommand is let loose. */ 876ea72052Smrg 886ea72052Smrgstatic XrmOptionDescRec options[] = { 896ea72052Smrg{"-fg", "*Foreground", XrmoptionSepArg, NULL}, 906ea72052Smrg{"-bg", "*Background", XrmoptionSepArg, NULL}, 916ea72052Smrg{"-foreground", "*Foreground", XrmoptionSepArg, NULL}, 926ea72052Smrg{"-background", "*Background", XrmoptionSepArg, NULL}, 936ea72052Smrg{"-minute", "*clock.minute", XrmoptionSepArg, NULL}, 946ea72052Smrg{"-hour", "*clock.hour", XrmoptionSepArg, NULL}, 956ea72052Smrg{"-jewel", "*clock.jewel", XrmoptionSepArg, NULL}, 966ea72052Smrg{"-backing", "*clock.backingStore", XrmoptionSepArg, NULL}, 976ea72052Smrg{"-shape", "*clock.shapeWindow", XrmoptionNoArg, "TRUE"}, 986ea72052Smrg{"-noshape", "*clock.shapeWindow", XrmoptionNoArg, "FALSE"}, 996ea72052Smrg{"-transparent","*clock.transparent", XrmoptionNoArg, "TRUE"}, 1006ea72052Smrg}; 1016ea72052Smrg 1026ea72052Smrgint 1036ea72052Smrgmain(int argc, char *argv[]) 1046ea72052Smrg{ 1056ea72052Smrg XtAppContext xtcontext; 1066ea72052Smrg Widget toplevel; 1076ea72052Smrg Arg arg[2]; 1086ea72052Smrg int i; 1096ea72052Smrg 1106ea72052Smrg toplevel = XtOpenApplication(&xtcontext, "Clock", 1116ea72052Smrg options, XtNumber(options), &argc, argv, NULL, 1126ea72052Smrg sessionShellWidgetClass, NULL, 0); 1136ea72052Smrg if (argc != 1) usage(); 1146ea72052Smrg XtAddCallback(toplevel, XtNsaveCallback, save, NULL); 1156ea72052Smrg XtAddCallback(toplevel, XtNdieCallback, die, NULL); 1166ea72052Smrg 1176ea72052Smrg XtAppAddActions 1186ea72052Smrg (xtcontext, actions, XtNumber(actions)); 1196ea72052Smrg XtOverrideTranslations 1206ea72052Smrg (toplevel, XtParseTranslationTable ("<Message>WM_PROTOCOLS: quit()")); 1216ea72052Smrg 1226ea72052Smrg i = 0; 1236ea72052Smrg XtSetArg (arg[i], XtNiconPixmap, 1246ea72052Smrg XCreateBitmapFromData (XtDisplay(toplevel), 1256ea72052Smrg XtScreen(toplevel)->root, 1266ea72052Smrg (char *)oclock_bits, 1276ea72052Smrg oclock_width, oclock_height)); 1286ea72052Smrg i++; 1296ea72052Smrg XtSetArg (arg[i], XtNiconMask, 1306ea72052Smrg XCreateBitmapFromData (XtDisplay(toplevel), 1316ea72052Smrg XtScreen(toplevel)->root, 1326ea72052Smrg (char *)oclmask_bits, 1336ea72052Smrg oclmask_width, oclmask_height)); 1346ea72052Smrg i++; 1356ea72052Smrg XtSetValues (toplevel, arg, i); 1366ea72052Smrg 1376ea72052Smrg (void) XtCreateManagedWidget("clock", clockWidgetClass, toplevel, NULL, 0); 1386ea72052Smrg XtRealizeWidget (toplevel); 1396ea72052Smrg 1406ea72052Smrg wm_delete_window = XInternAtom(XtDisplay(toplevel), "WM_DELETE_WINDOW", 1416ea72052Smrg False); 1426ea72052Smrg (void) XSetWMProtocols (XtDisplay(toplevel), XtWindow(toplevel), 1436ea72052Smrg &wm_delete_window, 1); 1446ea72052Smrg 1456ea72052Smrg XtAddEventHandler(toplevel, (EventMask) 0, TRUE, 1466ea72052Smrg _XEditResCheckMessages, NULL); 1476ea72052Smrg 1486ea72052Smrg XtAppMainLoop(xtcontext); 1496ea72052Smrg exit(0); 1506ea72052Smrg} 1516ea72052Smrg 152168023feSmrgstatic void quit(Widget w, XEvent *event, String *params, Cardinal *num_params) 1536ea72052Smrg{ 1546ea72052Smrg Arg arg; 1556ea72052Smrg 1566ea72052Smrg if (event->type == ClientMessage && 1576ea72052Smrg event->xclient.data.l[0] != wm_delete_window) { 1586ea72052Smrg#ifdef XKB 1596ea72052Smrg XkbStdBell(XtDisplay(w), XtWindow(w), 0, XkbBI_BadValue); 1606ea72052Smrg#else 1616ea72052Smrg XBell(XtDisplay(w), 0); 1626ea72052Smrg#endif 1636ea72052Smrg } else { 1646ea72052Smrg XtSetArg(arg, XtNjoinSession, False); 1656ea72052Smrg XtSetValues(w, &arg, (Cardinal)1); 1666ea72052Smrg die(w, NULL, NULL); 1676ea72052Smrg } 1686ea72052Smrg} 169