ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/rxvt-unicode/src/background.C
(Generate patch)

Comparing rxvt-unicode/src/background.C (file contents):
Revision 1.248 by sf-exg, Sun Dec 30 11:34:43 2012 UTC vs.
Revision 1.255 by sf-exg, Mon Dec 31 12:05:34 2012 UTC

42 42
43bool 43bool
44rxvt_term::bg_window_size_sensitive () 44rxvt_term::bg_window_size_sensitive ()
45{ 45{
46# if BG_IMAGE_FROM_ROOT 46# if BG_IMAGE_FROM_ROOT
47 if (option (Opt_transparent)) 47 if (root_img)
48 return true; 48 return true;
49# endif 49# endif
50 50
51# if BG_IMAGE_FROM_FILE 51# if BG_IMAGE_FROM_FILE
52 if (fimage.img) 52 if (fimage.img)
63 63
64bool 64bool
65rxvt_term::bg_window_position_sensitive () 65rxvt_term::bg_window_position_sensitive ()
66{ 66{
67# if BG_IMAGE_FROM_ROOT 67# if BG_IMAGE_FROM_ROOT
68 if (option (Opt_transparent)) 68 if (root_img)
69 return true; 69 return true;
70# endif 70# endif
71 71
72# if BG_IMAGE_FROM_FILE 72# if BG_IMAGE_FROM_FILE
73 if (fimage.img) 73 if (fimage.img)
251 flags &= ~IM_IS_SIZE_SENSITIVE; 251 flags &= ~IM_IS_SIZE_SENSITIVE;
252 252
253 return changed; 253 return changed;
254} 254}
255 255
256void 256bool
257rxvt_term::get_image_geometry (rxvt_image &image, int &w, int &h, int &x, int &y) 257rxvt_term::render_image (rxvt_image &image)
258{ 258{
259 int image_width = image.img->w; 259 int image_width = image.img->w;
260 int image_height = image.img->h; 260 int image_height = image.img->h;
261 int parent_width = szHint.width; 261 int parent_width = szHint.width;
262 int parent_height = szHint.height; 262 int parent_height = szHint.height;
263 int h_scale = min (image.h_scale, 32767 * 100 / parent_width); 263 int h_scale = min (image.h_scale, 32767 * 100 / parent_width);
264 int v_scale = min (image.v_scale, 32767 * 100 / parent_height); 264 int v_scale = min (image.v_scale, 32767 * 100 / parent_height);
265 265
266 int w;
267 int h;
268 int x;
269 int y;
270
266 w = h_scale * parent_width / 100; 271 w = h_scale * parent_width / 100;
267 h = v_scale * parent_height / 100; 272 h = v_scale * parent_height / 100;
268 273
269 if (image.flags & IM_KEEP_ASPECT) 274 if (image.flags & IM_KEEP_ASPECT)
270 { 275 {
285 else 290 else
286 { 291 {
287 x = make_align_position (image.h_align, parent_width, w); 292 x = make_align_position (image.h_align, parent_width, w);
288 y = make_align_position (image.v_align, parent_height, h); 293 y = make_align_position (image.v_align, parent_height, h);
289 } 294 }
290}
291
292bool
293rxvt_term::render_image (rxvt_image &image)
294{
295 int parent_width = szHint.width;
296 int parent_height = szHint.height;
297
298 int x = 0;
299 int y = 0;
300 int w = 0;
301 int h = 0;
302
303 get_image_geometry (image, w, h, x, y);
304 295
305 if (!(image.flags & IM_ROOT_ALIGN) 296 if (!(image.flags & IM_ROOT_ALIGN)
306 && (x >= parent_width 297 && (x >= parent_width
307 || y >= parent_height 298 || y >= parent_height
308 || x + w <= 0 299 || x + w <= 0
315 img->repeat_mode (RepeatNormal); 306 img->repeat_mode (RepeatNormal);
316 else 307 else
317 img->repeat_mode (RepeatNone); 308 img->repeat_mode (RepeatNone);
318 img->sub_rect (-x, -y, parent_width, parent_height)->replace (img); 309 img->sub_rect (-x, -y, parent_width, parent_height)->replace (img);
319 310
320 if (bg_flags & BG_IS_VALID) 311 if (bg_img)
321 img->draw (bg_img, PictOpOver, image.alpha * 1. / 0xffff); 312 img->draw (bg_img, PictOpOver, image.alpha * 1. / 0xffff);
322 313
323 XRenderPictFormat *format = XRenderFindVisualFormat (dpy, visual); 314 XRenderPictFormat *format = XRenderFindVisualFormat (dpy, visual);
324 img->convert_format (format, pix_colors [Color_bg])->replace (img); 315 img->convert_format (format, pix_colors [Color_bg])->replace (img);
325 316
456 int sx, sy; 447 int sx, sy;
457 448
458 sx = parent_x; 449 sx = parent_x;
459 sy = parent_y; 450 sy = parent_y;
460 451
461 if (!root_img)
462 return false;
463
464 /* check if we are outside of the visible part of the virtual screen : */ 452 /* check if we are outside of the visible part of the virtual screen : */
465 if (sx + parent_width <= 0 || sy + parent_height <= 0 453 if (sx + parent_width <= 0 || sy + parent_height <= 0
466 || sx >= root_width || sy >= root_height) 454 || sx >= root_width || sy >= root_height)
467 return 0; 455 return 0;
468 456
483 delete bg_img; 471 delete bg_img;
484 bg_img = img; 472 bg_img = img;
485 473
486 return true; 474 return true;
487} 475}
488
489void
490rxvt_term::bg_set_root_pixmap ()
491{
492 delete root_img;
493 root_img = rxvt_img::new_from_root (this);
494}
495# endif /* BG_IMAGE_FROM_ROOT */ 476# endif /* BG_IMAGE_FROM_ROOT */
496 477
497void 478void
498rxvt_term::bg_render () 479rxvt_term::bg_render ()
499{ 480{
500 if (bg_flags & BG_INHIBIT_RENDER) 481 if (bg_flags & BG_INHIBIT_RENDER)
501 return; 482 return;
502 483
503 bg_invalidate (); 484 delete bg_img;
485 bg_img = 0;
486 bg_flags = 0;
487
488 if (!mapped)
489 return;
490
504# if BG_IMAGE_FROM_ROOT 491# if BG_IMAGE_FROM_ROOT
505 if (option (Opt_transparent)) 492 if (root_img)
506 {
507 /* we need to re-generate transparency pixmap in that case ! */
508 if (render_root_image ()) 493 if (render_root_image ())
509 bg_flags |= BG_IS_VALID | BG_IS_TRANSPARENT; 494 bg_flags |= BG_IS_TRANSPARENT;
510 }
511# endif 495# endif
512 496
513# if BG_IMAGE_FROM_FILE 497# if BG_IMAGE_FROM_FILE
514 if (fimage.img) 498 if (fimage.img)
515 {
516 if (render_image (fimage)) 499 render_image (fimage);
517 bg_flags |= BG_IS_VALID;
518 }
519# endif 500# endif
520
521 if (!(bg_flags & BG_IS_VALID))
522 {
523 delete bg_img;
524 bg_img = 0;
525 }
526 501
527 scr_recolour (false); 502 scr_recolour (false);
528 bg_flags |= BG_NEEDS_REFRESH; 503 bg_flags |= BG_NEEDS_REFRESH;
529 504
530 bg_valid_since = ev::now (); 505 bg_valid_since = ev::now ();
543 root_effects.set_tint (pix_colors_focused [Color_tint]); 518 root_effects.set_tint (pix_colors_focused [Color_tint]);
544 519
545 if (rs [Rs_shade]) 520 if (rs [Rs_shade])
546 root_effects.set_shade (rs [Rs_shade]); 521 root_effects.set_shade (rs [Rs_shade]);
547 522
548 bg_set_root_pixmap (); 523 rxvt_img::new_from_root (this)->replace (root_img);
549 XSelectInput (dpy, display->root, PropertyChangeMask); 524 XSelectInput (dpy, display->root, PropertyChangeMask);
550 rootwin_ev.start (display, display->root); 525 rootwin_ev.start (display, display->root);
551 } 526 }
552#endif 527#endif
553 528

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines