[maemo-commits] [maemo-commits] r12398 - in projects/haf/trunk/hildon-desktop: . libhildondesktop

From: subversion at stage.maemo.org subversion at stage.maemo.org
Date: Tue Jun 19 20:45:17 EEST 2007
Author: moimart
Date: 2007-06-19 20:45:15 +0300 (Tue, 19 Jun 2007)
New Revision: 12398

Modified:
   projects/haf/trunk/hildon-desktop/ChangeLog
   projects/haf/trunk/hildon-desktop/libhildondesktop/hildon-desktop-popup-window.c
Log:
2007-06-19  Moises Martinez  <moises.martinez at nokia.com>

        * libhildondesktop/hildon-desktop-popup-window.c:
        - ifdef MAEMO_CHANGES use _TOPLEVEL instead of _POPUP
        - Destroy transfer window for grabing when popping down.
        - Set transiency for NULL when popping down.
        - Don't popdown if not open.
        - Removed fake button press/release event in _release_event handler.
        TBD.
        - Fixes: NB#60558
	* ChangeLog updated.



Modified: projects/haf/trunk/hildon-desktop/ChangeLog
===================================================================
--- projects/haf/trunk/hildon-desktop/ChangeLog	2007-06-19 16:22:56 UTC (rev 12397)
+++ projects/haf/trunk/hildon-desktop/ChangeLog	2007-06-19 17:45:15 UTC (rev 12398)
@@ -1,3 +1,14 @@
+2007-06-19  Moises Martinez  <moises.martinez at nokia.com>
+
+	* libhildondesktop/hildon-desktop-popup-window.c:
+	- ifdef MAEMO_CHANGES use _TOPLEVEL instead of _POPUP
+	- Destroy transfer window for grabing when popping down.
+	- Set transiency for NULL when popping down.
+	- Don't popdown if not open.
+	- Removed fake button press/release event in _release_event handler.
+	TBD.
+	- Fixes: NB#60558
+
 2007-06-19  Johan Bilien  <johan.bilien at nokia.com>
 
 	* libhildondesktop/hildon-home-window.c:

Modified: projects/haf/trunk/hildon-desktop/libhildondesktop/hildon-desktop-popup-window.c
===================================================================
--- projects/haf/trunk/hildon-desktop/libhildondesktop/hildon-desktop-popup-window.c	2007-06-19 16:22:56 UTC (rev 12397)
+++ projects/haf/trunk/hildon-desktop/libhildondesktop/hildon-desktop-popup-window.c	2007-06-19 17:45:15 UTC (rev 12398)
@@ -33,9 +33,11 @@
 #include <config.h>
 #endif
 
+#ifdef MAEMO_CHANGES
 #ifdef HAVE_XTEST
 #include <X11/extensions/XTest.h>
 #endif
+#endif
 
 #define HILDON_DESKTOP_POPUP_WINDOW_GET_PRIVATE(object) \
         (G_TYPE_INSTANCE_GET_PRIVATE ((object), HILDON_DESKTOP_TYPE_POPUP_WINDOW, HildonDesktopPopupWindowPrivate))
@@ -82,11 +84,11 @@
 
 static gboolean hildon_desktop_popup_window_motion_notify (GtkWidget *widget, GdkEventMotion *event);
 static gboolean hildon_desktop_popup_window_leave_notify (GtkWidget *widget, GdkEventCrossing *event);
-
+#ifdef MAEMO_CHANGES
 static gboolean hildon_desktop_popup_window_visibility_notify (GtkWidget          *widget,
 				                               GdkEventVisibility *event,
 			        		               gpointer            data);
-
+#endif
 static gboolean hildon_desktop_popup_window_composited_leave_notify (GtkWidget *widget,
 						     		     GdkEventCrossing *event,
 						     		     HildonDesktopPopupWindow *popup);
@@ -98,9 +100,11 @@
 static gboolean popup_grab_on_window (GdkWindow *window, guint32 activate_time, gboolean grab_keyboard);
 
 static gboolean hildon_desktop_popup_window_button_release_event (GtkWidget *widget, GdkEventButton *event);
+#ifdef MAEMO_CHANGES
 #ifdef HAVE_XTEST
 static void hildon_desktop_popup_menu_fake_button_event (GdkEventButton *event, gboolean press);
 #endif
+#endif
 struct _HildonDesktopPopupWindowPrivate 
 {
   GtkWidget	   	          **extra_panes;
@@ -112,6 +116,7 @@
   gpointer			    position_func_data;
 
   gboolean 			    have_xgrab;
+  gboolean			    open;
   GtkWidget 			   *pane_with_grab;
 
   GtkWidget			   *attached_widget;
@@ -125,6 +130,7 @@
   popup->priv->extra_panes   = NULL;
   popup->priv->n_extra_panes = 0;
 
+  popup->priv->open = 
   popup->priv->have_xgrab = FALSE; 
 
   popup->priv->pane_with_grab  =
@@ -244,24 +250,38 @@
                                                                                    params);
 
   popup = HILDON_DESKTOP_POPUP_WINDOW (object);
-
+#ifndef MAEMO_CHANGES
   GTK_WINDOW (popup)->type = GTK_WINDOW_POPUP;
+#else
+  GTK_WINDOW (popup)->type = GTK_WINDOW_TOPLEVEL;
 
+  gtk_window_set_decorated (GTK_WINDOW (popup), FALSE);
+  gtk_widget_add_events (GTK_WIDGET (popup), GDK_VISIBILITY_NOTIFY_MASK);
+#endif
+	  
   gtk_window_set_type_hint (GTK_WINDOW (popup), GDK_WINDOW_TYPE_HINT_MENU);
 
+#ifdef MAEMO_CHANGES
   g_signal_connect (popup,
 		    "visibility-notify-event",
 		    G_CALLBACK (hildon_desktop_popup_window_visibility_notify),
 		    NULL);
-
+#endif
   gtk_widget_push_composite_child ();
 
   popup->priv->extra_panes = g_new0 (GtkWidget *, popup->priv->n_extra_panes);
 
   for (i=0; i < popup->priv->n_extra_panes; i++)
   {	  
+#ifndef MAEMO_CHANGES	  
     popup->priv->extra_panes[i] = gtk_window_new (GTK_WINDOW_POPUP);
+#else
+    popup->priv->extra_panes[i] = gtk_window_new (GTK_WINDOW_TOPLEVEL);
 
+    gtk_window_set_decorated (GTK_WINDOW (popup->priv->extra_panes[i]), FALSE);
+
+    gtk_widget_add_events (GTK_WIDGET (popup), GDK_VISIBILITY_NOTIFY_MASK);
+#endif
     g_object_ref (G_OBJECT (popup->priv->extra_panes[i]));
     gtk_object_sink (GTK_OBJECT (popup->priv->extra_panes[i]));		 
 
@@ -339,7 +359,10 @@
   GTK_WIDGET_CLASS (hildon_desktop_popup_window_parent_class)->show (widget);
 
   for (i=0; i < popup->priv->n_extra_panes; i++)
-    gtk_widget_show (popup->priv->extra_panes[i]);
+  {
+    if (popup->priv->extra_panes[i]->requisition.height > 1)	  
+      gtk_widget_show (popup->priv->extra_panes[i]);
+  }
 }
 
 static void 
@@ -522,7 +545,7 @@
 
   return TRUE;
 }
-
+#ifdef MAEMO_CHANGES
 static gboolean
 hildon_desktop_popup_window_visibility_notify (GtkWidget          *widget,
 		                               GdkEventVisibility *event,
@@ -567,7 +590,7 @@
        type = gdk_window_get_type_hint (win);
  
       if (!gdk_error_trap_pop () && 
- 	  /*type != GDK_WINDOW_TYPE_HINT_MESSAGE && */
+ 	  type != GDK_WINDOW_TYPE_HINT_NOTIFICATION && 
           type != GDK_WINDOW_TYPE_HINT_MENU)
       {
         /* A non-message and non-menu window above us; close. */
@@ -590,7 +613,7 @@
 
   return FALSE;
 }
-
+#endif
 static gboolean
 hildon_desktop_popup_window_composited_button_release (GtkWidget *widget,
                                                        GdkEventButton *event,
@@ -614,12 +637,12 @@
   {
      w = GTK_WIDGET (popup)->allocation.width;
      h = GTK_WIDGET (popup)->allocation.height;
-
+      
      gtk_widget_get_pointer (widget, &x, &y);
 
      if ((x >= 0) && (x <= w) && (y >= 0) && (y <= h))
        in_window_area = TRUE;
-
+	  
      for (i=0; i < popup->priv->n_extra_panes; i++)
      {
        if (widget != popup->priv->extra_panes[i])
@@ -642,6 +665,7 @@
   if (!in_panes_area || in_window_area)
   {	  
     hildon_desktop_popup_window_popdown (popup);
+#ifdef MAEMO_CHANGES    
 #ifdef HAVE_XTEST
     if (popup->priv->attached_widget)
     {	    
@@ -657,6 +681,7 @@
       }
     }
 #endif
+#endif    
   }
   
   return TRUE;
@@ -696,11 +721,12 @@
        break;
      }
   }
-
+g_debug ("event %p skdfjhskdjfh in_w %d",event,in_window_area);
   /* Event outside of popup or in button area, close in clean way */
-  if (!in_panes_area || in_window_area)
+  if (!in_panes_area || !in_window_area)
   {	  
     hildon_desktop_popup_window_popdown (popup);
+#ifdef MAEMO_CHANGES    
 #ifdef HAVE_XTEST
     if (popup->priv->attached_widget)
     {	    
@@ -711,11 +737,12 @@
       
       if ((x < 0) || (x > w) || (y < 0) || (y > h))
       {	      
-        hildon_desktop_popup_menu_fake_button_event (event, TRUE);	      
-        hildon_desktop_popup_menu_fake_button_event (event, FALSE);
+        /*hildon_desktop_popup_menu_fake_button_event (event, TRUE);	      
+        hildon_desktop_popup_menu_fake_button_event (event, FALSE);*/
       }
     }
 #endif
+#endif    
   }
   return TRUE;
 }
@@ -885,6 +912,18 @@
   return window;
 }
 
+static void
+popup_window_grab_transfer_window_destroy (HildonDesktopPopupWindow *popup)
+{
+  GdkWindow *window = g_object_get_data (G_OBJECT (popup), "popup-window-transfer-window");
+  if (window)
+  {
+    gdk_window_set_user_data (window, NULL);
+    gdk_window_destroy (window);
+    g_object_set_data (G_OBJECT (popup), "popup-window-transfer-window", NULL);
+  }
+}
+
 static gboolean
 popup_grab_on_window (GdkWindow *window,
                       guint32    activate_time,
@@ -1048,21 +1087,39 @@
   gtk_grab_add (GTK_WIDGET (popup));
 
   g_signal_emit_by_name (popup, "popup-window");
+
+  popup->priv->open = TRUE;
 }
 
 void 
 hildon_desktop_popup_window_popdown (HildonDesktopPopupWindow *popup)
 {
   gint i;
-	
+
+  if (!popup->priv->open)
+    return;	  
+
   gtk_widget_hide (GTK_WIDGET (popup));
+  
+  if (popup->priv->have_xgrab)
+  {	  
+    gtk_grab_remove (GTK_WIDGET (popup));
+    gtk_window_set_transient_for (GTK_WINDOW (popup), NULL);  
+  }
+  else
+  {	  
+    for (i=0; i < popup->priv->n_extra_panes; i++)
+    {	    
+      gtk_grab_remove (popup->priv->extra_panes[i]);	  
+      gtk_window_set_transient_for (GTK_WINDOW (popup->priv->extra_panes[i]), NULL);
+    }
+  }
 
-  gtk_grab_remove (GTK_WIDGET (popup));
+  popup_window_grab_transfer_window_destroy (popup);
 
-  for (i=0; i < popup->priv->n_extra_panes; i++)
-    gtk_grab_remove (popup->priv->extra_panes[i]);	  
+  g_signal_emit_by_name (popup, "popdown-window");
 
-  g_signal_emit_by_name (popup, "popdown-window");
+  popup->priv->open = FALSE;
 }
 
 void 


More information about the maemo-commits mailing list