diff src/aosd/aosd_osd.c @ 586:26519231a4f4 trunk

[svn] - aosd: added experimental multiple monitor support, plus max_width setting
author giacomo
date Wed, 31 Jan 2007 08:42:04 -0800
parents d401f87f89f7
children 289c08270c7b
line wrap: on
line diff
--- a/src/aosd/aosd_osd.c	Tue Jan 30 23:14:02 2007 -0800
+++ b/src/aosd/aosd_osd.c	Wed Jan 31 08:42:04 2007 -0800
@@ -96,22 +96,52 @@
   GhosdFadeData fade_data = { NULL , 0 , NULL , 0 , 0 , 0 };
   PangoContext *context;
   PangoLayout *osd_layout;
-  gint max_width, layout_width, layout_height, pos_x = 0, pos_y = 0;
+  gint max_width, layout_width, layout_height;
+  gint pos_x = 0, pos_y = 0;
   gint pad_left = 0 , pad_right = 0 , pad_top = 0 , pad_bottom = 0;
-  const gint screen_width = gdk_screen_get_width( gdk_screen_get_default() );
-  const gint screen_height = gdk_screen_get_height( gdk_screen_get_default() );
+  gint screen_width, screen_height;
   const gint STEP_MS = 50;
   const gfloat dalpha_in = 1.0 / ( cfg_osd->animation.timing_fadein / (gfloat)STEP_MS );
   const gfloat dalpha_out = 1.0 / ( cfg_osd->animation.timing_fadeout / (gfloat)STEP_MS );
   struct timeval tv_nextupdate;
   gboolean stop_now = FALSE;
   aosd_deco_style_data_t style_data;
+  GdkScreen *screen = gdk_screen_get_default();
+
+  /* calculate screen_width and screen_height */
+  if ( cfg_osd->position.multimon_id > -1 )
+  {
+    /* adjust coordinates and size according to selected monitor */
+    GdkRectangle rect;
+    gdk_screen_get_monitor_geometry( screen , cfg_osd->position.multimon_id , &rect );
+    pos_x = rect.x;
+    pos_y = rect.y;
+    screen_width = rect.width;
+    screen_height = rect.height;
+  }
+  else
+  {
+    /* use total space available, even when composed by multiple monitor */
+    screen_width = gdk_screen_get_width( screen );
+    screen_height = gdk_screen_get_height( screen );
+    pos_x = 0;
+    pos_y = 0;
+  }
 
   /* pick padding from selected decoration style */
   aosd_deco_style_get_padding( cfg_osd->decoration.code ,
     &pad_top , &pad_bottom , &pad_left , &pad_right );
 
-  max_width = screen_width - pad_left - pad_right - abs(cfg_osd->position.offset_x);
+  if ( cfg_osd->position.maxsize_width > 0 )
+  {
+    max_width = cfg_osd->position.maxsize_width - pad_left - pad_right;
+    if ( max_width < 1 ) /* ignore user-defined max_width if it is too small */
+      max_width = screen_width - pad_left - pad_right - abs(cfg_osd->position.offset_x);
+  }
+  else
+  {
+    max_width = screen_width - pad_left - pad_right - abs(cfg_osd->position.offset_x);
+  }
   context = pango_cairo_font_map_create_context(
               PANGO_CAIRO_FONT_MAP(pango_cairo_font_map_get_default()));
   osd_layout = pango_layout_new(context);
@@ -127,41 +157,41 @@
   switch ( cfg_osd->position.placement )
   {
     case AOSD_POSITION_PLACEMENT_TOP:
-      pos_x = (screen_width - (layout_width + pad_left + pad_right)) / 2;
-      pos_y = 0;
+      pos_x += (screen_width - (layout_width + pad_left + pad_right)) / 2;
+      pos_y += 0;
       break;
     case AOSD_POSITION_PLACEMENT_TOPRIGHT:
-      pos_x = screen_width - (layout_width + pad_left + pad_right);
-      pos_y = 0;
+      pos_x += screen_width - (layout_width + pad_left + pad_right);
+      pos_y += 0;
       break;
     case AOSD_POSITION_PLACEMENT_MIDDLELEFT:
-      pos_x = 0;
-      pos_y = (screen_height - (layout_height + pad_top + pad_bottom)) / 2;
+      pos_x += 0;
+      pos_y += (screen_height - (layout_height + pad_top + pad_bottom)) / 2;
       break;
     case AOSD_POSITION_PLACEMENT_MIDDLE:
-      pos_x = (screen_width - (layout_width + pad_left + pad_right)) / 2;
-      pos_y = (screen_height - (layout_height + pad_top + pad_bottom)) / 2;
+      pos_x += (screen_width - (layout_width + pad_left + pad_right)) / 2;
+      pos_y += (screen_height - (layout_height + pad_top + pad_bottom)) / 2;
       break;
     case AOSD_POSITION_PLACEMENT_MIDDLERIGHT:
-      pos_x = screen_width - (layout_width + pad_left + pad_right);
-      pos_y = (screen_height - (layout_height + pad_top + pad_bottom)) / 2;
+      pos_x += screen_width - (layout_width + pad_left + pad_right);
+      pos_y += (screen_height - (layout_height + pad_top + pad_bottom)) / 2;
       break;
     case AOSD_POSITION_PLACEMENT_BOTTOMLEFT:
-      pos_x = 0;
-      pos_y = screen_height - (layout_height + pad_top + pad_bottom);
+      pos_x += 0;
+      pos_y += screen_height - (layout_height + pad_top + pad_bottom);
       break;
     case AOSD_POSITION_PLACEMENT_BOTTOM:
-      pos_x = (screen_width - (layout_width + pad_left + pad_right)) / 2;
-      pos_y = screen_height - (layout_height + pad_top + pad_bottom);
+      pos_x += (screen_width - (layout_width + pad_left + pad_right)) / 2;
+      pos_y += screen_height - (layout_height + pad_top + pad_bottom);
       break;
     case AOSD_POSITION_PLACEMENT_BOTTOMRIGHT:
-      pos_x = screen_width - (layout_width + pad_left + pad_right);
-      pos_y = screen_height - (layout_height + pad_top + pad_bottom);
+      pos_x += screen_width - (layout_width + pad_left + pad_right);
+      pos_y += screen_height - (layout_height + pad_top + pad_bottom);
       break;
     case AOSD_POSITION_PLACEMENT_TOPLEFT:
     default:
-      pos_x = 0;
-      pos_y = 0;
+      pos_x += 0;
+      pos_y += 0;
       break;
   }