276 lines
7.8 KiB
C
276 lines
7.8 KiB
C
|
/* -*- Mode: C; fill-column: 79 -*- *******************************************
|
||
|
*******************************************************************************
|
||
|
pclock -- a simple analog clock program for the X Window System
|
||
|
Copyright (C) 1998 Alexander Kourakos
|
||
|
Time-stamp: <1998-05-28 20:48:08 awk@oxygene.vnet.net>
|
||
|
|
||
|
This program is free software; you can redistribute it and/or modify it under
|
||
|
the terms of the GNU General Public License as published by the Free Software
|
||
|
Foundation; either version 2 of the License, or (at your option) any later
|
||
|
version.
|
||
|
|
||
|
This program is distributed in the hope that it will be useful, but WITHOUT
|
||
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||
|
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||
|
|
||
|
You should have received a copy of the GNU General Public License along with
|
||
|
this program; if not, write to the Free Software Foundation, Inc.,
|
||
|
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||
|
|
||
|
Author: Alexander Kourakos <Alexander@Kourakos.com>
|
||
|
Web: http://www.kourakos.com/~awk/pclock/
|
||
|
*******************************************************************************
|
||
|
******************************************************************************/
|
||
|
|
||
|
#include <stdlib.h>
|
||
|
#include <stdio.h>
|
||
|
#include <string.h>
|
||
|
#include <getopt.h>
|
||
|
#include <sys/time.h>
|
||
|
|
||
|
#include "PClock.h"
|
||
|
#include "Defaults.h"
|
||
|
#include "Version.h"
|
||
|
|
||
|
/*****************************************************************************/
|
||
|
|
||
|
options option;
|
||
|
static char program_path[STRING_LENGTH];
|
||
|
|
||
|
/*****************************************************************************/
|
||
|
|
||
|
static void Version(void);
|
||
|
static void Usage(void);
|
||
|
static void SetOptions(int, char *[]);
|
||
|
static void StringCopy(char *, const char *);
|
||
|
|
||
|
/*****************************************************************************/
|
||
|
|
||
|
int
|
||
|
main(int argc, char *argv[])
|
||
|
{
|
||
|
int done = FALSE;
|
||
|
struct timeval tv;
|
||
|
|
||
|
StringCopy(program_path, argv[0]);
|
||
|
SetOptions(argc, argv);
|
||
|
|
||
|
CreateWindow(argc, argv);
|
||
|
|
||
|
while (!done) {
|
||
|
UpdateClock();
|
||
|
HandleEvents(&done);
|
||
|
gettimeofday(&tv, NULL);
|
||
|
usleep(PERIOD - tv.tv_usec%PERIOD);
|
||
|
}
|
||
|
|
||
|
DestroyWindow();
|
||
|
|
||
|
return EXIT_SUCCESS;
|
||
|
}
|
||
|
|
||
|
/*****************************************************************************/
|
||
|
|
||
|
static void
|
||
|
Version(void)
|
||
|
{
|
||
|
printf("This is " NAME " " VERSION "\n");
|
||
|
printf("Copyright (C) 1999-2000 Alexander Kourakos\n");
|
||
|
}
|
||
|
|
||
|
/*****************************************************************************/
|
||
|
|
||
|
static void
|
||
|
Usage(void)
|
||
|
{
|
||
|
Version();
|
||
|
|
||
|
printf("\n");
|
||
|
|
||
|
printf("Usage: %s [OPTIONS]\n", program_path);
|
||
|
printf("OPTIONS may be zero or more of the following options.\n");
|
||
|
|
||
|
printf("\n");
|
||
|
|
||
|
printf(" -B, --background=PIXMAP "
|
||
|
"use the given pixmap as the clock background\n"
|
||
|
" "
|
||
|
"(size must be %dx%d)\n", SIZE, SIZE);
|
||
|
|
||
|
printf(" -H, --hands-color=COLOR "
|
||
|
"draw the hour and minute hands (and the second\n"
|
||
|
" "
|
||
|
"hand, if -S is not also specified) in the\n"
|
||
|
" "
|
||
|
"specified color\n");
|
||
|
|
||
|
printf(" --hands-width=INT "
|
||
|
"draw the hour and minute hands with the\n"
|
||
|
" "
|
||
|
"specified width\n");
|
||
|
|
||
|
printf(" -h, --help "
|
||
|
"display this help and exit\n");
|
||
|
|
||
|
printf(" --hour-hand-length=INT "
|
||
|
"draw the hour hand with the specified length\n");
|
||
|
|
||
|
printf(" --minute-hand-length=INT "
|
||
|
"draw the minute hand with the specified length\n");
|
||
|
|
||
|
printf(" -S, --second-hand-color=COLOR "
|
||
|
"draw the second hand in the specified color\n");
|
||
|
|
||
|
printf(" --second-hand-length=INT "
|
||
|
"draw the second hand with the specified length\n");
|
||
|
|
||
|
printf(" --second-hand-width=INT "
|
||
|
"draw the second hand with the specified width\n");
|
||
|
|
||
|
printf(" -s, --second-hand "
|
||
|
"%sdisplay the second hand\n",
|
||
|
SHOW_SECONDS ? "don't " : "");
|
||
|
|
||
|
printf(" -v, --version "
|
||
|
"display the version and exit\n");
|
||
|
|
||
|
printf(" -w, --withdrawn "
|
||
|
"%sstart up in a withdrawn state\n",
|
||
|
UNDER_WINDOWMAKER ? "don't " : "");
|
||
|
|
||
|
printf("\n");
|
||
|
|
||
|
printf("Author: Alexander Kourakos <Alexander@Kourakos.com>\n");
|
||
|
printf(" Web: http://www.kourakos.com/~awk/pclock/\n");
|
||
|
}
|
||
|
|
||
|
/*****************************************************************************/
|
||
|
|
||
|
static void
|
||
|
SetOptions(int ac, char *av[])
|
||
|
{
|
||
|
#define OPT_HANDS_WIDTH 0x100
|
||
|
#define OPT_SECOND_HAND_WIDTH 0x101
|
||
|
#define OPT_HOUR_HAND_LENGTH 0x102
|
||
|
#define OPT_MINUTE_HAND_LENGTH 0x103
|
||
|
#define OPT_SECOND_HAND_LENGTH 0x104
|
||
|
|
||
|
int opt_index = 0, o;
|
||
|
static char *short_opts = "B:H:hS:svw";
|
||
|
static struct option long_opts[] =
|
||
|
{
|
||
|
{"background", 1, 0, 'B'},
|
||
|
{"hands-color", 1, 0, 'H'},
|
||
|
{"hands-width", 1, 0, OPT_HANDS_WIDTH},
|
||
|
{"help", 0, 0, 'h'},
|
||
|
{"hour-hand-length", 1, 0, OPT_HOUR_HAND_LENGTH},
|
||
|
{"minute-hand-length", 1, 0, OPT_MINUTE_HAND_LENGTH},
|
||
|
{"second-hand-color", 1, 0, 'S'},
|
||
|
{"second-hand-length", 1, 0, OPT_SECOND_HAND_LENGTH},
|
||
|
{"second-hand-width", 1, 0, OPT_SECOND_HAND_WIDTH},
|
||
|
{"second-hand", 0, 0, 's'},
|
||
|
{"version", 0, 0, 'v'},
|
||
|
{"withdrawn", 0, 0, 'w'},
|
||
|
{NULL, 0, 0, 0}
|
||
|
};
|
||
|
|
||
|
/*
|
||
|
* Begin by setting the default options (defined in Defaults.h).
|
||
|
*/
|
||
|
|
||
|
option.under_windowmaker = UNDER_WINDOWMAKER;
|
||
|
option.show_seconds = SHOW_SECONDS;
|
||
|
option.hand_width = HAND_WIDTH;
|
||
|
option.second_hand_width = SECOND_HAND_WIDTH;
|
||
|
option.hour_hand_length = HOUR_HAND_LENGTH;
|
||
|
option.minute_hand_length = MINUTE_HAND_LENGTH;
|
||
|
option.second_hand_length = SECOND_HAND_LENGTH;
|
||
|
StringCopy(option.hand_color, HAND_COLOR);
|
||
|
StringCopy(option.second_hand_color, SECOND_HAND_COLOR);
|
||
|
option.background_pixmap[0] = '\0';
|
||
|
|
||
|
/*
|
||
|
* Loop through the user-provided options.
|
||
|
*/
|
||
|
|
||
|
while ((o = getopt_long(ac, av, short_opts, long_opts, &opt_index)) != EOF) {
|
||
|
switch (o) {
|
||
|
case 'B':
|
||
|
StringCopy(option.background_pixmap, optarg);
|
||
|
break;
|
||
|
|
||
|
case 'H':
|
||
|
StringCopy(option.hand_color, optarg);
|
||
|
StringCopy(option.second_hand_color, optarg);
|
||
|
break;
|
||
|
|
||
|
case OPT_HANDS_WIDTH:
|
||
|
option.hand_width = atoi(optarg);
|
||
|
break;
|
||
|
|
||
|
case 'h':
|
||
|
Usage();
|
||
|
exit(EXIT_SUCCESS);
|
||
|
break;
|
||
|
|
||
|
case OPT_HOUR_HAND_LENGTH:
|
||
|
option.hour_hand_length = atoi(optarg);
|
||
|
break;
|
||
|
|
||
|
case OPT_MINUTE_HAND_LENGTH:
|
||
|
option.minute_hand_length = atoi(optarg);
|
||
|
break;
|
||
|
|
||
|
case 'S':
|
||
|
StringCopy(option.second_hand_color, optarg);
|
||
|
break;
|
||
|
|
||
|
case OPT_SECOND_HAND_LENGTH:
|
||
|
option.second_hand_length = atoi(optarg);
|
||
|
break;
|
||
|
|
||
|
case OPT_SECOND_HAND_WIDTH:
|
||
|
option.second_hand_width = atoi(optarg);
|
||
|
break;
|
||
|
|
||
|
case 's':
|
||
|
option.show_seconds = !SHOW_SECONDS;
|
||
|
break;
|
||
|
|
||
|
case 'v':
|
||
|
Version();
|
||
|
exit(EXIT_SUCCESS);
|
||
|
break;
|
||
|
|
||
|
case 'w':
|
||
|
option.under_windowmaker = !UNDER_WINDOWMAKER;
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
exit(EXIT_FAILURE);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* There should be nothing left on the command line.
|
||
|
*/
|
||
|
|
||
|
if (optind < ac)
|
||
|
fprintf(stderr, "ERR: extra command line arguments ignored\n");
|
||
|
}
|
||
|
|
||
|
/*****************************************************************************/
|
||
|
|
||
|
static void
|
||
|
StringCopy(char *destination, const char *source)
|
||
|
{
|
||
|
strncpy(destination, source, STRING_LENGTH);
|
||
|
destination[STRING_LENGTH - 1] = '\0';
|
||
|
}
|
||
|
|
||
|
/******************************************************************************
|
||
|
*******************************************************************************
|
||
|
END OF FILE
|
||
|
*******************************************************************************
|
||
|
******************************************************************************/
|