[maemo-commits] [maemo-commits] r8823 - in projects/haf/branches/maemo-af-desktop/hildon-desktop: . libhildondesktop libhildonwm

From: subversion at stage.maemo.org subversion at stage.maemo.org
Date: Tue Dec 19 17:25:58 EET 2006
Author: moimart
Date: 2006-12-19 17:25:57 +0200 (Tue, 19 Dec 2006)
New Revision: 8823

Modified:
   projects/haf/branches/maemo-af-desktop/hildon-desktop/ChangeLog
   projects/haf/branches/maemo-af-desktop/hildon-desktop/libhildondesktop/hn-app-button.c
   projects/haf/branches/maemo-af-desktop/hildon-desktop/libhildondesktop/hn-app-button.h
   projects/haf/branches/maemo-af-desktop/hildon-desktop/libhildondesktop/hn-app-switcher.c
   projects/haf/branches/maemo-af-desktop/hildon-desktop/libhildonwm/hd-keys.c
   projects/haf/branches/maemo-af-desktop/hildon-desktop/libhildonwm/hd-keys.h
Log:

	* libhildondesktop/hn-app-switcher.c:
        * libhildondesktop/hn-app-button.[ch]:
        * libhildonwm/hd-keys.[ch]:
        - Fixes backported from old code: NB#42971,NB#43855,NB#38950,NB#47370.
	* ChangeLog updated.



Modified: projects/haf/branches/maemo-af-desktop/hildon-desktop/ChangeLog
===================================================================
--- projects/haf/branches/maemo-af-desktop/hildon-desktop/ChangeLog	2006-12-19 15:11:19 UTC (rev 8822)
+++ projects/haf/branches/maemo-af-desktop/hildon-desktop/ChangeLog	2006-12-19 15:25:57 UTC (rev 8823)
@@ -1,3 +1,10 @@
+2006-12-19  Moises Martinez  <moises.martinez at nokia.com>
+
+	* libhildondesktop/hn-app-switcher.c:
+	* libhildondesktop/hn-app-button.[ch]:
+	* libhildonwm/hd-keys.[ch]:
+	- Fixes backported from old code: NB#42971,NB#43855,NB#38950,NB#47370.
+
 2006-12-19  Lucas Rocha  <lucas.rocha at nokia.com>
 
 	* src/hd-plugin-loader-factory.c: fix internal registry to really

Modified: projects/haf/branches/maemo-af-desktop/hildon-desktop/libhildondesktop/hn-app-button.c
===================================================================
--- projects/haf/branches/maemo-af-desktop/hildon-desktop/libhildondesktop/hn-app-button.c	2006-12-19 15:11:19 UTC (rev 8822)
+++ projects/haf/branches/maemo-af-desktop/hildon-desktop/libhildondesktop/hn-app-button.c	2006-12-19 15:25:57 UTC (rev 8823)
@@ -162,6 +162,70 @@
 }
 #endif
 
+static GdkPixbuf *
+hn_app_button_class_get_bkilled_emblem (HNAppButtonClass *button_class)
+{
+  GError *error = NULL;
+
+  if (button_class->bkilled_emblem)
+    return g_object_ref (button_class->bkilled_emblem);
+
+  button_class->bkilled_emblem = 
+    gtk_icon_theme_load_icon (gtk_icon_theme_get_default (),
+			      "qgn_indi_bkilled",
+			      APP_GROUP_ICON_SIZE,
+			      0,
+			      &error);
+
+  if (error)
+  {
+    g_warning ("Could not load icon qgn_indi_bkilled: %s", error->message);
+    g_error_free (error);
+  }
+
+  if (button_class->bkilled_emblem)
+    return g_object_ref (button_class->bkilled_emblem);
+
+  return NULL;
+}
+
+static GdkPixbuf *
+hn_app_button_class_get_groupped_emblem (HNAppButtonClass *button_class,
+					 guint n_instances)
+{
+  if (n_instances > app_group_n_icons)
+    n_instances = app_group_n_icons;
+
+  if (button_class->groupped_emblems[n_instances - 1])
+    return g_object_ref (button_class->groupped_emblems[n_instances - 1]);
+  else
+  if (app_group_icons[n_instances - 1])
+  {
+    GError *error = NULL;
+    GtkIconTheme *icon_theme = gtk_icon_theme_get_default ();
+      
+    button_class->groupped_emblems[n_instances - 1] =
+      gtk_icon_theme_load_icon (icon_theme,
+		      		app_group_icons[n_instances - 1],
+				APP_GROUP_ICON_SIZE,
+				0,
+				&error);
+    
+    if (error)
+    {
+      g_warning ("Could not load icon %s: %s",app_group_icons[n_instances - 1],error->message);
+      g_error_free (error);
+      button_class->groupped_emblems[n_instances] = NULL;
+      return NULL;
+    }
+
+    if (button_class->groupped_emblems[n_instances - 1])
+      return g_object_ref (button_class->groupped_emblems[n_instances - 1]);
+  }
+
+  return NULL;
+}
+
 static void
 hn_app_button_icon_animation (GtkWidget *icon, gboolean   turn_on);
 
@@ -911,6 +975,9 @@
 							 G_PARAM_READWRITE));
 
   g_type_class_add_private (gobject_class, sizeof (HNAppButtonPrivate));
+
+  klass->groupped_emblems = g_new0 (GdkPixbuf *, app_group_n_icons);
+  klass->bkilled_emblem = NULL;
 }
 
 static void
@@ -1068,11 +1135,11 @@
 }
 
 static GdkPixbuf *
-compose_app_pixbuf (const GdkPixbuf *src,
-		    HDEntryInfo     *info)
+hn_app_button_compose_app_pixbuf (HNAppButton     *button,
+				  const GdkPixbuf *src,
+				  HDEntryInfo 	  *info)
 {
-  GdkPixbuf *retval, *inst_pixbuf;
-  const gchar *inst_name;
+  GdkPixbuf *retval, *inst_pixbuf = NULL;
   GError *error;
   gint dest_width, dest_height;
   gint off_x, off_y;
@@ -1084,54 +1151,45 @@
 
   /* first of all, see if this app is hibernated */
   if (hd_entry_info_is_hibernating (info))
+    inst_pixbuf = 
+      hn_app_button_class_get_bkilled_emblem (HN_APP_BUTTON_GET_CLASS (button));
+  else 
+  if (hd_entry_info_has_extra_icon (info))
+  {
+    const char *inst_name = hd_entry_info_get_extra_icon (info);
+      
+    if (inst_name)
     {
-      inst_name = "qgn_indi_bkilled";
+      error = NULL;
+      
+      inst_pixbuf = 
+	gtk_icon_theme_load_icon (gtk_icon_theme_get_default (),
+				  inst_name,
+				  APP_GROUP_ICON_SIZE,
+				  0,
+				  &error);
+      if (error)
+      {
+        g_warning ("unable to find icon '%s' "
+		   "in current theme: %s",
+		   inst_name,
+		   error->message);
+	g_error_free (error);
+	return NULL;
+      }
     }
-  else if (hd_entry_info_has_extra_icon (info))
-    {
-      inst_name = hd_entry_info_get_extra_icon (info);
-    }
+  }
   else
-    {
-      gint n_instances = hd_entry_info_get_n_children (info);
-      
-      if (!n_instances)
-        {
-          g_warning ("top-level item '%s' has no instances",
-                     hd_entry_info_peek_title (info));
-          return NULL;
-        }
+  {
+    guint n_instances = hd_entry_info_get_n_children (info);
 
-      if (n_instances == 1)
-        return NULL;
+    inst_pixbuf = 
+      hn_app_button_class_get_groupped_emblem (HN_APP_BUTTON_GET_CLASS (button), n_instances);
+  }
 
-      if (G_LIKELY (n_instances <= app_group_n_icons - 1))
-        inst_name = app_group_icons[n_instances - 1];
-      else
-        inst_name = APP_GROUP_ICON_MORE;
-    }
-  
-  HN_DBG ("Compositing icon for '%s' with icon name '%s'",
-	  hd_entry_info_peek_title (info),
-	  inst_name);
+  if (!inst_pixbuf)
+    return NULL;
 
-  error = NULL;
-  inst_pixbuf = gtk_icon_theme_load_icon (gtk_icon_theme_get_default (),
-		  			  inst_name,
-					  APP_GROUP_ICON_SIZE,
-					  0,
-					  &error);
-  if (error)
-    {
-      g_warning ("unable to find icon '%s' in current theme: %s",
-		 inst_name,
-		 error->message);
-
-      g_error_free (error);
-
-      return NULL;
-    }
-
   /* make a copy of the source pixbuf, and also make
    * sure that it has an alpha channel
    */
@@ -1178,7 +1236,7 @@
 	  /* compose the application icon with the number of
 	   * instances running
 	   */
-	  pixbuf = compose_app_pixbuf (app_pixbuf, info);
+	  pixbuf = hn_app_button_compose_app_pixbuf (button, app_pixbuf, info);
 	  if (pixbuf)
             {
               gtk_image_set_from_pixbuf (GTK_IMAGE (button->priv->icon),
@@ -1246,7 +1304,7 @@
 	  /* compose the application icon with the number of
 	   * instances running
 	   */
-	  pixbuf = compose_app_pixbuf (app_pixbuf, info);
+	  pixbuf = hn_app_button_compose_app_pixbuf (button, app_pixbuf, info);
 	  if (pixbuf)
             {
               gtk_image_set_from_pixbuf (GTK_IMAGE (button->priv->icon),

Modified: projects/haf/branches/maemo-af-desktop/hildon-desktop/libhildondesktop/hn-app-button.h
===================================================================
--- projects/haf/branches/maemo-af-desktop/hildon-desktop/libhildondesktop/hn-app-button.h	2006-12-19 15:11:19 UTC (rev 8822)
+++ projects/haf/branches/maemo-af-desktop/hildon-desktop/libhildondesktop/hn-app-button.h	2006-12-19 15:25:57 UTC (rev 8823)
@@ -65,6 +65,9 @@
 struct _HNAppButtonClass
 {
   GtkToggleButtonClass parent_class;
+
+  GdkPixbuf **groupped_emblems;
+  GdkPixbuf  *bkilled_emblem;
 };
 
 GType hn_app_button_get_type (void) G_GNUC_CONST;

Modified: projects/haf/branches/maemo-af-desktop/hildon-desktop/libhildondesktop/hn-app-switcher.c
===================================================================
--- projects/haf/branches/maemo-af-desktop/hildon-desktop/libhildondesktop/hn-app-switcher.c	2006-12-19 15:11:19 UTC (rev 8822)
+++ projects/haf/branches/maemo-af-desktop/hildon-desktop/libhildondesktop/hn-app-switcher.c	2006-12-19 15:25:57 UTC (rev 8823)
@@ -23,6 +23,10 @@
  *
  */
 
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
 /* Hildon includes */
 #include "hn-app-switcher.h"
 #include "hn-app-button.h"
@@ -59,6 +63,10 @@
 
 #include <libosso.h>
 
+#ifndef HILDON_LIBS
+#include <hildon-widgets/hildon-finger.h>
+#endif 
+
 #include <hildon-widgets/gtk-infoprint.h>
 #include "hildon-pixbuf-anim-blinker.h"
 
@@ -196,7 +204,6 @@
  * HNAppSwitcher
  */
 
-
 enum
 {
   ADD_INFO,
@@ -808,8 +815,11 @@
   g_debug("Main menu button pressed using button %d", event->button);
 
 /*  hd_wm_activate (HN_TN_DEACTIVATE_KEY_FOCUS);*/
-
+#ifndef HILDON_LIBS
   if (event->button == APP_BUTTON_THUMBABLE || event->button == 2)
+#else
+  if (hildon_button_event_is_finger (event))
+#endif
     priv->is_thumbable = TRUE;
   else 
   if (!priv->menu_button_timeout)

Modified: projects/haf/branches/maemo-af-desktop/hildon-desktop/libhildonwm/hd-keys.c
===================================================================
--- projects/haf/branches/maemo-af-desktop/hildon-desktop/libhildonwm/hd-keys.c	2006-12-19 15:11:19 UTC (rev 8822)
+++ projects/haf/branches/maemo-af-desktop/hildon-desktop/libhildonwm/hd-keys.c	2006-12-19 15:25:57 UTC (rev 8823)
@@ -481,7 +481,10 @@
   
   shortcut->mod_mask = mask;
   shortcut->keysym   = ks;
-  shortcut->keycode  = XKeysymToKeycode(GDK_DISPLAY(), ks);
+  gdk_keymap_get_entries_for_keyval (NULL /* default keymap */,
+				     ks,
+				     &shortcut->keycodes,
+				     &shortcut->n_keycodes);
   shortcut->index    = index;
 
   g_debug("'%s' to new shortcut with ks:%li, mask:%i", keystr, ks, mask);
@@ -489,67 +492,82 @@
   return shortcut;
 }
 
+static void
+hd_keys_shortcut_free (HDKeyShortcut *shortcut)
+{
+  g_free (shortcut->keycodes);
+  g_free (shortcut);
+}
 
 static gboolean
-hn_key_shortcut_grab (HDKeysConfig  *keys, 
+hd_key_shortcut_grab (HDKeysConfig  *keys, 
 		      HDKeyShortcut *shortcut,
 		      gboolean       ungrab)
 {
   gint ignored_mask = 0;
+  gint i_keycode;
 
+  if (!shortcut->keycodes)
+    return FALSE;
+
   /* Needed to grab all ignored combo's too if num of scroll lock are on */
-  while (ignored_mask < (int) keys->lock_mask)
-  {                                       
-    if (ignored_mask & ~(keys->lock_mask))
-    {
-      ++ignored_mask;
-      continue;
-    }
+  for (i_keycode = 0; i_keycode < shortcut->n_keycodes; i_keycode++)
+  {
+    while (ignored_mask < (int) keys->lock_mask)
+    {                                       
+      if (ignored_mask & ~(keys->lock_mask))
+      {
+        ++ignored_mask;
+        continue;
+      }
 
-    if (ungrab)
-    {
-      XUngrabKey (GDK_DISPLAY(),
-	          shortcut->keycode, 
-		  shortcut->mod_mask | ignored_mask,
-		  GDK_ROOT_WINDOW());
-    } 
-    else 
-    {
-      gint result; 
+      
+      if (ungrab)
+      {
+        XUngrabKey (GDK_DISPLAY(),
+	            shortcut->keycodes[i_keycode].keycode, 
+		    shortcut->mod_mask | ignored_mask,
+		    GDK_ROOT_WINDOW());
+      } 
+      else 
+      {
+        gint result; 
 
-      gdk_error_trap_push();	  
+        gdk_error_trap_push();	  
 	  
-      XGrabKey (GDK_DISPLAY(),
-		shortcut->keycode,
-		shortcut->mod_mask | ignored_mask,
-		GDK_ROOT_WINDOW(), 
-		False, 
-		GrabModeAsync, 
-		GrabModeAsync);
+        XGrabKey (GDK_DISPLAY(),
+		  shortcut->keycodes[i_keycode].keycode,
+		  shortcut->mod_mask | ignored_mask,
+		  GDK_ROOT_WINDOW(), 
+		  False, 
+		  GrabModeAsync, 
+		  GrabModeAsync);
 	  
-      XSync(GDK_DISPLAY(), False);
+        XSync(GDK_DISPLAY(), False);
 
-      result = gdk_error_trap_pop();
+        result = gdk_error_trap_pop();
 
-      if (result)
-      {
-        /* FIXME: Log below somewhere */
-        if (result == BadAccess)
-	{
-	  g_debug ("Some other program is already using the key %s "
-		   "with modifiers %x as a binding\n",  
- 		   (XKeysymToString (shortcut->keysym)) ? XKeysymToString (shortcut->keysym) : "unknown", 
-	           shortcut->mod_mask | ignored_mask );
-	}
-        else
-	{
-	  g_debug ("Unable to grab the key %s with modifiers %x as a binding\n", 
-		   (XKeysymToString (shortcut->keysym)) ? XKeysymToString (shortcut->keysym) : "unknown", 
-		    shortcut->mod_mask | ignored_mask);
+        if (result)
+        {
+          /* FIXME: Log below somewhere */
+          if (result == BadAccess)
+	  {
+	    g_debug ("Some other program is already using the key %s "
+	  	     "with modifiers %x as a binding\n",  
+ 		     (XKeysymToString (shortcut->keysym)) ? XKeysymToString (shortcut->keysym) : "unknown", 
+	             shortcut->mod_mask | ignored_mask );
+	  }
+          else
+	  {
+	    g_debug ("Unable to grab the key %s with modifiers %x as a binding\n", 
+		     (XKeysymToString (shortcut->keysym)) ? XKeysymToString (shortcut->keysym) : "unknown", 
+		      shortcut->mod_mask | ignored_mask);
+          }
         }
-      }
-    }  
-    ++ignored_mask;
+      }  
+      ++ignored_mask;
+    }
+    ignored_mask = 0;
   }
   
   return TRUE;
@@ -575,7 +593,7 @@
       if ((shortcut = hd_keys_shortcut_new (keys, key_def_str, i)) != NULL)
       {
         g_debug ("Grabbing '%s'", key_def_str);
-        hn_key_shortcut_grab (keys, shortcut, FALSE); 
+        hd_key_shortcut_grab (keys, shortcut, FALSE); 
         keys->shortcuts = g_slist_append (keys->shortcuts, shortcut);
       }
     }
@@ -630,9 +648,9 @@
       if (sc->action == HDKeysActionConfLookup[i].action)
       {
         g_debug ("removing exisiting action %i", sc->action);
-        hn_key_shortcut_grab (keys, sc, TRUE); 
+        hd_key_shortcut_grab (keys, sc, TRUE); 
         keys->shortcuts = g_slist_remove (keys->shortcuts, item->data);
-        g_free (sc);
+        hd_keys_shortcut_free (sc);
         break;
       }
       item = g_slist_next(item);
@@ -651,7 +669,7 @@
         if ((shortcut = hd_keys_shortcut_new (keys, value, i)) != NULL)
         {
   	  g_debug ("now grabbing '%s'", value);
-	  hn_key_shortcut_grab (keys, shortcut, FALSE); 
+	  hd_key_shortcut_grab (keys, shortcut, FALSE); 
 	  keys->shortcuts = g_slist_append (keys->shortcuts, shortcut);
 	}
       }
@@ -680,9 +698,9 @@
   while (shortcut != NULL)
   {
     gpointer data = shortcut->data;
-    hn_key_shortcut_grab (keys, shortcut->data, TRUE);
+    hd_key_shortcut_grab (keys, shortcut->data, TRUE);
     shortcut = g_slist_remove (shortcut, shortcut->data);
-    g_free (data);
+    hd_keys_shortcut_free (data);
   }
 
   keys->shortcuts = NULL;

Modified: projects/haf/branches/maemo-af-desktop/hildon-desktop/libhildonwm/hd-keys.h
===================================================================
--- projects/haf/branches/maemo-af-desktop/hildon-desktop/libhildonwm/hd-keys.h	2006-12-19 15:11:19 UTC (rev 8822)
+++ projects/haf/branches/maemo-af-desktop/hildon-desktop/libhildonwm/hd-keys.h	2006-12-19 15:25:57 UTC (rev 8823)
@@ -81,7 +81,8 @@
 {
   HDKeyAction       action;
   KeySym            keysym;
-  KeyCode           keycode;
+  GdkKeymapKey     *keycodes;
+  gint 		    n_keycodes;
   gint              mod_mask;
   gint              index;
   HDKeysActionFunc  action_func;


More information about the maemo-commits mailing list