223 lines
5.8 KiB
C
223 lines
5.8 KiB
C
/*
|
|
* $Id: wmfortune.c,v 0.24 2000/03/28 01:49:58 sugano Exp $
|
|
* wmfortune Copyright (c) 2000 Makoto Sugano
|
|
*
|
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
* of this software and associated documentation files (the "Software"), to deal
|
|
* in the Software without restriction, including without limitation the rights
|
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
* copies of the Software, and to permit persons to whom the Software is
|
|
* furnished to do so, subject to the following conditions:
|
|
*
|
|
* 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
|
|
* AUTHOR 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.
|
|
*
|
|
*/
|
|
#define BUFF_SIZE 1024
|
|
#define SCROLL_DEFAULT_SPEED 1000
|
|
|
|
#include <unistd.h>
|
|
#include <stdio.h>
|
|
#include "dockapp.h"
|
|
#include "XPM/panel.xpm"
|
|
#include "XPM/panel_button_pressed.xpm"
|
|
#include "XPM/panel_window.xpm"
|
|
|
|
/* WINDOW: window for showing the messages */
|
|
#define WINDOW_X 4
|
|
#define WINDOW_Y 4
|
|
#define WINDOW_WIDTH 56
|
|
#define WINDOW_HEIGHT 22
|
|
|
|
/* BUTTON: button for the new fortune message */
|
|
#define BUTTON_X 6
|
|
#define BUTTON_Y 32
|
|
#define BUTTON_WIDTH 52
|
|
#define BUTTON_HEIGHT 28
|
|
|
|
/* 6 pixels are used to draw a letter */
|
|
#define PIXELS_PER_LETTER 6
|
|
|
|
#define STRING_Y 18
|
|
|
|
/*
|
|
* pixel lag between the last letter of the previous message
|
|
* and the first letter of the next message.
|
|
* if set to 0, the messages appear quickly after
|
|
* the previous messages ends.
|
|
*/
|
|
#define MESSAGE_LAG 5
|
|
|
|
char *displayName = "";
|
|
int speed = SCROLL_DEFAULT_SPEED;
|
|
|
|
/* global variables for main() and callbacks */
|
|
FILE *fortune;
|
|
Pixmap pixmap;
|
|
Pixmap panel_button_pressed_pixmap;
|
|
Pixmap panel_pixmap, panel_mask;
|
|
GC gc;
|
|
int c;
|
|
char buff[BUFF_SIZE];
|
|
|
|
/*
|
|
* i: used to count the number of letters in fill_buff().
|
|
* j: the number that points the message starting pixel.
|
|
*/
|
|
int i, j;
|
|
|
|
/* fill the buffer with the fortune message. */
|
|
static void
|
|
fill_buff (void)
|
|
{
|
|
i = 0;
|
|
|
|
memset(buff, '\0', BUFF_SIZE);
|
|
if (!(fortune = popen("fortune -s", "r")))
|
|
{
|
|
perror("fortune");
|
|
exit(0);
|
|
}
|
|
|
|
while (( c = fgetc(fortune)) != EOF)
|
|
{
|
|
if (c == '\n')
|
|
{
|
|
buff[i++] = ' ';
|
|
}
|
|
else if (c == '\t')
|
|
{
|
|
buff[i++] = ' ';
|
|
buff[i++] = ' ';
|
|
buff[i++] = ' ';
|
|
}
|
|
else
|
|
{
|
|
buff[i++] = c;
|
|
}
|
|
}
|
|
|
|
j = i + MESSAGE_LAG;
|
|
pclose(fortune);
|
|
}
|
|
|
|
static DAProgramOption options[] = {
|
|
{"-d", "--displayname", "display to use.", DOString, False, {&displayName}},
|
|
{"-s", "--speed", "scrolling speed. (default 1000 dot/ms)", DOInteger, False, {&speed}},
|
|
};
|
|
|
|
static void
|
|
buttonReleaseCallback (int button, int state, int x, int y)
|
|
{
|
|
if (button == 1 && BUTTON_X < x &&
|
|
x < (BUTTON_X + BUTTON_WIDTH) &&
|
|
BUTTON_Y < y && y < (BUTTON_Y + BUTTON_HEIGHT))
|
|
{
|
|
fill_buff();
|
|
}
|
|
XCopyArea(DADisplay, panel_pixmap, pixmap, gc,
|
|
BUTTON_X, BUTTON_Y, BUTTON_WIDTH, BUTTON_HEIGHT,
|
|
BUTTON_X, BUTTON_Y);
|
|
}
|
|
|
|
static void
|
|
buttonPressCallback (int button, int state, int x, int y)
|
|
{
|
|
if (button == 1 && BUTTON_X < x &&
|
|
x < (BUTTON_X + BUTTON_WIDTH) &&
|
|
BUTTON_Y < y && y < (BUTTON_Y + BUTTON_HEIGHT))
|
|
{
|
|
XCopyArea(DADisplay, panel_button_pressed_pixmap, pixmap, gc,
|
|
BUTTON_X, BUTTON_Y, BUTTON_WIDTH, BUTTON_HEIGHT,
|
|
BUTTON_X, BUTTON_Y);
|
|
}
|
|
}
|
|
|
|
int
|
|
main(int argc, char **argv)
|
|
{
|
|
Pixmap panel_window_pixmap;
|
|
|
|
int w = 64, h = 64;
|
|
|
|
DACallbacks callbacks = {NULL,buttonPressCallback
|
|
,buttonReleaseCallback,NULL,NULL,NULL,NULL};
|
|
|
|
DAParseArguments(argc, argv, options,
|
|
sizeof(options)/sizeof(DAProgramOption),
|
|
"dockapp that shows the messages from fortune command.", "$Id: wmfortune.c,v 0.24 2000/03/28 01:49:58 sugano Exp $");
|
|
|
|
fill_buff();
|
|
|
|
DAInitialize(displayName, "wmfortune", 64, 64, argc, argv);
|
|
pixmap = DAMakePixmap();
|
|
|
|
/* making pixmap for the panel */
|
|
DAMakePixmapFromData(panel_xpm, &panel_pixmap,
|
|
&panel_mask, &w, &h);
|
|
DAMakePixmapFromData(panel_button_pressed_xpm,
|
|
&panel_button_pressed_pixmap, NULL, &w, &h);
|
|
DAMakePixmapFromData(panel_window_xpm,
|
|
&panel_window_pixmap, NULL, &w, &h);
|
|
|
|
/* setting up the mask for the panel */
|
|
DASetShape(panel_mask);
|
|
DASetPixmap(panel_pixmap);
|
|
|
|
/* setting up the graphic context */
|
|
gc = DefaultGC(DADisplay, DefaultScreen(DADisplay));
|
|
|
|
DASetCallbacks(&callbacks);
|
|
DAShow();
|
|
|
|
/* drawing the button */
|
|
XCopyArea(DADisplay, panel_pixmap, pixmap, gc,
|
|
BUTTON_X, BUTTON_Y, BUTTON_WIDTH, BUTTON_HEIGHT,
|
|
BUTTON_X, BUTTON_Y);
|
|
|
|
while (1)
|
|
{
|
|
XEvent ev;
|
|
|
|
/* sets the foreground color green */
|
|
XSetForeground(DADisplay, gc, DAGetColor("green"));
|
|
XCopyArea(DADisplay, panel_window_pixmap, pixmap, gc,
|
|
WINDOW_X, WINDOW_Y, WINDOW_WIDTH, WINDOW_HEIGHT,
|
|
WINDOW_X, WINDOW_Y);
|
|
XDrawString(DADisplay, pixmap, gc, j, STRING_Y, buff, strlen(buff));
|
|
|
|
DASetPixmap(pixmap);
|
|
|
|
/* scroll the message by a pixel to left */
|
|
i--;
|
|
j = i + MESSAGE_LAG;
|
|
|
|
/*
|
|
* starts scrolling the messages from the beginning
|
|
* if the message ends.
|
|
*/
|
|
if (j == - (PIXELS_PER_LETTER) * strlen(buff))
|
|
{
|
|
/* if not 64, message suddenly appears in the window */
|
|
i = 64;
|
|
j = i + MESSAGE_LAG;
|
|
}
|
|
|
|
/* handle all pending X events */
|
|
while (XPending(DADisplay))
|
|
{
|
|
XNextEvent(DADisplay, &ev);
|
|
DAProcessEvent(&ev);
|
|
}
|
|
usleep(speed);
|
|
}
|
|
return 0;
|
|
}
|