[mutter] compositor: when tiling background, center on screen
- From: Ray Strode <halfline src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter] compositor: when tiling background, center on screen
- Date: Sat, 2 Mar 2013 22:39:14 +0000 (UTC)
commit 0e3d164117414ac8c1fc7590d454b2539e90aa1a
Author: Ray Strode <rstrode redhat com>
Date: Thu Feb 21 23:24:45 2013 -0500
compositor: when tiling background, center on screen
The WALLPAPER style of background painting currently
draws starting in the upper left corner of each monitor.
This isn't really correct, it means the seam between
monitors doesn't match up and edges look unbalanced if
the tile isn't a multipe of monitor size.
Really, the tiles should be centered in the middle of
the screen. (Just like when tiling a bathroom floor,
tiles should start in the center of the room.)
This commit reworks the math to make that happen.
https://bugzilla.gnome.org/show_bug.cgi?id=694393
src/compositor/meta-background.c | 37 ++++++++++++++++++++++++++++++++-----
1 files changed, 32 insertions(+), 5 deletions(-)
---
diff --git a/src/compositor/meta-background.c b/src/compositor/meta-background.c
index 82164d6..a43d68c 100644
--- a/src/compositor/meta-background.c
+++ b/src/compositor/meta-background.c
@@ -161,6 +161,7 @@ get_texture_area_and_scale (MetaBackground *self,
float texture_width, texture_height;
float actor_x_scale, actor_y_scale;
float monitor_x_scale, monitor_y_scale;
+ float x_offset, y_offset;
meta_screen_get_monitor_geometry (priv->screen, priv->monitor, &monitor_geometry);
@@ -187,14 +188,40 @@ get_texture_area_and_scale (MetaBackground *self,
*texture_y_scale = 1.0 / actor_pixel_rect.height;
break;
case G_DESKTOP_BACKGROUND_STYLE_WALLPAPER:
- /* paint region is whole actor, and the texture
- * is left unscaled
+ /* The wallpaper should be centered in the middle of all monitors.
+ * Therefore, the textured area is the union of all monitors plus
+ * an additional bit to make up for the texture getting centered. */
+ meta_screen_get_size (priv->screen, &screen_width, &screen_height);
+
+ /* so start by making the unclipped texture area the whole screen */
+ image_area.width = screen_width;
+ image_area.height = screen_height;
+
+ /* If one of the tiles is already centered in the screen, then that tile
+ * will start tile_size/2.0 before the center of the screen. So find out
+ * how far we are from that ideal and adjust by that offset.
*/
- image_area = actor_pixel_rect;
- *texture_x_scale = 1.0 / texture_width;
- *texture_y_scale = 1.0 / texture_height;
+ x_offset = texture_width - ((int) ((screen_width / 2.0) - (texture_width / 2.0))) % ((int)
texture_width);
+ y_offset = texture_height - ((int) ((screen_height / 2.0) - (texture_height / 2.0))) % ((int)
texture_height);
+
+ image_area.width += x_offset;
+ image_area.height += y_offset;
+ image_area.x = -x_offset;
+ image_area.y = -y_offset;
+
+ /* now line up with the appropriate monitor */
+ image_area.x -= monitor_geometry.x;
+ image_area.y -= monitor_geometry.y;
+
+ /* and scale to actor */
+ image_area.x *= actor_x_scale;
+ image_area.y *= actor_y_scale;
+ image_area.width *= actor_x_scale;
+ image_area.height *= actor_y_scale;
*texture_area = image_area;
+ *texture_x_scale = 1.0 / texture_width;
+ *texture_y_scale = 1.0 / texture_height;
break;
case G_DESKTOP_BACKGROUND_STYLE_CENTERED:
/* paint region is the original image size centered in the actor,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]