3 * This source code is part of
7 * GROningen MAchine for Chemical Simulations
10 * Written by David van der Spoel, Erik Lindahl, Berk Hess, and others.
11 * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
12 * Copyright (c) 2001-2004, The GROMACS development team,
13 * check out http://www.gromacs.org for more information.
15 * This program is free software; you can redistribute it and/or
16 * modify it under the terms of the GNU General Public License
17 * as published by the Free Software Foundation; either version 2
18 * of the License, or (at your option) any later version.
20 * If you want to redistribute modifications, please consider that
21 * scientific software is very special. Version control is crucial -
22 * bugs must be traceable. We will be happy to consider code for
23 * inclusion in the official distribution, but derived work must not
24 * be called official GROMACS. Details are found in the README & COPYING
25 * files - if they are missing, get the official version at www.gromacs.org.
27 * To help us fund GROMACS development, we humbly ask that you cite
28 * the papers on the package - you can find them in the top README file.
30 * For more info, check our website at http://www.gromacs.org
33 * Gyas ROwers Mature At Cryogenic Speed
59 static gmx_bool ColCallBack(struct t_x11 *x11, XEvent *event, Window w, void *data)
75 printf("%6d%6d%6d\t\t%-20s\n", r, g, b, wd->text);
81 static gmx_bool BCallBack(struct t_x11 *x11, XEvent *event, Window w, void *data)
89 XSetForeground(x11->disp, x11->gc, sc->col[sc->ncol-1].xc.pixel);
90 TextInWin(x11, &sc->but, sc->but.text, eXCenter, eYCenter);
93 sc->but.width = event->xconfigure.width;
94 sc->but.height = event->xconfigure.height;
97 LightBorder(x11->disp, sc->but.self, sc->col[sc->ncol-1].xc.pixel);
100 LightBorder(x11->disp, sc->but.self, sc->col[0].xc.pixel);
103 x11->UnRegisterCallback(x11, sc->wd.self);
104 x11->UnRegisterCallback(x11, sc->but.self);
110 static gmx_bool scCallBack(struct t_x11 *x11, XEvent *event, Window w, void *data)
114 int nx, ny, X, Y, Dx, Dy, th;
117 th = XTextHeight(x11->font)+6;
121 case ConfigureNotify:
122 x = sc->wd.width = event->xconfigure.width;
123 y = sc->wd.height = event->xconfigure.height-th;
124 if ((x >= 100) && (y >= 100))
127 printf("Disp: %x, But: %x, Font: %x x: %d, th: %d\n",
128 x11->disp, sc->but.self, x11->font, (int)x, th);
130 XResizeWindow(x11->disp, sc->but.self, (int)x-4, th-4);
133 while (nx*ny < sc->ncol)
137 dx = ((float)x) / nx;
138 dy = ((float)y) / ny;
139 for (i = 0; (i < sc->ncol); i++)
145 XMoveWindow(x11->disp, sc->col[i].wd.self, X, th+Y);
146 XResizeWindow(x11->disp, sc->col[i].wd.self, Dx, Dy);
154 static int col_comp(const void *c1, const void *c2)
160 x1 = &(((t_col *)c1)->xc);
161 x2 = &(((t_col *)c2)->xc);
163 /* sort on intensity */
164 diff = (x1->red+x1->green+x1->blue)-(x2->red+x2->green+x2->blue);
168 if ((dr = (x1->red-x2->red)) != 0)
172 if ((dg = (x1->green-x2->green)) != 0)
176 return x1->blue-x2->blue;
184 static void read_col(t_x11 *x11, t_sc *sc, char *rgb)
187 char buf[STRLEN], name[STRLEN], *dummy;
193 if ((fp = fopen(rgb, "r")) == NULL)
201 if (fscanf(fp, "%d%d%d", &r, &g, &b) == 3)
203 dummy = fgets2(buf, STRLEN-1, fp);
207 /* Filter out colours with names of two words */
208 sscanf(buf, "%s", name);
209 /* Filter out duplicate colours (grey and gray) */
210 if (strstr(name, "gray") == 0)
212 if (XAllocNamedColor(x11->disp, x11->cmap, name, &xc, &exact))
214 srenew(sc->col, ++sc->ncol);
215 sc->col[sc->ncol-1].xc = xc;
217 printf("color %3d: %s\n", sc->ncol, buf);
219 InitWin(&(sc->col[sc->ncol-1].wd), 0, 0, 1, 1, 0, name);
229 qsort(sc->col, sc->ncol, sizeof(sc->col[0]), col_comp);
231 /* Now filter out doubles */
232 cols = &(sc->col[0]);
233 for (i = 1, j = 0; (i < sc->ncol); i++)
235 if ((cols[i].xc.red != cols[j].xc.red) ||
236 (cols[i].xc.green != cols[j].xc.green) ||
237 (cols[i].xc.blue != cols[j].xc.blue))
246 static t_sc *init_sc(t_x11 *x11, Window Parent, char *rgb)
253 InitWin(&sc->wd, 0, 0, 400, 300, 1, "Show Colours");
254 sc->wd.self = XCreateSimpleWindow(x11->disp, Parent, sc->wd.x, sc->wd.y,
255 sc->wd.width, sc->wd.height,
256 sc->wd.bwidth, WHITE, BLACK);
257 x11->RegisterCallback(x11, sc->wd.self, Parent, scCallBack, sc);
258 x11->SetInputMask(x11, sc->wd.self, ButtonPressMask | ExposureMask |
259 StructureNotifyMask);
260 InitWin(&sc->but, 0, 0, sc->wd.width-2, XTextHeight(x11->font)+2, 1, "Quit");
261 sc->but.self = XCreateSimpleWindow(x11->disp, sc->wd.self, sc->but.x, sc->but.y,
262 sc->but.width, sc->but.height,
263 sc->but.bwidth, BLACK, BLACK);
264 x11->RegisterCallback(x11, sc->but.self, sc->but.self, BCallBack, sc);
265 x11->SetInputMask(x11, sc->but.self, ButtonPressMask | ExposureMask |
266 StructureNotifyMask | EnterWindowMask |
269 read_col(x11, sc, rgb);
270 fprintf(stderr, "%d colors found\n", sc->ncol);
271 fprintf(stderr, "%6s%6s%6s\t\t%-20s\n", "Red", "Green", "Blue", "name");
272 for (i = 0; (i < sc->ncol); i++)
274 sc->col[i].wd.self = w = XCreateSimpleWindow(x11->disp, sc->wd.self, 0, 0, 1, 1, 0,
275 BLACK, sc->col[i].xc.pixel);
276 x11->RegisterCallback(x11, w, sc->wd.self, ColCallBack, &(sc->col[i]));
277 x11->SetInputMask(x11, w, ButtonPressMask);
284 main(int argc, char *argv[])
290 x11 = GetX11(&argc, argv);
297 fn = "/usr/lib/X11/rgb.txt";
301 fprintf(stderr, "Usage: %s rgb.txt\n", argv[0]);
302 fprintf(stderr, "rgb.txt is usually somewhere in your X windows directories.\n");
305 sc = init_sc(x11, x11->root, fn);
306 XMapWindow(x11->disp, sc->wd.self);
307 XMapSubwindows(x11->disp, sc->wd.self);