123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189 |
- /*
- * CDE - Common Desktop Environment
- *
- * Copyright (c) 1993-2012, The Open Group. All rights reserved.
- *
- * These libraries and programs are free software; you can
- * redistribute them and/or modify them under the terms of the GNU
- * Lesser General Public License as published by the Free Software
- * Foundation; either version 2 of the License, or (at your option)
- * any later version.
- *
- * These libraries and programs are distributed in the hope that
- * they will be useful, but WITHOUT ANY WARRANTY; without even the
- * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
- * PURPOSE. See the GNU Lesser General Public License for more
- * details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with these libraries and programs; if not, write
- * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
- * Floor, Boston, MA 02110-1301 USA
- */
- /* $XConsortium: screensaver.c /main/3 1995/10/27 10:40:15 rswiston $ */
- /************************************/
- /** Sample CDE Screen Saver Client **/
- /************************************/
- #include <locale.h>
- #include <stdio.h>
- #include <sys/time.h>
- #include <math.h>
- #include <X11/Xlib.h>
- #include <X11/Intrinsic.h>
- #include <Dt/Saver.h>
- #define SS_MAX_COLORS 6
- typedef struct {
- Window id;
- int width;
- int height;
- unsigned long ssPixels[SS_MAX_COLORS];
- Colormap cmap;
- GC gc;
- } WinDataStruct;
- int
- usleep(usec)
- unsigned long usec;
- {
- poll((struct poll *) 0, (size_t) 0, usec / 1000); /* milliseconds */
- return 0;
- }
- int main(int argc, char *argv[])
- {
- Display *dpy; /* Display connection */
- Window *winprop = NULL; /* dtsession cover windows */
- int nWindows; /* number of windows */
- WinDataStruct *perWindow; /* per-window information */
- int i, j; /* index variable */
- XColor actual, exact; /* color structs */
- int colorRotate = 0; /* color rotation counter */
- setlocale(LC_ALL, "");
- /*******************************/
- /** open a display connection **/
- /*******************************/
- if (!(dpy = XOpenDisplay(NULL)) ) {
- fprintf(stderr, "Unable to open the Display.\n");
- exit(1);
- }
- /***********************************************************/
- /** Get the list of screen saver windows from the desktop **/
- /***********************************************************/
- if (!DtSaverGetWindows(dpy, &winprop, &nWindows)) {
- fprintf(stderr, "Unable to get screen saver info.\n");
- XCloseDisplay(dpy);
- exit(1);
- }
- /******************************************************/
- /** allocate an array to hold per window information **/
- /******************************************************/
- if ( (perWindow = (WinDataStruct *)malloc(nWindows * sizeof(WinDataStruct)))
- == NULL) {
- fprintf(stderr, "Out of memory.\n");
- XCloseDisplay(dpy);
- exit(1);
- }
- /*****************************************************/
- /** get things set up for each window we were given **/
- /*****************************************************/
- for (i = 0; i < nWindows; i++) {
- XWindowAttributes attr;
- perWindow[i].id = winprop[i];
- /*************************************/
- /** get information for each window **/
- /*************************************/
- if (! XGetWindowAttributes(dpy, perWindow[i].id, &attr)) {
- fprintf(stderr, "Unable to get window %d attributes.\n",
- perWindow[i].id);
- free((void *)perWindow);
- XCloseDisplay(dpy);
- exit(1);
- }
- /***************************************/
- /** save the window info we will need **/
- /***************************************/
- perWindow[i].width = attr.width;
- perWindow[i].height = attr.height;
- perWindow[i].cmap = DefaultColormapOfScreen(attr.screen);
- perWindow[i].gc = DefaultGCOfScreen(attr.screen);
- /***********************************************/
- /** Allocate the colors we will use, fallback **/
- /** to black and white if necessary **/
- /***********************************************/
- if (XAllocNamedColor(dpy,perWindow[i].cmap,"red",&actual,&exact)){
- perWindow[i].ssPixels[0] = actual.pixel;
- } else {
- perWindow[i].ssPixels[0] = BlackPixelOfScreen(attr.screen);
- }
- if (XAllocNamedColor(dpy,perWindow[i].cmap,"orange",&actual,&exact)){
- perWindow[i].ssPixels[1] = actual.pixel;
- } else {
- perWindow[i].ssPixels[1] = WhitePixelOfScreen(attr.screen);
- }
- if (XAllocNamedColor(dpy,perWindow[i].cmap,"yellow",&actual,&exact)){
- perWindow[i].ssPixels[2] = actual.pixel;
- } else {
- perWindow[i].ssPixels[2] = BlackPixelOfScreen(attr.screen);
- }
- if (XAllocNamedColor(dpy,perWindow[i].cmap,"green",&actual,&exact)){
- perWindow[i].ssPixels[3] = actual.pixel;
- } else {
- perWindow[i].ssPixels[3] = WhitePixelOfScreen(attr.screen);
- }
- if (XAllocNamedColor(dpy,perWindow[i].cmap,"blue",&actual,&exact)){
- perWindow[i].ssPixels[4] = actual.pixel;
- } else {
- perWindow[i].ssPixels[4] = BlackPixelOfScreen(attr.screen);;
- }
- if (XAllocNamedColor(dpy,perWindow[i].cmap,"purple",&actual,&exact)){
- perWindow[i].ssPixels[5] = actual.pixel;
- } else {
- perWindow[i].ssPixels[5] = WhitePixelOfScreen(attr.screen);
- }
- }
- /************************************/
- /** OK, now enter our drawing loop **/
- /************************************/
- while (1) {
- /************************/
- /** update each window **/
- /************************/
- for (i = 0; i < nWindows; i++) {
- /***************************/
- /** for each color we use **/
- /***************************/
- for (j = 0; j < SS_MAX_COLORS; j++) {
- int x, y, width, height;
- unsigned long curColor;
- curColor = perWindow[i].ssPixels[
- (int)fmod((j + colorRotate),SS_MAX_COLORS)];
- XSetBackground(dpy, perWindow[i].gc, curColor);
- XSetForeground(dpy, perWindow[i].gc, curColor);
- x = j * ((perWindow[i].width/2) / (SS_MAX_COLORS));
- y = j * ((perWindow[i].height/2) / (SS_MAX_COLORS));
- width = perWindow[i].width - (2 * x);
- height = perWindow[i].height - (2 * y);
- XFillRectangle(dpy, perWindow[i].id, perWindow[i].gc,
- x, y, width, height);
- }
- }
- /**XFlush(dpy); **/
- XSync(dpy, False);
- colorRotate = (int) fmod ((colorRotate + 1), SS_MAX_COLORS);
- usleep(200000);
- }
- }
|