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 bool ColCallBack(struct t_x11 *x11,XEvent *event, Window w, void *data)
69 switch (event->type) {
74 printf("%6d%6d%6d\t\t%-20s\n",r,g,b,wd->text);
80 static bool BCallBack(struct t_x11 *x11,XEvent *event, Window w, void *data)
85 switch (event->type) {
87 XSetForeground(x11->disp,x11->gc,sc->col[sc->ncol-1].xc.pixel);
88 TextInWin(x11,&sc->but,sc->but.text,eXCenter,eYCenter);
91 sc->but.width=event->xconfigure.width;
92 sc->but.height=event->xconfigure.height;
95 LightBorder(x11->disp,sc->but.self,sc->col[sc->ncol-1].xc.pixel);
98 LightBorder(x11->disp,sc->but.self,sc->col[0].xc.pixel);
101 x11->UnRegisterCallback(x11,sc->wd.self);
102 x11->UnRegisterCallback(x11,sc->but.self);
108 static bool scCallBack(struct t_x11 *x11,XEvent *event, Window w, void *data)
112 int nx,ny,X,Y,Dx,Dy,th;
115 th=XTextHeight(x11->font)+6;
117 switch (event->type) {
118 case ConfigureNotify:
119 x=sc->wd.width=event->xconfigure.width;
120 y=sc->wd.height=event->xconfigure.height-th;
121 if ((x >= 100) && (y >= 100)) {
123 printf("Disp: %x, But: %x, Font: %x x: %d, th: %d\n",
124 x11->disp,sc->but.self,x11->font,(int)x,th);
126 XResizeWindow(x11->disp,sc->but.self,(int)x-4,th-4);
129 while (nx*ny < sc->ncol)
133 for(i=0; (i<sc->ncol); i++) {
138 XMoveWindow(x11->disp,sc->col[i].wd.self,X,th+Y);
139 XResizeWindow(x11->disp,sc->col[i].wd.self,Dx,Dy);
147 static int col_comp(const void *c1,const void *c2)
153 x1=&(((t_col *)c1)->xc);
154 x2=&(((t_col *)c2)->xc);
156 /* sort on intensity */
157 diff=(x1->red+x1->green+x1->blue)-(x2->red+x2->green+x2->blue);
160 if ((dr=(x1->red-x2->red)) != 0)
162 if ((dg=(x1->green-x2->green)) != 0)
164 return x1->blue-x2->blue;
170 static void read_col(t_x11 *x11,t_sc *sc,char *rgb)
173 char buf[STRLEN],name[STRLEN],*dummy;
179 if ((fp=fopen(rgb,"r"))==NULL) {
185 if (fscanf(fp,"%d%d%d",&r,&g,&b)==3) {
186 dummy=fgets2(buf,STRLEN-1,fp);
189 /* Filter out colours with names of two words */
190 sscanf(buf,"%s",name);
191 /* Filter out duplicate colours (grey and gray) */
192 if (strstr(name,"gray")==0) {
193 if (XAllocNamedColor(x11->disp,x11->cmap,name,&xc,&exact)) {
194 srenew(sc->col,++sc->ncol);
195 sc->col[sc->ncol-1].xc=xc;
197 printf("color %3d: %s\n",sc->ncol,buf);
199 InitWin(&(sc->col[sc->ncol-1].wd),0,0,1,1,0,name);
207 qsort(sc->col,sc->ncol,sizeof(sc->col[0]),col_comp);
208 /* Now filter out doubles */
210 for(i=1,j=0; (i<sc->ncol); i++) {
211 if ((cols[i].xc.red != cols[j].xc.red) ||
212 (cols[i].xc.green != cols[j].xc.green) ||
213 (cols[i].xc.blue != cols[j].xc.blue)) {
221 static t_sc *init_sc(t_x11 *x11,Window Parent,char *rgb)
228 InitWin(&sc->wd,0,0,400,300,1,"Show Colours");
229 sc->wd.self=XCreateSimpleWindow(x11->disp,Parent,sc->wd.x,sc->wd.y,
230 sc->wd.width,sc->wd.height,
231 sc->wd.bwidth,WHITE,BLACK);
232 x11->RegisterCallback(x11,sc->wd.self,Parent,scCallBack,sc);
233 x11->SetInputMask(x11,sc->wd.self,ButtonPressMask | ExposureMask |
234 StructureNotifyMask);
235 InitWin(&sc->but,0,0,sc->wd.width-2,XTextHeight(x11->font)+2,1,"Quit");
236 sc->but.self=XCreateSimpleWindow(x11->disp,sc->wd.self,sc->but.x,sc->but.y,
237 sc->but.width,sc->but.height,
238 sc->but.bwidth,BLACK,BLACK);
239 x11->RegisterCallback(x11,sc->but.self,sc->but.self,BCallBack,sc);
240 x11->SetInputMask(x11,sc->but.self,ButtonPressMask | ExposureMask |
241 StructureNotifyMask | EnterWindowMask |
244 read_col(x11,sc,rgb);
245 fprintf(stderr,"%d colors found\n",sc->ncol);
246 fprintf(stderr,"%6s%6s%6s\t\t%-20s\n","Red","Green","Blue","name");
247 for(i=0; (i<sc->ncol); i++) {
248 sc->col[i].wd.self=w=XCreateSimpleWindow(x11->disp,sc->wd.self,0,0,1,1,0,
249 BLACK,sc->col[i].xc.pixel);
250 x11->RegisterCallback(x11,w,sc->wd.self,ColCallBack,&(sc->col[i]));
251 x11->SetInputMask(x11,w,ButtonPressMask);
258 main(int argc, char *argv[])
264 x11=GetX11(&argc,argv);
268 fn="/usr/lib/X11/rgb.txt";
269 if (!gmx_fexist(fn)) {
270 fprintf(stderr,"Usage: %s rgb.txt\n",argv[0]);
271 fprintf(stderr,"rgb.txt is usually somewhere in your X windows directories.\n");
274 sc=init_sc(x11,x11->root,fn);
275 XMapWindow(x11->disp,sc->wd.self);
276 XMapSubwindows(x11->disp,sc->wd.self);