2 * This file is part of the GROMACS molecular simulation package.
4 * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
5 * Copyright (c) 2001-2004, The GROMACS development team,
6 * check out http://www.gromacs.org for more information.
7 * Copyright (c) 2012, by the GROMACS development team, led by
8 * David van der Spoel, Berk Hess, Erik Lindahl, and including many
9 * others, as listed in the AUTHORS file in the top-level source
10 * directory and at http://www.gromacs.org.
12 * GROMACS is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU Lesser General Public License
14 * as published by the Free Software Foundation; either version 2.1
15 * of the License, or (at your option) any later version.
17 * GROMACS is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20 * Lesser General Public License for more details.
22 * You should have received a copy of the GNU Lesser General Public
23 * License along with GROMACS; if not, see
24 * http://www.gnu.org/licenses, or write to the Free Software Foundation,
25 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
27 * If you want to redistribute modifications to GROMACS, please
28 * consider that scientific software is very special. Version
29 * control is crucial - bugs must be traceable. We will be happy to
30 * consider code for inclusion in the official distribution, but
31 * derived work must not be called official GROMACS. Details are found
32 * in the README & COPYING files - if they are missing, get the
33 * official version at http://www.gromacs.org.
35 * To help us fund GROMACS development, we humbly ask that you cite
36 * the research papers on the package. Check out http://www.gromacs.org.
62 static gmx_bool ColCallBack(struct t_x11 *x11,XEvent *event, Window w, void *data)
72 switch (event->type) {
77 printf("%6d%6d%6d\t\t%-20s\n",r,g,b,wd->text);
83 static gmx_bool BCallBack(struct t_x11 *x11,XEvent *event, Window w, void *data)
88 switch (event->type) {
90 XSetForeground(x11->disp,x11->gc,sc->col[sc->ncol-1].xc.pixel);
91 TextInWin(x11,&sc->but,sc->but.text,eXCenter,eYCenter);
94 sc->but.width=event->xconfigure.width;
95 sc->but.height=event->xconfigure.height;
98 LightBorder(x11->disp,sc->but.self,sc->col[sc->ncol-1].xc.pixel);
101 LightBorder(x11->disp,sc->but.self,sc->col[0].xc.pixel);
104 x11->UnRegisterCallback(x11,sc->wd.self);
105 x11->UnRegisterCallback(x11,sc->but.self);
111 static gmx_bool scCallBack(struct t_x11 *x11,XEvent *event, Window w, void *data)
115 int nx,ny,X,Y,Dx,Dy,th;
118 th=XTextHeight(x11->font)+6;
120 switch (event->type) {
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)) {
126 printf("Disp: %x, But: %x, Font: %x x: %d, th: %d\n",
127 x11->disp,sc->but.self,x11->font,(int)x,th);
129 XResizeWindow(x11->disp,sc->but.self,(int)x-4,th-4);
132 while (nx*ny < sc->ncol)
136 for(i=0; (i<sc->ncol); i++) {
141 XMoveWindow(x11->disp,sc->col[i].wd.self,X,th+Y);
142 XResizeWindow(x11->disp,sc->col[i].wd.self,Dx,Dy);
150 static int col_comp(const void *c1,const void *c2)
156 x1=&(((t_col *)c1)->xc);
157 x2=&(((t_col *)c2)->xc);
159 /* sort on intensity */
160 diff=(x1->red+x1->green+x1->blue)-(x2->red+x2->green+x2->blue);
163 if ((dr=(x1->red-x2->red)) != 0)
165 if ((dg=(x1->green-x2->green)) != 0)
167 return x1->blue-x2->blue;
173 static void read_col(t_x11 *x11,t_sc *sc,char *rgb)
176 char buf[STRLEN],name[STRLEN],*dummy;
182 if ((fp=fopen(rgb,"r"))==NULL) {
188 if (fscanf(fp,"%d%d%d",&r,&g,&b)==3) {
189 dummy=fgets2(buf,STRLEN-1,fp);
192 /* Filter out colours with names of two words */
193 sscanf(buf,"%s",name);
194 /* Filter out duplicate colours (grey and gray) */
195 if (strstr(name,"gray")==0) {
196 if (XAllocNamedColor(x11->disp,x11->cmap,name,&xc,&exact)) {
197 srenew(sc->col,++sc->ncol);
198 sc->col[sc->ncol-1].xc=xc;
200 printf("color %3d: %s\n",sc->ncol,buf);
202 InitWin(&(sc->col[sc->ncol-1].wd),0,0,1,1,0,name);
210 qsort(sc->col,sc->ncol,sizeof(sc->col[0]),col_comp);
211 /* Now filter out doubles */
213 for(i=1,j=0; (i<sc->ncol); i++) {
214 if ((cols[i].xc.red != cols[j].xc.red) ||
215 (cols[i].xc.green != cols[j].xc.green) ||
216 (cols[i].xc.blue != cols[j].xc.blue)) {
224 static t_sc *init_sc(t_x11 *x11,Window Parent,char *rgb)
231 InitWin(&sc->wd,0,0,400,300,1,"Show Colours");
232 sc->wd.self=XCreateSimpleWindow(x11->disp,Parent,sc->wd.x,sc->wd.y,
233 sc->wd.width,sc->wd.height,
234 sc->wd.bwidth,WHITE,BLACK);
235 x11->RegisterCallback(x11,sc->wd.self,Parent,scCallBack,sc);
236 x11->SetInputMask(x11,sc->wd.self,ButtonPressMask | ExposureMask |
237 StructureNotifyMask);
238 InitWin(&sc->but,0,0,sc->wd.width-2,XTextHeight(x11->font)+2,1,"Quit");
239 sc->but.self=XCreateSimpleWindow(x11->disp,sc->wd.self,sc->but.x,sc->but.y,
240 sc->but.width,sc->but.height,
241 sc->but.bwidth,BLACK,BLACK);
242 x11->RegisterCallback(x11,sc->but.self,sc->but.self,BCallBack,sc);
243 x11->SetInputMask(x11,sc->but.self,ButtonPressMask | ExposureMask |
244 StructureNotifyMask | EnterWindowMask |
247 read_col(x11,sc,rgb);
248 fprintf(stderr,"%d colors found\n",sc->ncol);
249 fprintf(stderr,"%6s%6s%6s\t\t%-20s\n","Red","Green","Blue","name");
250 for(i=0; (i<sc->ncol); i++) {
251 sc->col[i].wd.self=w=XCreateSimpleWindow(x11->disp,sc->wd.self,0,0,1,1,0,
252 BLACK,sc->col[i].xc.pixel);
253 x11->RegisterCallback(x11,w,sc->wd.self,ColCallBack,&(sc->col[i]));
254 x11->SetInputMask(x11,w,ButtonPressMask);
261 main(int argc, char *argv[])
267 x11=GetX11(&argc,argv);
271 fn="/usr/lib/X11/rgb.txt";
272 if (!gmx_fexist(fn)) {
273 fprintf(stderr,"Usage: %s rgb.txt\n",argv[0]);
274 fprintf(stderr,"rgb.txt is usually somewhere in your X windows directories.\n");
277 sc=init_sc(x11,x11->root,fn);
278 XMapWindow(x11->disp,sc->wd.self);
279 XMapSubwindows(x11->disp,sc->wd.self);