comparison src/video/photon/SDL_ph_wm.c @ 315:3333b6e68289

Date: Sat, 23 Mar 2002 13:53:37 +0200 From: "Mike Gorchak" <mike@malva.ua> Subject: Big QNX patch again. Added 8bit palette emulation code for window mode with bpp>=15. Added store/restore original palette for 8bit modes. Added more information about photon API call fails. Rewroten change palette code, slow but works. Fixed bug with set caption before window was inited. Fixed bugs with some initial state of variables. Fixed bug with storing old video mode settings. Fixed bug with switching to fullscreen mode and back. Fixed few double SEGFAULTS during parachute mode. Removed compilation warning with no PgWaitHWIdle prototype. Removed pack of dead unusable code. Cleanups SDL_PrivateVideoData structure, some headers. Some code formatting.
author Sam Lantinga <slouken@libsdl.org>
date Sat, 23 Mar 2002 20:19:44 +0000
parents f6ffac90895c
children 8e3ce997621c
comparison
equal deleted inserted replaced
314:bff64eba7721 315:3333b6e68289
46 /* This is necessary for working properly with Enlightenment, etc. */ 46 /* This is necessary for working properly with Enlightenment, etc. */
47 #define USE_ICON_WINDOW 47 #define USE_ICON_WINDOW
48 48
49 void ph_SetIcon(_THIS, SDL_Surface *icon, Uint8 *mask) 49 void ph_SetIcon(_THIS, SDL_Surface *icon, Uint8 *mask)
50 { 50 {
51 51 return;
52 #if 0 /*big*/
53 int ncolors;
54 PhImage_t *image;
55 PgColor_t* palette;
56
57 image = PhCreateImage( image,
58 icon->w,
59 icon->h,
60 Pg_IMAGE_DIRECT_888,
61 NULL, 0, 0 );
62
63 /* ---------------------------------------- */
64 SDL_Surface *sicon;
65 // XWMHints *wmhints;
66 // XImage *icon_image;
67 // Pixmap icon_pixmap;
68 // Pixmap mask_pixmap;
69 // GC GC;
70 // XGCValues GCvalues;
71 int i, b, dbpp;
72 SDL_Rect bounds;
73 Uint8 *LSBmask, *color_tried;
74 Visual *dvis;
75
76 /* Lock the event thread, in multi-threading environments */
77 SDL_Lock_EventThread();
78
79 /* The icon must use the default visual, depth and colormap of the
80 screen, so it might need a conversion */
81 // ? dbpp = DefaultDepth(SDL_Display, SDL_Screen);
82 switch(dbpp) {
83 case 15:
84 dbpp = 16; break;
85 case 24:
86 dbpp = 32; break;
87 }
88 dvis = DefaultVisual(SDL_Display, SDL_Screen);
89
90 /* The Visual struct is supposed to be opaque but we cheat a little */
91 sicon = SDL_CreateRGBSurface(SDL_SWSURFACE, icon->w, icon->h,
92 dbpp,
93 dvis->red_mask, dvis->green_mask,
94 dvis->blue_mask, 0);
95
96 if ( sicon == NULL ) {
97 goto done;
98 }
99 /* If we already have allocated colours from the default colormap,
100 copy them */
101 if(SDL_Visual == dvis && SDL_XColorMap == SDL_DisplayColormap
102 && this->screen->format->palette && sicon->format->palette) {
103 memcpy(sicon->format->palette->colors,
104 this->screen->format->palette->colors,
105 this->screen->format->palette->ncolors * sizeof(SDL_Color));
106 }
107
108 bounds.x = 0;
109 bounds.y = 0;
110 bounds.w = icon->w;
111 bounds.h = icon->h;
112 if ( SDL_LowerBlit(icon, &bounds, sicon, &bounds) < 0 )
113 goto done;
114
115 /* Lock down the colors used in the colormap */
116 color_tried = NULL;
117 if ( sicon->format->BitsPerPixel == 8 ) {
118 SDL_Palette *palette;
119 Uint8 *p;
120 XColor wanted;
121
122 palette = sicon->format->palette;
123 color_tried = malloc(palette->ncolors);
124 if ( color_tried == NULL ) {
125 goto done;
126 }
127 if ( SDL_iconcolors != NULL ) {
128 free(SDL_iconcolors);
129 }
130 SDL_iconcolors = malloc(palette->ncolors
131 * sizeof(*SDL_iconcolors));
132 if ( SDL_iconcolors == NULL ) {
133 free(color_tried);
134 goto done;
135 }
136 memset(color_tried, 0, palette->ncolors);
137 memset(SDL_iconcolors, 0,
138 palette->ncolors * sizeof(*SDL_iconcolors));
139
140 p = (Uint8 *)sicon->pixels;
141 for ( i = sicon->w*sicon->h; i > 0; --i, ++p ) {
142 if ( ! color_tried[*p] ) {
143 wanted.pixel = *p;
144 wanted.red = (palette->colors[*p].r<<8);
145 wanted.green = (palette->colors[*p].g<<8);
146 wanted.blue = (palette->colors[*p].b<<8);
147 wanted.flags = (DoRed|DoGreen|DoBlue);
148 if (XAllocColor(SDL_Display,
149 SDL_DisplayColormap, &wanted)) {
150 ++SDL_iconcolors[wanted.pixel];
151 }
152 color_tried[*p] = 1;
153 }
154 }
155 }
156 if ( color_tried != NULL ) {
157 free(color_tried);
158 }
159
160 /* Translate mask data to LSB order and set the icon mask */
161 i = (sicon->w/8)*sicon->h;
162 LSBmask = (Uint8 *)malloc(i);
163 if ( LSBmask == NULL ) {
164 goto done;
165 }
166 memset(LSBmask, 0, i);
167 while ( --i >= 0 ) {
168 for ( b=0; b<8; ++b )
169 LSBmask[i] |= (((mask[i]>>b)&0x01)<<(7-b));
170 }
171 mask_pixmap = XCreatePixmapFromBitmapData(SDL_Display, WMwindow,
172 LSBmask, sicon->w, sicon->h, 1L, 0L, 1);
173
174 /* Transfer the image to an X11 pixmap */
175 icon_image = XCreateImage(SDL_Display,
176 DefaultVisual(SDL_Display, SDL_Screen),
177 DefaultDepth(SDL_Display, SDL_Screen),
178 ZPixmap, 0, (char *)sicon->pixels, sicon->w, sicon->h,
179 ((sicon->format)->BytesPerPixel == 3) ? 32 :
180 (sicon->format)->BytesPerPixel*8, 0);
181 icon_pixmap = XCreatePixmap(SDL_Display, SDL_Root, sicon->w, sicon->h,
182 DefaultDepth(SDL_Display, SDL_Screen));
183 GC = XCreateGC(SDL_Display, icon_pixmap, 0, &GCvalues);
184 XPutImage(SDL_Display, icon_pixmap, GC, icon_image,
185 0, 0, 0, 0, sicon->w, sicon->h);
186 XFreeGC(SDL_Display, GC);
187 XDestroyImage(icon_image);
188 free(LSBmask);
189 sicon->pixels = NULL;
190
191 #ifdef USE_ICON_WINDOW
192 /* Create an icon window and set the pixmap as its background */
193 icon_window = XCreateSimpleWindow(SDL_Display, SDL_Root,
194 0, 0, sicon->w, sicon->h, 0,
195 CopyFromParent, CopyFromParent);
196 XSetWindowBackgroundPixmap(SDL_Display, icon_window, icon_pixmap);
197 XClearWindow(SDL_Display, icon_window);
198 #endif
199
200 /* Set the window icon to the icon pixmap (and icon window) */
201 wmhints = XAllocWMHints();
202 wmhints->flags = (IconPixmapHint | IconMaskHint);
203 wmhints->icon_pixmap = icon_pixmap;
204 wmhints->icon_mask = mask_pixmap;
205 #ifdef USE_ICON_WINDOW
206 wmhints->flags |= IconWindowHint;
207 wmhints->icon_window = icon_window;
208 #endif
209 XSetWMHints(SDL_Display, WMwindow, wmhints);
210 XFree(wmhints);
211 XSync(SDL_Display, False);
212
213 done:
214 SDL_Unlock_EventThread();
215 if ( sicon != NULL ) {
216 SDL_FreeSurface(sicon);
217 }
218
219 #endif /*big*/
220 return;
221 } 52 }
222 53
223 /* Set window caption */ 54 /* Set window caption */
224 void ph_SetCaption(_THIS, const char *title, const char *icon) 55 void ph_SetCaption(_THIS, const char *title, const char *icon)
225 { 56 {
226 SDL_Lock_EventThread(); 57 SDL_Lock_EventThread();
227 if ( title != NULL ) { 58
228 PtSetResource(window, Pt_ARG_WINDOW_TITLE, title, 0); 59 /* check for set caption call before window init */
229 } 60 if (window!=NULL)
230 SDL_Unlock_EventThread(); 61 {
62 PtSetResource(window, Pt_ARG_WINDOW_TITLE, title, 0);
63 }
64 else
65 {
66 captionflag=1;
67 }
68
69 SDL_Unlock_EventThread();
231 } 70 }
232 71
233 /* Iconify current window */ 72 /* Iconify current window */
234 int ph_IconifyWindow(_THIS) 73 int ph_IconifyWindow(_THIS)
235 { 74 {
236 PhWindowEvent_t windowevent; 75 PhWindowEvent_t windowevent;
237 76
238 SDL_Lock_EventThread(); 77 SDL_Lock_EventThread();
239 memset( &windowevent, 0, sizeof (event) ); 78
240 windowevent.event_f = Ph_WM_HIDE; 79 memset( &windowevent, 0, sizeof (event) );
241 windowevent.event_state = Ph_WM_EVSTATE_HIDE; 80 windowevent.event_f = Ph_WM_HIDE;
242 windowevent.rid = PtWidgetRid( window ); 81 windowevent.event_state = Ph_WM_EVSTATE_HIDE;
243 PtForwardWindowEvent( &windowevent ); 82 windowevent.rid = PtWidgetRid( window );
244 SDL_Unlock_EventThread(); 83 PtForwardWindowEvent( &windowevent );
245 84 SDL_Unlock_EventThread();
246 return 0; 85
86 return 0;
247 } 87 }
248 88
249 SDL_GrabMode ph_GrabInputNoLock(_THIS, SDL_GrabMode mode) 89 SDL_GrabMode ph_GrabInputNoLock(_THIS, SDL_GrabMode mode)
250 { 90 {
251 return(mode); 91 return(mode);
252 } 92 }
253 93
254 SDL_GrabMode ph_GrabInput(_THIS, SDL_GrabMode mode) 94 SDL_GrabMode ph_GrabInput(_THIS, SDL_GrabMode mode)
255 { 95 {
256 short abs_x, abs_y; 96 short abs_x, abs_y;
278 return(mode); 118 return(mode);
279 } 119 }
280 120
281 int ph_GetWMInfo(_THIS, SDL_SysWMinfo *info) 121 int ph_GetWMInfo(_THIS, SDL_SysWMinfo *info)
282 { 122 {
283 if (info->version.major <= SDL_MAJOR_VERSION) 123 if (info->version.major <= SDL_MAJOR_VERSION)
284 { 124 {
285 return 1; 125 return 1;
286 } 126 }
287 else 127 else
288 { 128 {
289 SDL_SetError("Application not compiled with SDL %d.%d\n", 129 SDL_SetError("Application not compiled with SDL %d.%d\n",
290 SDL_MAJOR_VERSION, SDL_MINOR_VERSION); 130 SDL_MAJOR_VERSION, SDL_MINOR_VERSION);
291 return -1; 131 return -1;
292 } 132 }
293 } 133 }