Remove unnecessary config.h includes
[alexxy/gromacs.git] / src / programs / view / logo.cpp
1 /*
2  * This file is part of the GROMACS molecular simulation package.
3  *
4  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
5  * Copyright (c) 2001-2013, The GROMACS development team.
6  * Copyright (c) 2013,2014, by the GROMACS development team, led by
7  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
8  * and including many others, as listed in the AUTHORS file in the
9  * top-level source directory and at http://www.gromacs.org.
10  *
11  * GROMACS is free software; you can redistribute it and/or
12  * modify it under the terms of the GNU Lesser General Public License
13  * as published by the Free Software Foundation; either version 2.1
14  * of the License, or (at your option) any later version.
15  *
16  * GROMACS is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
19  * Lesser General Public License for more details.
20  *
21  * You should have received a copy of the GNU Lesser General Public
22  * License along with GROMACS; if not, see
23  * http://www.gnu.org/licenses, or write to the Free Software Foundation,
24  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA.
25  *
26  * If you want to redistribute modifications to GROMACS, please
27  * consider that scientific software is very special. Version
28  * control is crucial - bugs must be traceable. We will be happy to
29  * consider code for inclusion in the official distribution, but
30  * derived work must not be called official GROMACS. Details are found
31  * in the README & COPYING files - if they are missing, get the
32  * official version at http://www.gromacs.org.
33  *
34  * To help us fund GROMACS development, we humbly ask that you cite
35  * the research papers on the package. Check out http://www.gromacs.org.
36  */
37 #include "gmxpre.h"
38
39 #include <stdlib.h>
40
41 #include "gromacs/legacyheaders/macros.h"
42 #include "xutil.h"
43 #include "Xstuff.h"
44 #include "gromacs/legacyheaders/copyrite.h"
45 #include "logo.h"
46
47 #include "gromacs/utility/real.h"
48 #include "gromacs/utility/smalloc.h"
49
50 typedef struct {
51     int            x, y, rad;
52     unsigned long *col;
53 } t_circle;
54
55 typedef struct {
56     const char  *text;
57     int          y, h;
58     XFontStruct *fnt;
59 } t_mess;
60
61 void show_logo(t_x11 *x11, t_logo *logo)
62 {
63     XMapWindow(x11->disp, logo->wd.self);
64     XMapSubwindows(x11->disp, logo->wd.self);
65 }
66
67 void hide_logo(t_x11 *x11, t_logo *logo)
68 {
69     XUnmapWindow(x11->disp, logo->wd.self);
70 }
71
72 static bool LogoCallBack(t_x11 *x11, XEvent *event, Window /*w*/, void *data)
73 {
74     /* Assume window is 100x110 */
75     static bool bFirst = true;
76 #define CSIZE 9
77 #define NSIZE 8
78 #define OSIZE 9
79 #define HSIZE 7
80 #define YOFFS 30
81     static t_circle c[] = {
82         { 10, YOFFS+12, CSIZE, &LIGHTGREEN },
83         { 20, YOFFS+22, CSIZE, &LIGHTGREEN },
84         { 20, YOFFS+34, OSIZE, &LIGHTRED   },
85         { 30, YOFFS+12, NSIZE, &LIGHTCYAN  },
86         { 30, YOFFS+ 2, HSIZE, &WHITE     },
87         { 40, YOFFS+22, CSIZE, &LIGHTGREEN },
88         { 40, YOFFS+34, CSIZE, &LIGHTGREEN },
89         { 50, YOFFS+12, CSIZE, &LIGHTGREEN },
90         { 50, YOFFS,    OSIZE, &LIGHTRED   },
91         { 60, YOFFS+22, NSIZE, &LIGHTCYAN  },
92         { 60, YOFFS+32, HSIZE, &WHITE     },
93         { 70, YOFFS+12, CSIZE, &LIGHTGREEN },
94         { 80, YOFFS+22, CSIZE, &LIGHTGREEN },
95         { 80, YOFFS+34, OSIZE, &LIGHTRED   },
96         { 90, YOFFS+12, NSIZE, &LIGHTCYAN  },
97         { 90, YOFFS+ 2, HSIZE, &WHITE      },
98         {100, YOFFS+22, CSIZE, &LIGHTGREEN }
99     };
100     static int      lines[] = {
101         0, 1, 1, 2, 1, 3, 3, 4, 3, 5, 5, 6, 5, 7, 7, 8, 7, 9,
102         9, 10, 9, 11, 11, 12, 12, 13, 12, 14, 14, 15, 14, 16
103     };
104 #define COFFS 70
105     static t_mess   Mess[] = {
106         { "GROMACS",                         0,       20, NULL },
107         { NULL,                             16,        9, NULL },
108         { "Copyright (c) 1991-2013",        COFFS+ 2,  9, NULL },
109         { "D.v.d.Spoel, E.Lindahl, B.Hess", COFFS+11,  9, NULL },
110         { "& Groningen University ",        COFFS+20,  9, NULL },
111         { "click to dismiss",               COFFS+31,  8, NULL }
112     };
113 #define NMESS asize(Mess)
114     int             i;
115     t_logo         *logo;
116     t_windata      *wd;
117
118     logo = (t_logo *)data;
119     wd   = &(logo->wd);
120     if (bFirst)
121     {
122         const real wfac = wd->width/110.0;
123         const real hfac = wd->height/110.0;
124         for (i = 0; (i < asize(c)); i++)
125         {
126             c[i].x *= wfac;
127             c[i].y *= hfac;
128         }
129         Mess[1].text = GromacsVersion();
130         for (i = 0; (i < NMESS); i++)
131         {
132             Mess[i].y  *= hfac;
133             Mess[i].h  *= hfac;
134             Mess[i].fnt = (i == 0) ? logo->bigfont : (i == NMESS-1) ? x11->font :
135                 logo->smallfont;
136         }
137         bFirst = false;
138     }
139     switch (event->type)
140     {
141         case Expose:
142             XSetForeground(x11->disp, x11->gc, WHITE);
143             XSetLineAttributes(x11->disp, x11->gc, 3, LineSolid, CapNotLast, JoinRound);
144             for (i = 0; (i < asize(lines)); i += 2)
145             {
146                 XDrawLine(x11->disp, wd->self, x11->gc,
147                           c[lines[i]].x, c[lines[i]].y, c[lines[i+1]].x, c[lines[i+1]].y);
148             }
149             XSetLineAttributes(x11->disp, x11->gc, 1, LineSolid, CapNotLast, JoinRound);
150             for (i = 0; (i < asize(c)); i++)
151             {
152                 XSetForeground(x11->disp, x11->gc, *(c[i].col));
153                 XFillCircle(x11->disp, wd->self, x11->gc, c[i].x, c[i].y, c[i].rad);
154             }
155             XSetForeground(x11->disp, x11->gc, BLACK);
156             XDrawRectangle(x11->disp, wd->self, x11->gc, 2, 2, wd->width-5, wd->height-5);
157             for (i = 0; (i < NMESS); i++)
158             {
159                 SpecialTextInRect(x11, Mess[i].fnt, wd->self, Mess[i].text,
160                                   0, Mess[i].y, wd->width, Mess[i].h,
161                                   eXCenter, eYCenter);
162             }
163             XSetForeground(x11->disp, x11->gc, x11->fg);
164             break;
165         case ButtonPress:
166             hide_logo(x11, logo);
167             return logo->bQuitOnClick;
168             break;
169         default:
170             break;
171     }
172
173     return false;
174 }
175
176 t_logo *init_logo(t_x11 *x11, Window parent, bool bQuitOnClick)
177 {
178     static const char *bfname[] = {
179         "-b&h-lucida-bold-i-normal-sans-34-240-100-100-p-215-iso8859-1",
180         "-b&h-lucida-bold-i-normal-sans-26-190-100-100-p-166-iso8859-1",
181         "lucidasans-bolditalic-24",
182         "lucidasans-italic-24",
183         "10x20",
184         "fixed"
185     };
186 #define NBF asize(bfname)
187     static const char *sfname[] = {
188         "lucidasans-bold-18",
189         "10x20",
190         "fixed"
191     };
192 #define NSF asize(sfname)
193     unsigned int       i;
194     unsigned long      bg;
195     char              *newcol;
196     t_logo            *logo;
197
198     snew(logo, 1);
199     logo->bQuitOnClick = bQuitOnClick;
200     InitWin(&logo->wd, 0, 0, 360, 270, 1, "GROMACS");
201     bg = LIGHTGREY;
202     if ((newcol = getenv("GMX_LOGO_COLOR")) != NULL)
203     {
204         GetNamedColor(x11, newcol, &bg);
205     }
206     logo->wd.self = XCreateSimpleWindow(x11->disp, parent,
207                                         logo->wd.x, logo->wd.y,
208                                         logo->wd.width, logo->wd.height,
209                                         logo->wd.bwidth, WHITE, bg);
210     for (i = 0, logo->bigfont = NULL; (i < NBF); i++)
211     {
212         if ((logo->bigfont = XLoadQueryFont(x11->disp, bfname[i])) != NULL)
213         {
214             break;
215         }
216     }
217     if (i == NBF)
218     {
219         perror(bfname[i-1]);
220         exit(1);
221     }
222 #ifdef DEBUG
223     fprintf(stderr, "Big Logofont: %s\n", bfname[i]);
224 #endif
225     for (i = 0, logo->smallfont = NULL; (i < NSF); i++)
226     {
227         if ((logo->smallfont = XLoadQueryFont(x11->disp, sfname[i])) != NULL)
228         {
229             break;
230         }
231     }
232     if (i == NSF)
233     {
234         perror(sfname[i-1]);
235         exit(1);
236     }
237 #ifdef DEBUG
238     fprintf(stderr, "Small Logofont: %s\n", sfname[i]);
239 #endif
240     x11->RegisterCallback(x11, logo->wd.self, parent, LogoCallBack, logo);
241     x11->SetInputMask(x11, logo->wd.self, ButtonPressMask | ExposureMask);
242
243     return logo;
244 }
245
246 void done_logo(t_x11 *x11, t_logo *logo)
247 {
248     x11->UnRegisterCallback(x11, logo->wd.self);
249 }