diff src/aosd/aosd_osd.c @ 883:e6d51d079a46 trunk

[svn] - aosd: use a single ghosd object for all of the osd showups; this will be a lot gentler to XLib and should definitely help with stability
author giacomo
date Tue, 20 Mar 2007 18:55:57 -0700
parents 623eca8326e5
children 16e51fb5908e
line wrap: on
line diff
--- a/src/aosd/aosd_osd.c	Tue Mar 20 14:01:54 2007 -0700
+++ b/src/aosd/aosd_osd.c	Tue Mar 20 18:55:57 2007 -0700
@@ -99,9 +99,7 @@
 {
   if ( osd_data->fade_data.surface != NULL )
   {
-    /* by using XCloseDisplay in ghosd_destroy, this free is not needed
-       anymore (doing it will result in double free and segfault)
-      cairo_surface_destroy( osd_data->fade_data.surface ); */
+    cairo_surface_destroy( osd_data->fade_data.surface );
     osd_data->fade_data.surface = NULL;
   }
 
@@ -134,14 +132,12 @@
 
 
 static void
-aosd_osd_hideanddestroy ( void )
+aosd_osd_hide ( void )
 {
   if ( osd != NULL )
   {
     ghosd_hide( osd );
     ghosd_main_iterations( osd );
-    ghosd_destroy( osd );
-    osd = NULL;
   }
   return;
 }
@@ -233,8 +229,6 @@
   pango_layout_set_width( osd_data->pango_layout , PANGO_SCALE * max_width );
   pango_layout_get_pixel_size( osd_data->pango_layout , &layout_width , &layout_height );
 
-  osd = ghosd_new();
-
   /* osd position */
   switch ( osd_data->cfg_osd->position.placement )
   {
@@ -370,7 +364,7 @@
 
     case AOSD_STATUS_DESTROY:
     {
-      aosd_osd_hideanddestroy();
+      aosd_osd_hide();
       aosd_osd_data_free();
 
       osd_status = AOSD_STATUS_HIDDEN; /* reset status */
@@ -384,7 +378,7 @@
 
 
 gint
-aosd_display ( gchar * markup_string , aosd_cfg_osd_t * cfg_osd , gboolean copy_cfg )
+aosd_osd_display ( gchar * markup_string , aosd_cfg_osd_t * cfg_osd , gboolean copy_cfg )
 {
   if ( osd_status == AOSD_STATUS_HIDDEN )
   {
@@ -398,7 +392,7 @@
   {
     g_source_remove( osd_source_id ); /* remove timer */
     osd_source_id = 0;
-    aosd_osd_hideanddestroy();
+    aosd_osd_hide();
     aosd_osd_data_free();
     osd_status = AOSD_STATUS_HIDDEN;
     /* now display new OSD */
@@ -413,15 +407,40 @@
 
 
 void
-aosd_shutdown ( void )
+aosd_osd_shutdown ( void )
 {
   if ( osd_status != AOSD_STATUS_HIDDEN ) /* osd is being displayed */
   {
     g_source_remove( osd_source_id ); /* remove timer */
     osd_source_id = 0;
-    aosd_osd_hideanddestroy();
+    aosd_osd_hide();
     aosd_osd_data_free();
     osd_status = AOSD_STATUS_HIDDEN;
   }
   return;
 }
+
+
+void
+aosd_osd_init ( void )
+{
+  if ( osd == NULL )
+  {
+    /* create Ghosd object */
+    osd = ghosd_new();
+  }
+  return;
+}
+
+
+void 
+aosd_osd_cleanup ( void )
+{
+  if ( osd != NULL )
+  {
+    /* destroy Ghosd object */
+    ghosd_destroy( osd );
+    osd = NULL;
+  }
+  return;
+}