5 #include <Xw_Extension.h>
7 #ifdef HAVE_X11_EXTENSIONS_MULTIBUF_H
8 # include <X11/extensions/multibuf.h>
11 /* ifdef then trace on */
13 #define TRACE_OPEN_PIXMAP
14 #define TRACE_OPEN_BACKGROUND_PIXMAP
15 #define TRACE_CLOSE_PIXMAP
16 #define TRACE_CLOSE_BACKGROUND_PIXMAP
20 XW_STATUS Xw_open_pixmap (awindow)
21 XW_EXT_WINDOW *awindow
23 Open a DoubleBuffer PIXMAP depending of the Window size
25 returns ERROR if NO More PIXMAP is available on this Window
26 returns SUCCESS if successful
28 XW_STATUS Xw_open_background_pixmap (awindow)
29 XW_EXT_WINDOW *awindow
31 Open a Background PIXMAP depending of the Window size
33 returns ERROR if NO More PIXMAP is available on this Window
34 returns SUCCESS if successful
36 XW_STATUS Xw_close_pixmap (awindow)
37 XW_EXT_WINDOW *awindow
39 Close the DoubleBuffer PIXMAP attached to this Window
41 returns ERROR if NO More PIXMAP exist
42 returns SUCCESS if successful
44 XW_STATUS Xw_close_background_pixmap (awindow)
45 XW_EXT_WINDOW *awindow
47 Close the Background PIXMAP attached to this Window
49 returns ERROR if NO More PIXMAP exist
50 returns SUCCESS if successful
53 static char SetDoubleBuffer = '\0' ;
56 XW_STATUS Xw_open_pixmap (void *awindow)
58 XW_STATUS Xw_open_pixmap (awindow)
60 #endif /*XW_PROTOTYPE*/
62 XW_EXT_WINDOW *pwindow = (XW_EXT_WINDOW*)awindow;
63 XW_EXT_DISPLAY *pdisplay = pwindow->connexion;
66 XW_STATUS status = XW_ERROR;
68 if( !Xw_isdefine_window(pwindow) ) {
69 /*ERROR*Bad EXT_WINDOW Address*/
70 Xw_set_error(24,"Xw_open_pixmap",pwindow) ;
74 if( SetDoubleBuffer == '\0' ) {
75 SetDoubleBuffer = 'U' ;
76 if( Xw_get_env("Xw_SET_DOUBLE_BUFFER",svalue,sizeof(svalue)) ) {
77 if( strlen(svalue) ) {
78 SetDoubleBuffer = svalue[0] ;
80 printf(" Xw_SET_DOUBLE_BUFFER is '%c'\n",SetDoubleBuffer) ;
84 if( (SetDoubleBuffer == 'B') &&
85 (pdisplay->server == XW_SERVER_IS_SUN) && (_DEPTH != 24) ) {
86 SetDoubleBuffer = 'P'; /* BUG sur SUN */
87 /*WARNING*MultiBufferingExtension is not accessible here*/
88 Xw_set_error(126,"Xw_open_pixmap",pwindow) ;
91 #ifndef HAVE_X11_EXTENSIONS_MULTIBUF_H
92 if( SetDoubleBuffer == 'B' ) {
93 SetDoubleBuffer = 'P'; /* MULTIBUF unavailable under SGI IRIX 6.5 */
94 /*WARNING*MultiBufferingExtension is not accessible here*/
95 Xw_set_error(126,"Xw_open_pixmap",pwindow) ;
98 if( SetDoubleBuffer == 'B' ) {
99 if( _NWBUFFER == 0 ) {
100 int mOptCode,fEvent,fError,maxmono,maxstereo ;
101 XmbufBufferInfo *pmono,*pstereo ;
102 if( XQueryExtension(_DISPLAY,"Multi-Buffering",
103 &mOptCode,&fEvent,&fError) &&
104 XmbufGetScreenInfo(_DISPLAY,_WINDOW,
105 &maxmono,&pmono,&maxstereo,&pstereo) ) {
106 _NWBUFFER = XmbufCreateBuffers(_DISPLAY,_WINDOW,2,
107 MultibufferUpdateActionUntouched,
108 MultibufferUpdateHintFrequent,
111 if( _NWBUFFER == 2 ) {
112 XFillRectangle(_DISPLAY,_BWBUFFER,pwindow->qgwind.gcclear,
113 0,0,_WIDTH,_HEIGHT) ;
115 if( _NWBUFFER > 0 ) XmbufDestroyBuffers(_DISPLAY,_WINDOW) ;
120 SetDoubleBuffer = 'P';
121 /*WARNING*MultiBufferingExtension is not accessible here*/
122 Xw_set_error(126,"Xw_open_pixmap",pwindow) ;
127 if( (SetDoubleBuffer == 'U') ||
128 (SetDoubleBuffer == 'Y') ||
129 (SetDoubleBuffer == 'P') ) {
132 if( !Xw_get_trace() ) Xw_set_synchronize(_DISPLAY,True) ;
133 _PIXMAP = XCreatePixmap(_DISPLAY,_WINDOW,_WIDTH,_HEIGHT,_DEPTH) ;
134 if( !Xw_get_trace() ) Xw_set_synchronize(_DISPLAY,False) ;
136 Xw_get_error(&error,&gravity);
137 if( _PIXMAP && (error < 1000) ) {
138 XFillRectangle(_DISPLAY,_PIXMAP,pwindow->qgwind.gcclear,
139 0,0,_WIDTH,_HEIGHT) ;
141 /*ERROR*DISABLE Double Buffer*/
143 Xw_set_error(71,"Xw_open_pixmap",0) ;
148 if( _PIXMAP || _NWBUFFER ) status = XW_SUCCESS;
150 #ifdef TRACE_OPEN_PIXMAP
151 if( Xw_get_trace() ) {
152 printf(" %d = Xw_open_pixmap(%lx)\n",status,(long ) pwindow) ;
160 XW_STATUS Xw_close_pixmap (void *awindow)
162 XW_STATUS Xw_close_pixmap (awindow)
164 #endif /*XW_PROTOTYPE*/
166 XW_EXT_WINDOW *pwindow = (XW_EXT_WINDOW*)awindow;
168 if( !Xw_isdefine_window(pwindow) ) {
169 /*ERROR*Bad EXT_WINDOW Address*/
170 Xw_set_error(24,"Xw_open_pixmap",pwindow) ;
174 #ifdef HAVE_X11_EXTENSIONS_MULTIBUF_H
175 if( _NWBUFFER > 0 ) XmbufDestroyBuffers(_DISPLAY,_WINDOW) ;
177 if( _PIXMAP ) XFreePixmap(_DISPLAY,_PIXMAP) ;
183 _DRAWABLE = _WINDOW ;
185 #ifdef TRACE_CLOSE_PIXMAP
186 if( Xw_get_trace() ) {
187 printf(" Xw_close_pixmap(%lx)\n",(long ) pwindow) ;
195 XW_STATUS Xw_open_background_pixmap (void *awindow)
197 XW_STATUS Xw_open_background_pixmap (awindow)
199 #endif /*XW_PROTOTYPE*/
201 XW_EXT_WINDOW *pwindow = (XW_EXT_WINDOW*)awindow;
204 if( !Xw_isdefine_window(pwindow) ) {
205 /*ERROR*Bad EXT_WINDOW Address*/
206 Xw_set_error(24,"Xw_open_background_pixmap",pwindow) ;
210 if( _BPIXMAP ) Xw_close_background_pixmap(awindow) ;
213 if( !Xw_get_trace() ) Xw_set_synchronize(_DISPLAY,True) ;
214 _BPIXMAP = XCreatePixmap(_DISPLAY,_WINDOW,_WIDTH,_HEIGHT,_DEPTH) ;
215 if( !Xw_get_trace() ) Xw_set_synchronize(_DISPLAY,False) ;
217 Xw_get_error(&error,&gravity);
218 if( !_BPIXMAP || (error >= 1000) ) {
219 /*ERROR*DISABLE Double Buffer*/
221 Xw_set_error(71,"Xw_open_background_pixmap",0) ;
225 XFillRectangle(_DISPLAY,_BPIXMAP,pwindow->qgwind.gcclear,0,0,_WIDTH,_HEIGHT);
227 #ifdef TRACE_OPEN_BACKGROUND_PIXMAP
228 if( Xw_get_trace() ) {
229 printf(" Xw_open_background_pixmap(%lx)\n",(long ) pwindow) ;
237 XW_STATUS Xw_close_background_pixmap (void *awindow)
239 XW_STATUS Xw_close_background_pixmap (awindow)
241 #endif /*XW_PROTOTYPE*/
243 XW_EXT_WINDOW *pwindow = (XW_EXT_WINDOW*)awindow;
245 if( !Xw_isdefine_window(pwindow) ) {
246 /*ERROR*Bad EXT_WINDOW Address*/
247 Xw_set_error(24,"Xw_close_background_pixmap",pwindow) ;
252 XFreePixmap(_DISPLAY,_BPIXMAP) ;
259 #ifdef TRACE_CLOSE_BACKGROUND_PIXMAP
260 if( Xw_get_trace() ) {
261 printf(" Xw_close_background_pixmap(%lx)\n",(long ) pwindow) ;
264 return (XW_SUCCESS) ;