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-2013, The GROMACS development team.
6 * Copyright (c) 2013,2014,2015, 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.
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.
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.
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.
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.
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.
46 #include "gromacs/utility/cstringutil.h"
47 #include "gromacs/utility/smalloc.h"
52 #include "stop_ani.bm"
56 static void move_bbox(t_x11
*x11
, t_butbox
*bbox
)
60 real idb
, bh
, one
= 1.0;
63 bw
= std::max(1, bbox
->wd
.width
-2*(AIR
+BORDER
));
65 bh
= (bbox
->wd
.height
-AIR
*(bbox
->nbut
+1));
67 bh
= std::max(bh
, one
);
71 for (i
= 0; (i
< bbox
->nbut
); i
++)
73 wd
= &(bbox
->b
[i
].wd
);
77 XMoveWindow(x11
->disp
, wd
->self
, x0
, y0
);
78 XResizeWindow(x11
->disp
, wd
->self
, wd
->width
, wd
->height
);
83 static bool BBCallBack(t_x11
*x11
, XEvent
*event
, Window
/*w*/, void *data
)
87 if (event
->type
== ConfigureNotify
)
89 bbox
= (t_butbox
*)data
;
90 bbox
->wd
.width
= event
->xconfigure
.width
;
91 bbox
->wd
.height
= event
->xconfigure
.height
;
97 static bool VBCallBack(t_x11
*x11
, XEvent
*event
, Window
/*w*/, void *data
)
102 if (event
->type
== Expose
)
104 vbox
= (t_butbox
*)data
;
105 y0
= XTextHeight(x11
->font
)+2*AIR
+1;
106 XSetForeground(x11
->disp
, x11
->gc
, WHITE
);
107 XClearArea(x11
->disp
, vbox
->wd
.self
, 1, 1, vbox
->wd
.width
-2, y0
-1, False
);
108 TextInRect(x11
, vbox
->wd
.self
, vbox
->wd
.text
,
109 1, 1, vbox
->wd
.width
-2, y0
-1, eXLeft
, eYCenter
);
110 XDrawLine(x11
->disp
, vbox
->wd
.self
, x11
->gc
, 0, y0
, vbox
->wd
.width
, y0
);
111 XSetForeground(x11
->disp
, x11
->gc
, x11
->fg
);
116 void set_vbtime(t_x11
*x11
, t_butbox
*vbox
, char *text
)
118 sfree(vbox
->wd
.text
);
119 vbox
->wd
.text
= gmx_strdup(text
);
120 ExposeWin(x11
->disp
, vbox
->wd
.self
);
123 static bool ButtonCallBack(t_x11
*x11
, XEvent
*event
, Window
/*w*/, void *data
)
129 but
= (t_mwbut
*)data
;
134 XSetForeground(x11
->disp
, x11
->gc
, WHITE
);
135 XDrawRoundRect(x11
->disp
, wd
->self
, x11
->gc
,
136 0, 0, wd
->width
-1, wd
->height
-1);
137 TextInWin(x11
, wd
, wd
->text
, eXCenter
, eYCenter
);
138 XSetForeground(x11
->disp
, x11
->gc
, x11
->fg
);
142 /* LightBorder(x11->disp,wd->self,WHITE);*/
143 XSetForeground(x11
->disp
, x11
->gc
, WHITE
);
144 XDrawRoundRect(x11
->disp
, wd
->self
, x11
->gc
,
145 1, 1, wd
->width
-3, wd
->height
-3);
146 XSetForeground(x11
->disp
, x11
->gc
, x11
->fg
);
149 /* LightBorder(x11->disp,wd->self,BLUE);*/
150 XSetForeground(x11
->disp
, x11
->gc
, BLUE
);
151 XDrawRoundRect(x11
->disp
, wd
->self
, x11
->gc
,
152 1, 1, wd
->width
-3, wd
->height
-3);
153 XSetForeground(x11
->disp
, x11
->gc
, x11
->fg
);
158 letter
.type
= ClientMessage
;
159 letter
.xclient
.display
= x11
->disp
;
160 letter
.xclient
.window
= wd
->Parent
;
161 letter
.xclient
.message_type
= 0;
162 letter
.xclient
.format
= 32;
163 letter
.xclient
.data
.l
[0] = but
->ID
;
164 letter
.xclient
.data
.l
[1] = (long)event
->xbutton
.button
;
165 XSendEvent(x11
->disp
, wd
->Parent
, True
, 0, &letter
);
173 t_butbox
*init_vbox(t_x11
*x11
, Window Parent
, Window SendTo
, unsigned long fg
, unsigned long bg
)
181 vb
->nbut
= IDNR
-IDBUTNR
-1;
182 snew(vb
->b
, vb
->nbut
);
185 y0
= XTextHeight(x11
->font
)+2*AIR
+2;
186 InitWin(&vb
->wd
, 0, 0, vb
->nbut
*(play_width
+AIR
)+AIR
,
187 y0
+play_height
+2*AIR
, 1, "VCR - Control");
188 vb
->wd
.self
= XCreateSimpleWindow(x11
->disp
, Parent
,
189 vb
->wd
.x
, vb
->wd
.y
, vb
->wd
.width
, vb
->wd
.height
,
190 vb
->wd
.bwidth
, fg
, bg
);
191 x11
->RegisterCallback(x11
, vb
->wd
.self
, Parent
, VBCallBack
, vb
);
192 x11
->SetInputMask(x11
, vb
->wd
.self
, ExposureMask
);
196 for (i
= 0; (i
< vb
->nbut
); i
++)
202 data
= &(rewind_bits
[0]);
211 data
= stop_ani_bits
;
214 fprintf(stderr
, "Invalid bitmap in init_vbox %d\n", ID
);
217 /* Rely on the fact that all bitmaps are equal size */
218 pm
= XCreatePixmapFromBitmapData(x11
->disp
, x11
->root
,
219 (char *)data
, play_width
, play_height
,
220 BLACK
, LIGHTGREY
, x11
->depth
);
222 vb
->b
[i
].wd
.Parent
= SendTo
;
224 XCreateSimpleWindow(x11
->disp
, vb
->wd
.self
,
225 x
, y0
+AIR
, play_width
, play_height
, 0, WHITE
, BLACK
);
226 XSetWindowBackgroundPixmap(x11
->disp
, vb
->b
[i
].wd
.self
, pm
);
228 x11
->RegisterCallback(x11
, vb
->b
[i
].wd
.self
, vb
->wd
.self
,
229 ButtonCallBack
, &(vb
->b
[i
]));
230 x11
->SetInputMask(x11
, vb
->b
[i
].wd
.self
,
231 ButtonPressMask
| StructureNotifyMask
);
238 void show_but(t_x11
*x11
, t_butbox
*bbox
)
240 XMapWindow(x11
->disp
, bbox
->wd
.self
);
241 XMapSubwindows(x11
->disp
, bbox
->wd
.self
);
244 void hide_but(t_x11
*x11
, t_butbox
*bbox
)
246 XUnmapWindow(x11
->disp
, bbox
->wd
.self
);
247 XUnmapSubwindows(x11
->disp
, bbox
->wd
.self
);
250 t_butbox
*init_bbox(t_x11
*x11
, Window Parent
, Window SendTo
,
251 int width
, unsigned long fg
, unsigned long bg
)
254 static const char *lbut
[IDBUTNR
] = {
255 "< X-Rotate >", "< Y-Rotate >", "< Z-Rotate >",
256 "< X-Move >", "< Y-Move >", "< Z-Move >", "< Scale >",
263 bbox
->nbut
= IDBUTNR
;
264 snew(bbox
->b
, bbox
->nbut
);
265 y0
= XTextHeight(x11
->font
)+2*(AIR
+BORDER
);
267 InitWin(&(bbox
->wd
), 0, 0, /*width,(y0+AIR)*IDBUTNR+AIR+2*BORDER,*/ 1, 1,
269 width
-= 2*AIR
+2*BORDER
;
270 bbox
->wd
.self
= XCreateSimpleWindow(x11
->disp
, Parent
,
271 bbox
->wd
.x
, bbox
->wd
.y
, bbox
->wd
.width
,
272 bbox
->wd
.height
, bbox
->wd
.bwidth
,
274 x11
->RegisterCallback(x11
, bbox
->wd
.self
, Parent
, BBCallBack
, bbox
);
275 x11
->SetInputMask(x11
, bbox
->wd
.self
, StructureNotifyMask
);
277 DrawOn
= bbox
->wd
.self
;
279 for (i
= 0; (i
< bbox
->nbut
); i
++)
282 InitWin(&but
->wd
, AIR
, h0
, width
, y0
, 1, lbut
[i
]);
284 but
->wd
.Parent
= SendTo
;
286 but
->wd
.self
= XCreateSimpleWindow(x11
->disp
, DrawOn
,
287 but
->wd
.x
, but
->wd
.y
,
288 but
->wd
.width
, but
->wd
.height
,
289 but
->wd
.bwidth
, bg
, bg
);
290 x11
->RegisterCallback(x11
, but
->wd
.self
, DrawOn
, ButtonCallBack
, but
);
291 x11
->SetInputMask(x11
, but
->wd
.self
, ExposureMask
| ButtonPressMask
|
297 void done_bbox(t_x11
*x11
, t_butbox
*bbox
)
301 for (i
= 0; (i
< bbox
->nbut
); i
++)
303 x11
->UnRegisterCallback(x11
, bbox
->b
[i
].wd
.self
);
305 x11
->UnRegisterCallback(x11
, bbox
->wd
.self
);