[maemo-commits] [maemo-commits] r12435 - in projects/haf/trunk/hildon-desktop: . libhildonwm src

From: subversion at stage.maemo.org subversion at stage.maemo.org
Date: Fri Jun 22 19:17:09 EEST 2007
Author: moimart
Date: 2007-06-22 19:17:07 +0300 (Fri, 22 Jun 2007)
New Revision: 12435

Modified:
   projects/haf/trunk/hildon-desktop/ChangeLog
   projects/haf/trunk/hildon-desktop/libhildonwm/Makefile.am
   projects/haf/trunk/hildon-desktop/libhildonwm/hd-wm-application.c
   projects/haf/trunk/hildon-desktop/libhildonwm/hd-wm-application.h
   projects/haf/trunk/hildon-desktop/libhildonwm/hd-wm-window.c
   projects/haf/trunk/hildon-desktop/libhildonwm/hd-wm-window.h
   projects/haf/trunk/hildon-desktop/libhildonwm/hd-wm.c
   projects/haf/trunk/hildon-desktop/libhildonwm/hd-wm.h
   projects/haf/trunk/hildon-desktop/src/hd-desktop.c
Log:
2007-06 22  Moises Martinez  <moises.martinez at nokia.com>

        * src/hd-desktop.c:
        - Moved UI part of ping timeout to hd-desktop.
        * libhildonwm/hd-wm.[ch]:
        - Code cleaned. Added new signal when application freezes.
        * libhildonwm/hd-wm-application.[ch]:
        - Removed Hildon* code.
        - Code cleanup.
        * libhildonwm/hd-wm-window.c:
        - Removed Hildon* code.
        - Code cleanup.
        * libhildonwm/Makefile.am:
        - Depends only on GTK.
	* ChangeLog updated.



Modified: projects/haf/trunk/hildon-desktop/ChangeLog
===================================================================
--- projects/haf/trunk/hildon-desktop/ChangeLog	2007-06-22 15:51:03 UTC (rev 12434)
+++ projects/haf/trunk/hildon-desktop/ChangeLog	2007-06-22 16:17:07 UTC (rev 12435)
@@ -1,3 +1,18 @@
+2007-06 22  Moises Martinez  <moises.martinez at nokia.com>
+
+	* src/hd-desktop.c:
+	- Moved UI part of ping timeout to hd-desktop.
+	* libhildonwm/hd-wm.[ch]:
+	- Code cleaned. Added new signal when application freezes.
+	* libhildonwm/hd-wm-application.[ch]:
+	- Removed Hildon* code.
+	- Code cleanup.
+	* libhildonwm/hd-wm-window.c:
+	- Removed Hildon* code.
+	- Code cleanup.
+	* libhildonwm/Makefile.am:
+	- Depends only on GTK.
+
 2007-06 21  Moises Martinez  <moises.martinez at nokia.com>
 
 	* libhildonwm/hd-wm-watched-window.[ch]:

Modified: projects/haf/trunk/hildon-desktop/libhildonwm/Makefile.am
===================================================================
--- projects/haf/trunk/hildon-desktop/libhildonwm/Makefile.am	2007-06-22 15:51:03 UTC (rev 12434)
+++ projects/haf/trunk/hildon-desktop/libhildonwm/Makefile.am	2007-06-22 16:17:07 UTC (rev 12435)
@@ -17,6 +17,7 @@
 
 INCLUDES = \
 	$(HILDON_CFLAGS) \
+        $(GTK_CFLAGS) \
 	$(GDK_CFLAGS) \
    	$(GCONF_CFLAGS) \
 	$(GNOME_VFS_CFLAGS) \
@@ -51,6 +52,7 @@
 	hd-entry-info.c
 
 libhildonwm_la_LIBADD =     \
+ 	$(GTK_LIBS)	    \
 	$(GDK_LIBS)	    \
 	$(GCONF_LIBS)       \
 	$(GNOME_VFS_LIBS)   \

Modified: projects/haf/trunk/hildon-desktop/libhildonwm/hd-wm-application.c
===================================================================
--- projects/haf/trunk/hildon-desktop/libhildonwm/hd-wm-application.c	2007-06-22 15:51:03 UTC (rev 12434)
+++ projects/haf/trunk/hildon-desktop/libhildonwm/hd-wm-application.c	2007-06-22 16:17:07 UTC (rev 12435)
@@ -96,7 +96,7 @@
   gchar     *exec_name; 		/* class || exec field ? */
   gchar     *class_name;        
   gchar     *text_domain;        
-  GtkWidget *ping_timeout_note; /* The note that is shown when the app quits responding */
+  GObject   *ping_timeout_note; /* The note that is shown when the app quits responding */
   HDWMWindow    *active_window;
   HDWMApplicationFlags flags;
   HDEntryInfo          *info;
@@ -166,14 +166,6 @@
 					   gpointer value,
 					   gpointer user_data);
 
-static void
-hd_wm_launch_banner_info_free (HDWMLaunchBannerInfo* info)
-{
-  g_return_if_fail(info);
-  
-  g_free(info->msg);
-  g_free(info);
-}
 
 HDWMApplication*
 hd_wm_application_new_dummy (void)
@@ -563,132 +555,12 @@
 }
 
 void
-hd_wm_application_died_dialog_show(HDWMApplication *app)
+hd_wm_application_set_ping_timeout_note (HDWMApplication *app, GObject *note)
 {
-  GtkWidget *dialog;
-  gchar *text;
-  text = g_strdup_printf(dgettext("ke-recv", "memr_ni_application_closed_no_resources"),
-			 app->priv->app_name ? _(app->priv->app_name) : "");
-  dialog = hildon_note_new_information(NULL, text);
-  gtk_widget_show_all(dialog);
-  gtk_dialog_run(GTK_DIALOG(dialog));
-  gtk_widget_destroy(dialog);
-  g_free(text);
-}
-
-/* Launch Banner Dialog */
-
-/* FIXME: rename namespace to watched app */
-void 
-hd_wm_application_launch_banner_show (HDWMApplication *app) 
-{
-  HDWMLaunchBannerInfo *info;
-  guint                 interval;
-  gchar                *lapp_name;
-
-  g_return_if_fail(app);
-  
-  interval = HDWM_APPLICATION_LAUNCH_BANNER_CHECK_INTERVAL * 1000;
-
-  info = g_new0(HDWMLaunchBannerInfo, 1);
-
-  info->app = app;
-
-  gettimeofday( &info->launch_time, NULL );
-
-  gdk_error_trap_push(); 	/* Needed ? */
-
-  lapp_name = (app->priv->text_domain?dgettext(app->priv->text_domain,app->priv->app_name):
-                                gettext(app->priv->app_name));
-
-  info->msg = g_strdup_printf(_(hd_wm_application_is_hibernating(app) ?
-                                HDWM_APPLICATION_LAUNCH_BANNER_MSG_RESUMING :
-                                HDWM_APPLICATION_LAUNCH_BANNER_MSG_LOADING ),
-                              lapp_name ? _(lapp_name) : "" );
-        
-  info->banner = hildon_banner_show_animation(NULL, NULL, info->msg);
-  gdk_error_trap_pop();
-
-  g_timeout_add(interval, hd_wm_application_launch_banner_timeout, info);
-
-}
-
-void 
-hd_wm_application_launch_banner_close (GtkWidget            *parent,
-					 HDWMLaunchBannerInfo *info)
-{
-  if (!(info && info->msg))
-    return;
-
-  if(info->banner)
-    gtk_widget_destroy(info->banner);
-
-  hd_wm_launch_banner_info_free(info);
-}
-
-gboolean 
-hd_wm_application_launch_banner_timeout (gpointer data)
-{
-  HDWMLaunchBannerInfo *info = data;
-  struct timeval        current_time;
-  long unsigned int     t1, t2;
-  guint                 time_left;
-  gulong                current_banner_timeout = 0;
-
-  /* Added by Karoliina Salminen 26092005 
-   * Addition to low memory situation awareness, the following 
-   * multiplies the launch banner timeout with the timeout 
-   * multiplier found from environment variable 
-   */
-  if(hd_wm_is_lowmem_situation()) 
-    current_banner_timeout
-      = hd_wm_get_lowmem_banner_timeout()*hd_wm_get_lowmem_timeout_multiplier();
-  
-  else 
-    current_banner_timeout = hd_wm_get_lowmem_banner_timeout();
-
-  /* End of addition 26092005 */
-
-#if 0 // needed ???
-  if ( find_service_from_tree( hnwm->callbacks.model, 
-			       &iter, 
-			       info->service_name ) > 0) 
-    {
-    } else {
-      /* This should never happen. Bail out! */
-      return FALSE;
-    }
-#endif	
-
-  gettimeofday( &current_time, NULL );
-
-  t1 = (long unsigned int) info->launch_time.tv_sec;
-  t2 = (long unsigned int) current_time.tv_sec;
-  time_left = (guint) (t2 - t1);
-	
-  /* The following uses now current_banner_timeout instead of 
-   * lowmem_banner_timeout, changed by
-   * Karoliina Salminen 26092005 
-   */
-  if (time_left >= current_banner_timeout 
-      || hd_wm_application_has_windows (info->app))
-    {
-      /* Close the banner */
-      hd_wm_application_launch_banner_close( NULL, info );
-      
-      return FALSE;
-    }
-  
-  return TRUE;
-}
-
-void
-hd_wm_application_set_ping_timeout_note(HDWMApplication *app, GtkWidget *note)
-{
 	app->priv->ping_timeout_note = note;
 }
 
-GtkWidget*
+GObject *
 hd_wm_application_get_ping_timeout_note(HDWMApplication *app)
 {
 	return app->priv->ping_timeout_note;

Modified: projects/haf/trunk/hildon-desktop/libhildonwm/hd-wm-application.h
===================================================================
--- projects/haf/trunk/hildon-desktop/libhildonwm/hd-wm-application.h	2007-06-22 15:51:03 UTC (rev 12434)
+++ projects/haf/trunk/hildon-desktop/libhildonwm/hd-wm-application.h	2007-06-22 16:17:07 UTC (rev 12435)
@@ -270,14 +270,6 @@
 					   gboolean          hibernate);
 
 /** 
- * Shows application died dialog
- *
- * @param app HDWMApplication instance
- */
-void
-hd_wm_application_died_dialog_show (HDWMApplication *app);
-
-/** 
  * FIXME: CAn be static ?
  * Shows launch banner for app 
  * 
@@ -287,29 +279,10 @@
 void 
 hd_wm_application_launch_banner_show (HDWMApplication *app);
 
-/** 
- * FIXME: Can be static ?
- * 
- * @param parent 
- */
-void 
-hd_wm_application_launch_banner_close (GtkWidget            *parent,
-					 HDWMLaunchBannerInfo *info);
-
-/** 
- * FIXME: this can be static
- * 
- * @param data 
- * 
- * @return 
- */
-gboolean 
-hd_wm_application_launch_banner_timeout (gpointer data);
-
 void
-hd_wm_application_set_ping_timeout_note (HDWMApplication *app, GtkWidget *note);
+hd_wm_application_set_ping_timeout_note (HDWMApplication *app, GObject *note);
 
-GtkWidget*
+GObject *
 hd_wm_application_get_ping_timeout_note (HDWMApplication *app);
 
 HDWMWindow *

Modified: projects/haf/trunk/hildon-desktop/libhildonwm/hd-wm-window.c
===================================================================
--- projects/haf/trunk/hildon-desktop/libhildonwm/hd-wm-window.c	2007-06-22 15:51:03 UTC (rev 12434)
+++ projects/haf/trunk/hildon-desktop/libhildonwm/hd-wm-window.c	2007-06-22 16:17:07 UTC (rev 12435)
@@ -146,8 +146,8 @@
 hd_wm_window_finalize (GObject *object)
 {
   HDWMWindow	*win = HD_WM_WINDOW (object);	
-  GtkWidget             *note;
-  HDWM			*hdwm = hd_wm_get_singleton ();
+  GObject       *note;
+  HDWM		*hdwm = hd_wm_get_singleton ();
   
   HN_DBG("Removing '%s'", win->priv->name);
 
@@ -168,14 +168,16 @@
       g_strdup_printf (PING_TIMEOUT_RESPONSE_STRING, win->priv->name);
   
       /* Show the infoprint */
-      hildon_banner_show_information (NULL, NULL, response_message);
+    g_debug ("TODO: %s hildon_banner_show_information (NULL, NULL, response_message);",
+	     response_message);
 
-      g_free (response_message);
+    g_free (response_message);
       
-      /* .. destroy the infonote */
-      gtk_widget_destroy (note);
-      hd_wm_application_set_ping_timeout_note (win->priv->app_parent, NULL);
-    }
+    /* .. destroy the infonote */
+    g_object_unref (note);
+
+    hd_wm_application_set_ping_timeout_note (win->priv->app_parent, NULL);
+  }
   
   if(win->priv->info)
   {
@@ -857,84 +859,6 @@
   win->priv->xwin = None;
 }
 
-static void
-hd_wm_ping_timeout_dialog_response (GtkDialog *note, gint ret, gpointer data)
-{
-  HDWMWindow *win = (HDWMWindow *)data;
-  HDWMApplication *app = hd_wm_window_get_application (win);
-
-  gtk_widget_destroy (GTK_WIDGET(note));
-  hd_wm_application_set_ping_timeout_note (app, NULL);
-
-  if (ret == GTK_RESPONSE_OK)
-  {
-    /* Kill the app */
-    if (!hd_wm_window_attempt_signal_kill (win, SIGKILL, FALSE))
-      g_debug ("hd_wm_ping_timeout:failed to kill application '%s'.", win->priv->name);
-  }
-}
-
-void
-hd_wm_ping_timeout (HDWMWindow *win)
-{
-  GtkWidget *note;
-
-  HDWMApplication *app = hd_wm_window_get_application (win);
-
-  gchar *timeout_message = 
-    g_strdup_printf (PING_TIMEOUT_MESSAGE_STRING, win->priv->name );
-
-  /* FIXME: Do we need to check if the note already exists? */
-  note = hd_wm_application_get_ping_timeout_note (app);
-  
-  if (note && GTK_IS_WIDGET(note))
-  {
-    g_debug ("hd_wm_ping_timeout: the note already exists.");
-    goto cleanup_and_exit;
-  }
-
-  note = hildon_note_new_confirmation (NULL, timeout_message);
-
-  hd_wm_application_set_ping_timeout_note (app, note);
-
-  hildon_note_set_button_texts (HILDON_NOTE(note),
-                                PING_TIMEOUT_BUTTON_OK_STRING,
-                                PING_TIMEOUT_BUTTON_CANCEL_STRING);
-
-  g_signal_connect (G_OBJECT (note),
-                    "response",
-                    G_CALLBACK (hd_wm_ping_timeout_dialog_response),
-                    win);
-
-  gtk_widget_show_all (note);
-
-cleanup_and_exit:
-
-  g_free( timeout_message );
-}
-
-
-void
-hd_wm_ping_timeout_cancel (HDWMWindow *win)
-{
-  HDWMApplication *app = hd_wm_window_get_application (win);
-
-  GtkWidget *note = hd_wm_application_get_ping_timeout_note(app);
-
-  gchar *response_message = 
-    g_strdup_printf (PING_TIMEOUT_RESPONSE_STRING, win->priv->name);
-
-  if (note && GTK_IS_WIDGET (note)) {
-    gtk_dialog_response (GTK_DIALOG(note), GTK_RESPONSE_CANCEL);
-  }
-
-  /* Show the infoprint */
-  hildon_banner_show_information (NULL, NULL, response_message );
-
-  g_free (response_message);
-}
-
-
 /*
  * Closes window and associated views (if any), handling hibernated
  * applications according to the UI spec.

Modified: projects/haf/trunk/hildon-desktop/libhildonwm/hd-wm-window.h
===================================================================
--- projects/haf/trunk/hildon-desktop/libhildonwm/hd-wm-window.h	2007-06-22 15:51:03 UTC (rev 12434)
+++ projects/haf/trunk/hildon-desktop/libhildonwm/hd-wm-window.h	2007-06-22 16:17:07 UTC (rev 12435)
@@ -156,12 +156,6 @@
 hd_wm_window_destroy (HDWMWindow *win);
 
 void
-hd_wm_ping_timeout( HDWMWindow *win );
-
-void
-hd_wm_ping_timeout_cancel( HDWMWindow *win );
-
-void
 hd_wm_window_close (HDWMWindow *win);
 
 void

Modified: projects/haf/trunk/hildon-desktop/libhildonwm/hd-wm.c
===================================================================
--- projects/haf/trunk/hildon-desktop/libhildonwm/hd-wm.c	2007-06-22 15:51:03 UTC (rev 12434)
+++ projects/haf/trunk/hildon-desktop/libhildonwm/hd-wm.c	2007-06-22 16:17:07 UTC (rev 12435)
@@ -36,19 +36,14 @@
 #include <gdk/gdkx.h>
 #include <gdk/gdkevents.h>
 #include <libgnomevfs/gnome-vfs.h>
+#include <glib/gi18n.h>
 
-#ifdef HAVE_LIBHILDON
-#include <hildon/hildon-defines.h>
-#include <hildon/hildon-window.h>
-#else
-#include <hildon-widgets/hildon-defines.h>
-#include <hildon-widgets/hildon-window.h>
-#endif
-
 #ifdef HAVE_LIBOSSO
 #include <libosso.h>
 #endif
 
+#include <hildon/hildon-window.h>
+
 #define DBUS_API_SUBJECT_TO_CHANGE
 #include <dbus/dbus.h>
 
@@ -116,6 +111,9 @@
   HDWM_SHOW_A_MENU_SIGNAL,
   HDWM_LONG_PRESS_KEY,
   HDWM_APPLICATION_STARTING_SIGNAL,
+  HDWM_APPLICATION_DIED_SIGNAL,
+  HDWM_APPLICATION_FROZEN_SIGNAL,
+  HDWM_APPLICATION_FROZEN_CANCEL_SIGNAL,
   HDWM_FULLSCREEN,
   HDWM_CLOSE_APP,
   HDWM_SIGNALS
@@ -304,7 +302,7 @@
     
     "UTF8_STRING",
 
-    "_NET_WM_STARTUP_INFO"
+    "_NET_STARTUP_INFO"
   };
 
   XInternAtoms (GDK_DISPLAY(),
@@ -565,6 +563,8 @@
 static DBusHandlerResult
 hd_wm_dbus_signal_handler (DBusConnection *conn, DBusMessage *msg, void *data)
 {
+  HDWM *hdwm = HD_WM (data);
+
   if (dbus_message_is_signal(msg, MAEMO_LAUNCHER_SIGNAL_IFACE,
 				  APP_DIED_SIGNAL_NAME))
   {
@@ -595,12 +595,17 @@
 	   filename, pid, status);
 
     /* Is this 'filename' watchable ? */
-    app = hd_wm_lookup_application_via_exec(filename);
+    app = hd_wm_lookup_application_via_exec (filename);
+
     if (app)
     {
-       g_debug ("Showing app died dialog ...");
-       hd_wm_application_died_dialog_show(app);
+       gchar *text = 
+	 g_strdup_printf (dgettext("ke-recv", "memr_ni_application_closed_no_resources"),
+			  hd_wm_application_get_name (app) ? _(hd_wm_application_get_name (app)) : "");
+
+       g_signal_emit_by_name (hdwm, "application-died", text);
     }
+
     return DBUS_HANDLER_RESULT_HANDLED;
   }
   
@@ -919,6 +924,39 @@
                      1,
                      G_TYPE_POINTER);
 
+  hdwm_signals[HDWM_APPLICATION_DIED_SIGNAL] = 
+	g_signal_new("application-died",
+		     G_OBJECT_CLASS_TYPE(object_class),
+		     G_SIGNAL_RUN_LAST,
+		     G_STRUCT_OFFSET (HDWMClass,application_died),
+		     NULL, NULL,
+		     g_cclosure_marshal_VOID__POINTER,
+		     G_TYPE_NONE,
+                     1,
+                     G_TYPE_POINTER);
+
+  hdwm_signals[HDWM_APPLICATION_FROZEN_SIGNAL] = 
+	g_signal_new("application-frozen",
+		     G_OBJECT_CLASS_TYPE(object_class),
+		     G_SIGNAL_RUN_LAST,
+		     G_STRUCT_OFFSET (HDWMClass,window_frozen),
+		     NULL, NULL,
+		     g_cclosure_marshal_VOID__OBJECT,
+		     G_TYPE_NONE,
+                     1,
+                     G_TYPE_OBJECT);
+
+  hdwm_signals[HDWM_APPLICATION_FROZEN_CANCEL_SIGNAL] = 
+	g_signal_new("application-frozen-cancel",
+		     G_OBJECT_CLASS_TYPE(object_class),
+		     G_SIGNAL_RUN_LAST,
+		     G_STRUCT_OFFSET (HDWMClass,window_frozen_cancel),
+		     NULL, NULL,
+		     g_cclosure_marshal_VOID__OBJECT,
+		     G_TYPE_NONE,
+                     1,
+                     G_TYPE_OBJECT);
+  
   hdwm_signals[HDWM_FULLSCREEN] = 
 	g_signal_new("fullscreen",
 		     G_OBJECT_CLASS_TYPE(object_class),
@@ -2335,7 +2373,7 @@
   if (((XEvent*)xevent)->type == ClientMessage)
   {
     XClientMessageEvent *cev = (XClientMessageEvent *)xevent;
-
+g_debug ("----------->>>>>>>> Message type %lx",cev->message_type);
     if (cev->message_type == hdwm->priv->atoms[HD_ATOM_HILDON_FROZEN_WINDOW])
     {
       Window   xwin_hung;
@@ -2351,9 +2389,11 @@
       if (win) 
       {
         if ( has_reawoken == TRUE ) 
-	  hd_wm_ping_timeout_cancel (win);
+	  g_signal_emit_by_name (hdwm, "application-frozen-cancel", win);
+	  /*hd_wm_ping_timeout_cancel (win);**/
 	else
-	  hd_wm_ping_timeout (win);
+          g_signal_emit_by_name (hdwm, "application-frozen", win);
+	  /*hd_wm_ping_timeout (win);*/
       }
       else 
       if (cev->message_type == hdwm->priv->atoms[HD_ATOM_HILDON_TN_ACTIVATE])
@@ -2366,7 +2406,11 @@
     }
     else
     if (cev->message_type == hdwm->priv->atoms[HD_ATOM_STARTUP_INFO])
+    {	    
       g_debug ("-------## ->>>>>>>>>   hello %s      <<<<<<<<<<---",(gchar *)cev->data.l);	    
+
+      return GDK_FILTER_CONTINUE;
+    }
   }
   else
   if (((XEvent*)xevent)->type == KeyPress)

Modified: projects/haf/trunk/hildon-desktop/libhildonwm/hd-wm.h
===================================================================
--- projects/haf/trunk/hildon-desktop/libhildonwm/hd-wm.h	2007-06-22 15:51:03 UTC (rev 12434)
+++ projects/haf/trunk/hildon-desktop/libhildonwm/hd-wm.h	2007-06-22 16:17:07 UTC (rev 12435)
@@ -144,7 +144,10 @@
   void (*entry_info_stack_changed) (HDWM *hdwm,HDEntryInfo *info);
   void (*work_area_changed)        (HDWM *hdwm,GdkRectangle *work_area);
   void (*show_menu)		   (HDWM *hdwm);
-  void (*application_starting)     (HDWM *hdwm, gchar *application);
+  void (*application_starting)     (HDWM *hdwm, gpointer application);
+  void (*application_died)	   (HDWM *hdwm, gpointer application);
+  void (*window_frozen)		   (HDWM *hdwm, HDWMWindow *window);
+  void (*window_frozen_cancel)     (HDWM *hdwm, HDWMWindow *window);
   /* */
 };
 

Modified: projects/haf/trunk/hildon-desktop/src/hd-desktop.c
===================================================================
--- projects/haf/trunk/hildon-desktop/src/hd-desktop.c	2007-06-22 15:51:03 UTC (rev 12434)
+++ projects/haf/trunk/hildon-desktop/src/hd-desktop.c	2007-06-22 16:17:07 UTC (rev 12435)
@@ -62,6 +62,13 @@
 #define HD_DESKTOP_CONFIG_FILE         "desktop.conf"
 #define HD_DESKTOP_CONFIG_USER_PATH    ".osso/hildon-desktop/"
 
+#define HD_DESKTOP_PING_TIMEOUT_MESSAGE_STRING       _( "qgn_nc_apkil_notresponding" )
+#define HD_DESKTOP_PING_TIMEOUT_RESPONSE_STRING      _( "qgn_ib_apkil_responded" )
+#define HD_DESKTOP_PING_TIMEOUT_KILL_FAILURE_STRING  _( "" )
+
+#define HD_DESKTOP_PING_TIMEOUT_BUTTON_OK_STRING     _( "qgn_bd_apkil_ok" )
+#define HD_DESKTOP_PING_TIMEOUT_BUTTON_CANCEL_STRING _( "qgn_bd_apkil_cancel" )
+
 typedef struct 
 {
   GtkWidget         *parent;
@@ -113,8 +120,99 @@
 void 
 hd_desktop_launch_banner_close (GtkWidget *parent, HDDesktopBannerInfo *info);
 
+static void
+hd_desktop_ping_timeout_dialog_response (GtkDialog *note, gint ret, gpointer data)
+{
+  HDWMWindow *win = (HDWMWindow *)data;
+  HDWMApplication *app = hd_wm_window_get_application (win);
+
+  gtk_widget_destroy (GTK_WIDGET(note));
+  hd_wm_application_set_ping_timeout_note (app, NULL);
+
+  if (ret == GTK_RESPONSE_OK)
+  {
+    /* Kill the app */
+    if (!hd_wm_window_attempt_signal_kill (win, SIGKILL, FALSE))
+      g_debug ("hd_wm_ping_timeout:failed to kill application '%s'.", hd_wm_window_get_name (win));
+  }
+}
+
+static void
+hd_desktop_application_frozen (HDWM *hdwm, HDWMWindow *win, gpointer data)
+{
+  GtkWidget *note;
+
+  HDWMApplication *app = hd_wm_window_get_application (win);
+
+  gchar *timeout_message = 
+    g_strdup_printf (HD_DESKTOP_PING_TIMEOUT_MESSAGE_STRING, hd_wm_window_get_name (win));
+
+  /* FIXME: Do we need to check if the note already exists? */
+  note = GTK_WIDGET (hd_wm_application_get_ping_timeout_note (app));
+  
+  if (note && GTK_IS_WIDGET (note))
+  {
+    g_debug ("hd_wm_ping_timeout: the note already exists.");
+    goto cleanup_and_exit;
+  }
+
+  note = hildon_note_new_confirmation (NULL, timeout_message);
+
+  hd_wm_application_set_ping_timeout_note (app, G_OBJECT (note));
+
+  hildon_note_set_button_texts (HILDON_NOTE (note),
+                                HD_DESKTOP_PING_TIMEOUT_BUTTON_OK_STRING,
+                                HD_DESKTOP_PING_TIMEOUT_BUTTON_CANCEL_STRING);
+
+  g_signal_connect (G_OBJECT (note),
+                    "response",
+                    G_CALLBACK (hd_desktop_ping_timeout_dialog_response),
+                    win);
+
+  gtk_widget_show_all (note);
+
+cleanup_and_exit:
+
+  g_free (timeout_message);
+}
+
+
+static void
+hd_desktop_application_frozen_cancel (HDWM *hdwm, HDWMWindow *win, gpointer data)
+{
+  HDWMApplication *app = hd_wm_window_get_application (win);
+
+  GObject *note = hd_wm_application_get_ping_timeout_note (app);
+
+  gchar *response_message = 
+    g_strdup_printf (HD_DESKTOP_PING_TIMEOUT_RESPONSE_STRING, hd_wm_window_get_name (win));
+
+  if (note && GTK_IS_WIDGET (note))
+    gtk_dialog_response (GTK_DIALOG (note), GTK_RESPONSE_CANCEL);
+
+  /* Show the infoprint */
+  hildon_banner_show_information (NULL, NULL, response_message);
+
+  g_free (response_message);
+}
+
+static void
+hd_desktop_application_died_dialog (HDWM *hdwm, gpointer text, gpointer data)
+{
+  gchar *_text = (gchar *) text;	
+  GtkWidget *dialog;
+	
+  dialog = hildon_note_new_information (NULL, text);
+  
+  gtk_widget_show_all(dialog);
+  gtk_dialog_run(GTK_DIALOG(dialog));
+  gtk_widget_destroy(dialog);
+  
+  g_free (_text);
+}
+
 static void 
-hd_desktop_launch_banner_show (HDWM *hdwm, HDWMApplication *app, gpointer data)
+hd_desktop_launch_banner_show (HDWM *hdwm, gpointer app, gpointer data)
 {
   HDDesktopBannerInfo *info;
   guint                interval;
@@ -127,17 +225,23 @@
   info = g_new0 (HDDesktopBannerInfo, 1);
 
   info->hdwm = hdwm;
-  info->app  = app;
+  info->app  = (HD_WM_IS_APPLICATION (app)) ? app : NULL;
 
   gettimeofday (&info->launch_time, NULL );
 
-  lapp_name = hd_wm_application_get_localized_name (app);
+  lapp_name = (HD_WM_IS_APPLICATION (app)) ? 
+	      hd_wm_application_get_localized_name (app) : app;
 
-  info->msg = 
-    g_strdup_printf (_(hd_wm_application_is_hibernating (app) ?
-                     HDWM_APPLICATION_LAUNCH_BANNER_MSG_RESUMING :
-                     HDWM_APPLICATION_LAUNCH_BANNER_MSG_LOADING),
-                     lapp_name ? _(lapp_name) : "" );
+  if (HD_WM_IS_APPLICATION (app))
+    info->msg = 
+      g_strdup_printf (_(hd_wm_application_is_hibernating (app) ?
+                       HDWM_APPLICATION_LAUNCH_BANNER_MSG_RESUMING :
+                       HDWM_APPLICATION_LAUNCH_BANNER_MSG_LOADING),
+                       lapp_name ? _(lapp_name) : "" );
+  else
+    info->msg =
+      g_strdup_printf (HDWM_APPLICATION_LAUNCH_BANNER_MSG_LOADING,
+	  	       lapp_name ? _(lapp_name) : "" );	      
 
   info->banner = GTK_WIDGET (hildon_banner_show_animation (NULL, NULL, info->msg));
 
@@ -1460,6 +1564,21 @@
 		    G_CALLBACK (hd_desktop_launch_banner_show),
 		    NULL);
 
+  g_signal_connect (hdwm,
+		    "application-died",
+		    G_CALLBACK (hd_desktop_application_died_dialog),
+		    NULL);
+  
+  g_signal_connect (hdwm,
+		    "application-frozen",
+		    G_CALLBACK (hd_desktop_application_frozen),
+		    NULL);
+
+  g_signal_connect (hdwm,
+		    "application-frozen-cancel",
+		    G_CALLBACK (hd_desktop_application_frozen_cancel),
+		    NULL);
+  
   desktop->priv->system_conf_monitor = NULL;
   desktop->priv->user_conf_monitor = NULL;
 


More information about the maemo-commits mailing list