[meego-commits] 24321: Changes to MeeGo:1.2.0:oss:Update:Testing/meego-panel-applications

michaelwood no_reply at build.meego.com
Thu Oct 20 10:03:13 UTC 2011


Hi,
I have made the following changes to meego-panel-applications in project MeeGo:1.2.0:oss:Update:Testing. Please review and accept ASAP.

Thank You,
michaelwood

[This message was auto-generated]

---

Request #24321:

  submit:   home:michaelwood:branches:MeeGo:1.2.0:oss:Update:Testing/meego-panel-applications(r3)(noupdate) -> MeeGo:1.2.0:oss:Update:Testing/meego-panel-applications


Message:
    None

State:   new          2011-10-20T02:50:30 michaelwood
Comment: None



changes files:
--------------
--- meego-panel-applications.changes
+++ meego-panel-applications.changes
@@ -0,0 +1,7 @@
+* Wed Oct 19 2011 Michael Wood <michael.g.wood at linux.intel.com> - 0.2.7
+ - Update to version 0.2.7
+ - Fixes BMC#23079
+ - Fixes BMC#23534
+ - Fixes BMC#23080
+ - Fixes BMC#23082
+

old:
----
  meego-panel-applications-0.2.6.tar.gz

new:
----
  meego-panel-applications-0.2.7.tar.gz

spec files:
-----------
--- meego-panel-applications.spec
+++ meego-panel-applications.spec
@@ -7,7 +7,7 @@
 
 Name:       meego-panel-applications
 Summary:    Applications panel
-Version:    0.2.6
+Version:    0.2.7
 Release:    1
 Group:      System/Desktop
 License:    LGPL 2.1

other changes:
--------------

++++++ meego-panel-applications-0.2.6.tar.gz -> meego-panel-applications-0.2.7.tar.gz
--- configure
+++ configure
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.68 for meego-panel-applications 0.2.6.
+# Generated by GNU Autoconf 2.68 for meego-panel-applications 0.2.7.
 #
 #
 # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
@@ -706,8 +706,8 @@
 # Identity of this package.
 PACKAGE_NAME='meego-panel-applications'
 PACKAGE_TARNAME='meego-panel-applications'
-PACKAGE_VERSION='0.2.6'
-PACKAGE_STRING='meego-panel-applications 0.2.6'
+PACKAGE_VERSION='0.2.7'
+PACKAGE_STRING='meego-panel-applications 0.2.7'
 PACKAGE_BUGREPORT=''
 PACKAGE_URL=''
 
@@ -1482,7 +1482,7 @@
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures meego-panel-applications 0.2.6 to adapt to many kinds of systems.
+\`configure' configures meego-panel-applications 0.2.7 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1553,7 +1553,7 @@
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of meego-panel-applications 0.2.6:";;
+     short | recursive ) echo "Configuration of meego-panel-applications 0.2.7:";;
    esac
   cat <<\_ACEOF
 
@@ -1665,7 +1665,7 @@
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-meego-panel-applications configure 0.2.6
+meego-panel-applications configure 0.2.7
 generated by GNU Autoconf 2.68
 
 Copyright (C) 2010 Free Software Foundation, Inc.
@@ -2030,7 +2030,7 @@
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by meego-panel-applications $as_me 0.2.6, which was
+It was created by meego-panel-applications $as_me 0.2.7, which was
 generated by GNU Autoconf 2.68.  Invocation command line was
 
   $ $0 $@
@@ -2846,7 +2846,7 @@
 
 # Define the identity of the package.
  PACKAGE='meego-panel-applications'
- VERSION='0.2.6'
+ VERSION='0.2.7'
 
 
 # Some tools Automake needs.
@@ -13253,13 +13253,13 @@
                   gio-unix-2.0
                   gtk+-2.0
                   libgnome-menu
-                  mx-1.0 >= 0.99.0\""; } >&5
+                  mx-1.0 >= 1.4.0\""; } >&5
   ($PKG_CONFIG --exists --print-errors "clutter-x11-1.0
                   gdk-x11-2.0
                   gio-unix-2.0
                   gtk+-2.0
                   libgnome-menu
-                  mx-1.0 >= 0.99.0") 2>&5
+                  mx-1.0 >= 1.4.0") 2>&5
   ac_status=$?
   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; }; then
@@ -13268,7 +13268,7 @@
                   gio-unix-2.0
                   gtk+-2.0
                   libgnome-menu
-                  mx-1.0 >= 0.99.0" 2>/dev/null`
+                  mx-1.0 >= 1.4.0" 2>/dev/null`
 else
   pkg_failed=yes
 fi
@@ -13284,13 +13284,13 @@
                   gio-unix-2.0
                   gtk+-2.0
                   libgnome-menu
-                  mx-1.0 >= 0.99.0\""; } >&5
+                  mx-1.0 >= 1.4.0\""; } >&5
   ($PKG_CONFIG --exists --print-errors "clutter-x11-1.0
                   gdk-x11-2.0
                   gio-unix-2.0
                   gtk+-2.0
                   libgnome-menu
-                  mx-1.0 >= 0.99.0") 2>&5
+                  mx-1.0 >= 1.4.0") 2>&5
   ac_status=$?
   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; }; then
@@ -13299,7 +13299,7 @@
                   gio-unix-2.0
                   gtk+-2.0
                   libgnome-menu
-                  mx-1.0 >= 0.99.0" 2>/dev/null`
+                  mx-1.0 >= 1.4.0" 2>/dev/null`
 else
   pkg_failed=yes
 fi
@@ -13322,14 +13322,14 @@
                   gio-unix-2.0
                   gtk+-2.0
                   libgnome-menu
-                  mx-1.0 >= 0.99.0" 2>&1`
+                  mx-1.0 >= 1.4.0" 2>&1`
         else
 	        APPLICATIONS_PKG_ERRORS=`$PKG_CONFIG --print-errors "clutter-x11-1.0
                   gdk-x11-2.0
                   gio-unix-2.0
                   gtk+-2.0
                   libgnome-menu
-                  mx-1.0 >= 0.99.0" 2>&1`
+                  mx-1.0 >= 1.4.0" 2>&1`
         fi
 	# Put the nasty error message in config.log where it belongs
 	echo "$APPLICATIONS_PKG_ERRORS" >&5
@@ -13339,7 +13339,7 @@
                   gio-unix-2.0
                   gtk+-2.0
                   libgnome-menu
-                  mx-1.0 >= 0.99.0) were not met:
+                  mx-1.0 >= 1.4.0) were not met:
 
 $APPLICATIONS_PKG_ERRORS
 
@@ -13999,7 +13999,7 @@
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by meego-panel-applications $as_me 0.2.6, which was
+This file was extended by meego-panel-applications $as_me 0.2.7, which was
 generated by GNU Autoconf 2.68.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -14065,7 +14065,7 @@
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
-meego-panel-applications config.status 0.2.6
+meego-panel-applications config.status 0.2.7
 configured by $0, generated by GNU Autoconf 2.68,
   with options \\"\$ac_cs_config\\"
 
--- configure.ac
+++ configure.ac
@@ -1,5 +1,5 @@
 AC_PREREQ(2.53)
-AC_INIT(meego-panel-applications, 0.2.6)
+AC_INIT(meego-panel-applications, 0.2.7)
 AC_CONFIG_AUX_DIR([build])
 AC_CONFIG_MACRO_DIR([build])
 AM_INIT_AUTOMAKE([1.10 foreign -Wno-portability no-define])
@@ -39,7 +39,7 @@
                   gio-unix-2.0
                   gtk+-2.0
                   libgnome-menu
-                  mx-1.0 >= 0.99.0)
+                  mx-1.0 >= 1.4.0)
 
 AC_ARG_ENABLE([cache],
               [AC_HELP_STRING([--enable-cache],
--- data/theme/Makefile.am
+++ data/theme/Makefile.am
@@ -5,6 +5,7 @@
 	apps-normal.png \
 	panel.css \
 	clear-entry.png \
+	clear-entry-hover.png \
   content-pane-background.png \
   content-pane-header.png \
 	launcher-button-fav-toggle-active.png \
--- data/theme/Makefile.in
+++ data/theme/Makefile.in
@@ -231,6 +231,7 @@
 	apps-normal.png \
 	panel.css \
 	clear-entry.png \
+	clear-entry-hover.png \
   content-pane-background.png \
   content-pane-header.png \
 	launcher-button-fav-toggle-active.png \
--- data/theme/clear-entry-hover.png
+++ data/theme/clear-entry-hover.png
+‰PNG
+
+
IHDRB 
•	pHYsšœ
+OiCCPPhotoshop ICC profilexڝSgTSé=÷ÞôBKˆ€”KoR RB‹€‘&*!	Jˆ!¡ÙQÁEEÈ ˆŽŽ€ŒQ,Š
+Øä!¢Žƒ£ˆŠÊûá{£kÖ¼÷æÍþµ×>ç¬ó³ÏÀ–H3Q5€©B
àƒÇÄÆáä.@
+$p³d!sý#ø~<<+"À¾xÓÀM›À0
‡ÿêB™\€„Àt‘8K€@zŽB¦@F€˜&S `ËcbãP-`'æÓ€ø™{[”! ‘ eˆDh;¬ÏVŠEX0fKÄ9Ø-0IWfH°·Àβ0Qˆ
){`È##x„™FòW<ñ+®ç*x™²<¹$9E[-qWW.
(ÎI+6aaš@.Ây™24àóÌ ‘àƒóýxήÎÎ6޶_-ê¿ÿ"bbãþåÏ«p@át~Ñþ,/³€;€mþ¢%îh^ u÷‹f²@µ éÚWópø~<<E¡¹ÙÙåääØJÄB[aÊW}þgÂ_ÀWýlù~<ü÷õà¾â$2]GøàÂÌôL¥
Ï’	„bÜæGü·ÿü
Ó"ÄIb¹X*ãQqŽDšŒó2¥"‰B’)Å%Òÿdâß,û>ß5°j>{‘-¨]cöK'XtÀâ÷ò»oÁÔ(€hƒáÏwÿï?ýG %€fI’q^D$.Tʳ?ÇD *°AôÁ,À
ÁÜÁü`6„B$ÄÂBB
+d€
r`)¬‚B(†Í°
*`/Ô@
4ÀQh†“p.ÂU¸=púažÁ(¼	AÈa!ÚˆbŠX#Ž™
ø!ÁH‹$ ɈQ"K‘5H1RŠT UH
ò=r9‡\Fº‘;È2‚ü†¼G1”²Q=ÔµC¹¨7„F¢Ðdt1š ›Ðr´=Œ6¡çЫhڏ>CÇ0Àè3Äl0.ÆÃB±8,	“c˱"¬«Æ°V¬»‰õcϱwEÀ	6wB a
AHXLXNØH¨ 
$4Ú	7	„QÂ'"“¨K´&ºùÄb21‡XH,#֏/{ˆCÄ7$‰C2'¹I±¤TÒÒFÒnR#é,©›4H#“ÉÚdk²9”, +È
ääÃä3ää!ò[
+b at q¤øSâ(RÊjJåå4åe˜2AU£šRݨ¡T5ZB­¡¶R¯Q‡¨4uš9̓IK¥­¢•Óhh÷i¯ètºÝ•
N—ÐWÒËéGè—èôw
†ƒÇˆg(›gw¯˜L¦Ó‹ÇT071ë˜ç™™oUX*¶*|‘Ê
+•J•&•*/T©ª¦ªÞªUóUËT©^S}®FU3Sã©	Ô–«UªPëSSg©;¨‡ªg¨oT?¤~Yý‰YÃLÃOC¤Q ±_ã¼Æ c³x,!k
«†u5Ä&±ÍÙ|v*»˜ý
»‹=ª©¡9C3J3W³Ró”f?ã˜qøœtN	ç(§—ó~ŠÞï)â)¦4L¹1e\kª–—–X«H«Q«Gë½6®í§¦½E»YûAÇJ'\'GgÎçSÙSݧ
+§M=:õ®.ªk¥¡»Dw¿n§î˜ž¾^€žLo§Þy½çú
}/ýTýmú§õGX³$ÛÎ<Å5qo<
/ÇÛñQC]Ã@C¥a•a—á„‘¹Ñ<£ÕFFŒiÆ\ã$ãmÆmÆ£&&!&KMêMîšRM¹¦)¦;L;LÇÍÌÍ¢ÍÖ™5›=1×2ç›ç›×›ß·`ZxZ,¶¨¶¸eI²äZ¦Yî¶¼n
Z9Y¥XUZ]³F­­%Ö»­»§§¹N“N«žÖgðñ¶É¶©·°åØÛ®¶m¶}agbg·Å®Ã“}º}ý=
‡Ù«
Z
~s´r:V:ޚΜî?}Åô–é/gXÏÏØ3ã¶Ë)ÄiS›ÓGgg¹sƒóˆ‹‰K‚Ë.—>.›ÆÝȽäJtõq]ázÒõ›³›Âí¨Û¯î6îiî‡ÜŸÌ4Ÿ)žY3sÐÃÈCàQåÑ?Ÿ•0k߬~OCOgµç#/c/‘W­×°·¥wª÷aï>ö>rŸã>ã<7Þ2ÞY_Ì7À·È·ËOÃož_
ßC#ÿdÿzÿѧ€%g‰A[ûøz|!¿Ž?:Ûeö²ÙíAŒ ¹AA‚­‚åÁ­!hÈ쐭!÷ç˜Î‘Îi
P~èÖÐaæa‹Ã~'
‡
W†?ŽpˆXÑ1—5wÑÜCsßDúD–DÞ›g1O9¯-J5*>ª.j<Ú7º4º?Æ.fYÌÕXXIlK
9.*®6nl¾ßüíó‡ââã{˜/È]py¡ÎÂô
§©.,:–@LˆN8”ðA*¨Œ%òw%Ž
+yÂ
Âg"/Ñ6шØC\*
NòH*Mz’쑼5y$Å3¥,幄'©¼L
LÝ›:žšv m2=:½1ƒ’‘qBª!M“¶gêgæfvˬe
²þÅn‹·/
•Ék³¬Y-
+¶B¦èTZ(×*²geWf¿Í‰Ê9–«ž+Íí̳Êې7œïŸÿíÂá’¶¥†KW-
X潬j9²<qyÛ
+ã+†V¬<¸Š¶*mÕO«íW—®~½&zMk^ÁÊ‚ÁµkëU
+å
}ëÜ×í]OX/Yßµaú†>‰Š®Û—Ø(Üxå‡oÊ¿™Ü”´©«Ä¹dÏfÒféæÞ-ž[–ª—æ—n
ÙÚ´
ßV´íõöEÛ/—Í(Û»ƒ¶C¹£¿<¸¼e§ÉÎÍ;?T¤TôTúT6îÒݵa×ønÑî{¼ö4ìÕÛ[¼÷ý>ɾÛUUMÕfÕeûIû³÷?®‰ªéø–ûm]­NmqíÇÒý#¶×¹ÔÕ
Ò=TRÖ+ëGǾþïw-
6
UœÆâ#pDyäé÷	ß÷

:ÚvŒ{¬áÓv
g
/jBšòšF›Sšû[b[ºOÌ>ÑÖêÞzüGÛœ4<YyJóTÉiÚé‚Ó“gòÏŒ•}~.ùÜ`Û¢¶{çcÎßjoïºtáÒEÿ‹ç;¼;Î\ò¸tò²ÛåW¸Wš¯:_mêtê<þ“ÓOÇ»œ»š®¹\k¹îz½µ{f÷éž7ÎÝô½yñÿÖÕž9=ݽózo÷Å÷õßÝ~r'ýÎË»Ùw'î­¼O¼_ô@íAÙC݇Õ?[þÜØïÜjÀw óÑÜG÷
ƒÏþ‘õC™Ë†
†ëž8>99â?rýéü§CÏdÏ&žþ¢þË®/~øÕë×Îјѡ—ò—“¿m|¥ýêÀë¯ÛÆÂÆ
¾Éx31^ôVûíÁwÜw
ï£ßOä| (ÿhù±õSЧû“““ÿ˜óüc3-Û cHRMz%€ƒùÿ€éu0ê`:˜o’_ÅFðIDATxÚ´”ÁnA€¿Îl€%&ìîA°»ÀÑÐ'Ðci‰oáµÇ^}ƒVÛÔTí˜x2žKÔÞjbd1´˜60»ëA$­°„ZúŸ&óÏ|3ùþfn}sÀž·ãÿ‰*ð
xT5à&ð°¸\Ø@Xn`uгa«bp¬cQ‰+_“²]¥ÆÎ÷z=|ߟHÖÆMA@Ãu‰ë:ÍfÃ4‰Çã4\— PJa˜&‰Dbzpëø˜B>ǽ»wøøé3Û¯v°
‡Ó“
{žÒR‘j­ÆÚ³PðX1]ç[¥‚çyò¹? JÇžg¹ø!ÕjX,ªbn}s+—h¸.7RI
—–‘RòõðǶ‘R²W.³óz—L6K4þÆ×“I¾×]^l¿Äó<²™Ì9¨“N‡B'‚‡Äù%RjÃOÜ–ø«¢´TDJÉÁÁ—ç*¤
CÁívÓ0†~÷ÊeÖžoµò9
>¸O«ÕºX)EÚqFœžužv
T§s±®ð}ŸÑH„Îà!èº>Tä{

¥0-Ã0¦ B’©¿º]Ëé–~¿b¤°ÿªø–Œ„´“¦i¡À©Þ]ÁïöV+ÀÑ¡GÀŠöà
P¿°>`,û¿Ì5À#.PpIEND®B`‚--- data/theme/panel.css
+++ data/theme/panel.css
@@ -87,3 +87,8 @@
   background-image: url("launcher-button-fav-toggle-hover.png");
 }
 
+MxLabel.placeholder {
+  color: #595959ff;
+  font-size: 16px;
+  padding: 6 6 6 15;
+}
--- src/Makefile.am
+++ src/Makefile.am
@@ -12,8 +12,6 @@
 meego_panel_applications_LDADD = $(APPLICATIONS_LIBS) $(MPL_LIBS)
 
 meego_panel_applications_SOURCES = \
-  mnb-entry.c \
-  mnb-entry.h \
   mnb-expander.c \
   mnb-expander.h \
   mnb-filter.c \
--- src/Makefile.in
+++ src/Makefile.in
@@ -53,9 +53,8 @@
 CONFIG_CLEAN_VPATH_FILES =
 am__installdirs = "$(DESTDIR)$(libexecdir)" "$(DESTDIR)$(servicedir)"
 PROGRAMS = $(libexec_PROGRAMS)
-am_meego_panel_applications_OBJECTS = mnb-entry.$(OBJEXT) \
-	mnb-expander.$(OBJEXT) mnb-filter.$(OBJEXT) \
-	mnb-launcher-application.$(OBJEXT) \
+am_meego_panel_applications_OBJECTS = mnb-expander.$(OBJEXT) \
+	mnb-filter.$(OBJEXT) mnb-launcher-application.$(OBJEXT) \
 	mnb-launcher-button.$(OBJEXT) mnb-launcher-grid.$(OBJEXT) \
 	mnb-launcher-tree.$(OBJEXT) meego-netbook-launcher.$(OBJEXT) \
 	meego-panel-applications.$(OBJEXT)
@@ -272,8 +271,6 @@
 
 meego_panel_applications_LDADD = $(APPLICATIONS_LIBS) $(MPL_LIBS)
 meego_panel_applications_SOURCES = \
-  mnb-entry.c \
-  mnb-entry.h \
   mnb-expander.c \
   mnb-expander.h \
   mnb-filter.c \
@@ -384,7 +381,6 @@
 
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/meego-netbook-launcher.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/meego-panel-applications.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/mnb-entry.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/mnb-expander.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/mnb-filter.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/mnb-launcher-application.Po at am__quote@
--- src/meego-netbook-launcher.c
+++ src/meego-netbook-launcher.c
@@ -58,6 +58,8 @@
 #define LAUNCHER_BUTTON_HEIGHT     65
 #define LAUNCHER_BUTTON_ICON_SIZE  48
 
+#define PLACEHOLDER_TEXT _("To see your favourite applications here and on the myzone, hover your pointer over the application you want to add and select the pin in the top right.")
+
 #define REAL_GET_PRIVATE(obj) \
         (G_TYPE_INSTANCE_GET_PRIVATE ((obj), MNB_TYPE_LAUNCHER, MnbLauncherPrivate))
 
@@ -79,6 +81,7 @@
 enum
 {
   LAUNCHER_ACTIVATED,
+  COMMANDLINE_LAUNCH_ACTIVATED,
 
   LAST_SIGNAL
 };
@@ -102,6 +105,7 @@
   MxExpander              *first_expander;
   GSList                  *launchers;
   gboolean                 show_expanders;
+  guint                   fav_grid_items;
 
   /* Static widgets, managed by clutter. */
   ClutterActor            *filter_hbox;
@@ -109,6 +113,7 @@
   ClutterActor            *scrollview;
   MxExpander              *default_expander;
   ClutterActor            *fav_grid;
+  ClutterActor            *placeholder_label;
 
   /* "Dynamic" widgets (browser vs. filter mode).
    * These are explicitely ref'd and destroyed. */
@@ -136,43 +141,6 @@
 }
 
 static void
-launcher_button_hovered_cb (MnbLauncherButton  *launcher,
-                            MnbLauncher        *self)
-{
-  MnbLauncherPrivate *priv = GET_PRIVATE (self);
-  MxWidget *expander;
-
-  if (priv->is_filtering)
-    {
-      const GSList *launchers_iter;
-      for (launchers_iter = priv->launchers;
-           launchers_iter;
-           launchers_iter = launchers_iter->next)
-        {
-          mx_stylable_set_style_pseudo_class (MX_STYLABLE (launchers_iter->data),
-                                              NULL);
-        }
-    }
-  else
-    {
-      clutter_container_foreach (CLUTTER_CONTAINER (priv->fav_grid),
-                                 (ClutterCallback) mx_stylable_set_style_pseudo_class,
-                                 NULL);
-
-      expander = mnb_launcher_grid_find_widget_by_pseudo_class (
-                  MNB_LAUNCHER_GRID (priv->apps_grid),
-                  "active");
-      if (expander)
-        {
-          ClutterActor *inner_grid = mx_bin_get_child (MX_BIN (expander));
-          clutter_container_foreach (CLUTTER_CONTAINER (inner_grid),
-                                     (ClutterCallback) mx_stylable_set_style_pseudo_class,
-                                     NULL);
-        }
-    }
-}
-
-static void
 launcher_button_activated_cb (MnbLauncherButton  *launcher,
                               MnbLauncher        *self)
 {
@@ -202,9 +170,6 @@
       MxWidget *clone = mnb_launcher_button_create_favorite (launcher);
       clutter_container_add (CLUTTER_CONTAINER (priv->fav_grid),
                              CLUTTER_ACTOR (clone), NULL);
-      g_signal_connect (clone, "hovered",
-                        G_CALLBACK (launcher_button_hovered_cb),
-                        self);
       g_signal_connect (clone, "activated",
                         G_CALLBACK (launcher_button_activated_cb),
                         self);
@@ -346,8 +311,6 @@
         {
           if (e != expander)
             {
-              ClutterActor *inner_grid = mx_bin_get_child (MX_BIN (e));
-              mnb_launcher_grid_keynav_out (MNB_LAUNCHER_GRID (inner_grid));
               mx_expander_set_expanded (e, FALSE);
             }
         }
@@ -548,9 +511,6 @@
 
           clutter_container_add (CLUTTER_CONTAINER (inner_grid),
                                   CLUTTER_ACTOR (button), NULL);
-          g_signal_connect (button, "hovered",
-                            G_CALLBACK (launcher_button_hovered_cb),
-                            self);
           g_signal_connect (button, "activated",
                             G_CALLBACK (launcher_button_activated_cb),
                             self);
@@ -641,9 +601,6 @@
                                              button);
                 }
 
-              g_signal_connect (button, "hovered",
-                                G_CALLBACK (launcher_button_hovered_cb),
-                                self);
               g_signal_connect (button, "activated",
                                 G_CALLBACK (launcher_button_activated_cb),
                                 self);
@@ -736,9 +693,6 @@
                                                 TRUE);
               clutter_container_add (CLUTTER_CONTAINER (priv->fav_grid),
                                      CLUTTER_ACTOR (button), NULL);
-              g_signal_connect (button, "hovered",
-                                G_CALLBACK (launcher_button_hovered_cb),
-                                self);
               g_signal_connect (button, "activated",
                                 G_CALLBACK (launcher_button_activated_cb),
                                 self);
@@ -853,6 +807,7 @@
         }
 
       /* Perform search. */
+
       for (iter = priv->launchers; iter; iter = iter->next)
         {
           MnbLauncherButton *button = MNB_LAUNCHER_BUTTON (iter->data);
@@ -961,14 +916,6 @@
   G_OBJECT_CLASS (mnb_launcher_parent_class)->dispose (object);
 }
 
-static void
-_key_focus_in (ClutterActor *actor)
-{
-  MnbLauncherPrivate *priv = GET_PRIVATE (actor);
-
-  clutter_actor_grab_key_focus (priv->filter);
-}
-
 typedef struct {
   MnbLauncher     *self;
   ClutterActorBox  box;
@@ -980,20 +927,24 @@
   MnbLauncher         *self = data->self;
   MnbLauncherPrivate  *priv = GET_PRIVATE (self);
   gfloat         scroll_width;
-  MxPadding      padding;
-  guint          scrollbar_width;
-  gfloat         width;
 
   scroll_width = data->box.x2 - data->box.x1;
-  mx_widget_get_padding (MX_WIDGET (priv->scrollview), &padding);
-  mx_stylable_get (MX_STYLABLE (priv->scrollview),
-                   "x-mx-scrollbar-width", &scrollbar_width,
-                   NULL);
+  /*
+   *MxPadding      padding;
+   *gfloat         width;
+   *guint          scrollbar_width;
+   *mx_widget_get_padding (MX_WIDGET (priv->scrollview), &padding);
+   *mx_stylable_get (MX_STYLABLE (priv->scrollview),
+   *                "x-mx-scrollbar-width", &scrollbar_width,
+   *                NULL);
+   *
+   * width = scroll_width -
+   *       scrollbar_width - padding.left - padding.right - 15;
 
-  width = scroll_width -
-          scrollbar_width - padding.left - padding.right - 15;
+   * clutter_actor_set_width (priv->apps_grid, width);
+  */
 
-  clutter_actor_set_width (priv->apps_grid, width);
+  clutter_actor_set_width (priv->apps_grid, scroll_width);
 
   return FALSE;
 }
@@ -1026,6 +977,9 @@
 _apps_grid_find_single_visible_button_cb (ClutterActor                          *actor,
                                           app_grid_find_single_visible_button_t *data)
 {
+  if (data->n_visible == 1)
+    return;
+
   if (MNB_IS_LAUNCHER_BUTTON (actor) &&
       CLUTTER_ACTOR_IS_REACTIVE (actor) &&
       CLUTTER_ACTOR_IS_VISIBLE (actor))
@@ -1067,6 +1021,19 @@
                              0,
                              desktop_file_path);
             }
+          else
+            {
+              const gchar *command;
+
+              command = mnb_filter_get_text (MNB_FILTER (actor));
+              if (command)
+                {
+                  g_signal_emit (self,
+                                 _signals[COMMANDLINE_LAUNCH_ACTIVATED],
+                                 0,
+                                 command);
+                }
+            }
         }
       else if (CLUTTER_Escape == key_event->keyval)
         {
@@ -1078,6 +1045,30 @@
   return FALSE;
 }
 
+static void
+_fav_add_complete_cb (ClutterActor *grid,
+                      ClutterActor *button,
+                      MnbLauncher *self)
+{
+  MnbLauncherPrivate *priv = GET_PRIVATE (MNB_LAUNCHER (self));
+  priv->fav_grid_items++;
+
+  if (CLUTTER_ACTOR_IS_VISIBLE (priv->placeholder_label))
+    clutter_actor_hide (priv->placeholder_label);
+}
+
+static void
+_fav_remove_complete_cb (ClutterActor *grid,
+                         ClutterActor *button,
+                         MnbLauncher *self)
+{
+  MnbLauncherPrivate *priv = GET_PRIVATE (MNB_LAUNCHER (self));
+  priv->fav_grid_items--;
+
+ if (priv->fav_grid_items == 0)
+   clutter_actor_show (priv->placeholder_label);
+}
+
 static GObject *
 _constructor (GType                  gtype,
               guint                  n_properties,
@@ -1115,6 +1106,15 @@
   clutter_actor_set_width (pane, FAV_PANE_WIDTH);
   clutter_container_add_actor (CLUTTER_CONTAINER (columns), pane);
 
+
+  priv->placeholder_label = mx_label_new_with_text (PLACEHOLDER_TEXT);
+  mx_stylable_set_style_class (MX_STYLABLE (priv->placeholder_label),
+                               "placeholder");
+
+  mx_label_set_line_wrap (MX_LABEL (priv->placeholder_label), TRUE);
+
+  mx_box_layout_add_actor (MX_BOX_LAYOUT (pane), priv->placeholder_label, 1);
+
   fav_scroll = mx_scroll_view_new ();
   clutter_actor_set_name (fav_scroll, "fav-pane-content");
   g_object_set (fav_scroll, "clip-to-allocation", TRUE, NULL);
@@ -1131,6 +1131,13 @@
   mx_stylable_set_style_class (MX_STYLABLE (priv->fav_grid), "fav-grid");
 //  mx_grid_set_column_spacing (MX_GRID (priv->fav_grid), APPS_GRID_COLUMN_GAP);
   mx_grid_set_row_spacing (MX_GRID (priv->fav_grid), APPS_GRID_ROW_GAP);
+
+  g_signal_connect (priv->fav_grid, "actor-added",
+                    G_CALLBACK (_fav_add_complete_cb), self);
+
+  g_signal_connect (priv->fav_grid, "actor-removed",
+                    G_CALLBACK (_fav_remove_complete_cb), self);
+
 //  mx_grid_set_max_stride (MX_GRID (priv->fav_grid), 4);
   clutter_container_add_actor (CLUTTER_CONTAINER (fav_scroll), priv->fav_grid);
 
@@ -1226,7 +1233,6 @@
 mnb_launcher_class_init (MnbLauncherClass *klass)
 {
   GObjectClass *object_class = G_OBJECT_CLASS (klass);
-  ClutterActorClass *actor_class = CLUTTER_ACTOR_CLASS (klass);
 
   g_type_class_add_private (klass, sizeof (MnbLauncherPrivate));
 
@@ -1235,8 +1241,6 @@
   object_class->set_property = _set_property;
   object_class->get_property = _get_property;
 
-  actor_class->key_focus_in = _key_focus_in;
-
   /* Properties */
 
   g_object_class_install_property (object_class,
@@ -1258,6 +1262,16 @@
                   NULL, NULL,
                   g_cclosure_marshal_VOID__STRING,
                   G_TYPE_NONE, 1, G_TYPE_STRING);
+
+  _signals[COMMANDLINE_LAUNCH_ACTIVATED] =
+    g_signal_new ("commandline-launch-activated",
+                  G_TYPE_FROM_CLASS (object_class),
+                  G_SIGNAL_RUN_LAST,
+                  G_STRUCT_OFFSET (MnbLauncherClass,
+                                   commandline_launcher_activated),
+                  NULL, NULL,
+                  g_cclosure_marshal_VOID__STRING,
+                  G_TYPE_NONE, 1, G_TYPE_STRING);
 }
 
 static void
--- src/meego-netbook-launcher.h
+++ src/meego-netbook-launcher.h
@@ -66,6 +66,8 @@
   /* Signals. */
   void (* launcher_activated) (MnbLauncher  *self,
                                const gchar  *desktop_file);
+  void (* commandline_launcher_activated) (MnbLauncher  *self,
+                                           const gchar  *commandline);
 };
 
 GType mnb_launcher_get_type (void) G_GNUC_CONST;
--- src/meego-panel-applications.c
+++ src/meego-panel-applications.c
@@ -97,6 +97,18 @@
 }
 
 static void
+commandline_launch_activated_cb (MnbLauncher    *launcher,
+                                 const gchar    *commandline,
+                                 MplPanelClient *panel)
+{
+  if (commandline)
+    {
+      if (mpl_panel_client_launch_application   (panel, commandline))
+        mpl_panel_client_hide (panel);
+    }
+}
+
+static void
 standalone_launcher_activated_cb (MnbLauncher    *launcher,
                                   const gchar    *desktop_file,
                                   gpointer        user_data)
@@ -129,7 +141,7 @@
 panel_show_end_cb (MplPanelClient *panel,
                    MnbLauncher    *launcher)
 {
-  clutter_actor_grab_key_focus (CLUTTER_ACTOR (launcher));
+  mx_focusable_accept_focus (MX_FOCUSABLE (launcher), MX_FOCUS_HINT_LAST);
 }
 
 static void
@@ -235,7 +247,6 @@
                         G_CALLBACK (stage_height_notify_cb), launcher);
 
       clutter_actor_show (stage);
-      clutter_actor_grab_key_focus (launcher);
 
     } else {
 
@@ -256,6 +267,8 @@
       launcher = mnb_launcher_new ();
       g_signal_connect (launcher, "launcher-activated",
                         G_CALLBACK (launcher_activated_cb), panel);
+      g_signal_connect (launcher, "commandline-launch-activated",
+                        G_CALLBACK (commandline_launch_activated_cb), panel);
 
       g_signal_connect (panel, "show-begin",
                         G_CALLBACK (panel_show_begin_cb), launcher);
@@ -271,6 +284,11 @@
                         G_CALLBACK (panel_set_size_cb), launcher);
     }
 
+  mx_focus_manager_get_for_stage (CLUTTER_STAGE (stage));
+
+  /* The last item in the launcher is the filter entry */
+  mx_focusable_accept_focus (MX_FOCUSABLE (launcher), MX_FOCUS_HINT_LAST);
+
   clutter_main ();
 
   return EXIT_SUCCESS;
--- src/mnb-entry.c
+++ src/mnb-entry.c
-
-/*
- * Copyright (c) 2009 Intel Corp.
- *
- * Author: Robert Staudinger <robertx.staudinger at intel.com>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU Lesser General Public License,
- * version 2.1, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT ANY
- * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
- * FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for
- * more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include <mx/mx.h>
-#include "mnb-entry.h"
-
-G_DEFINE_TYPE (MnbEntry, mnb_entry, MPL_TYPE_ENTRY)
-
-#define GET_PRIVATE(o) \
-  (G_TYPE_INSTANCE_GET_PRIVATE ((o), MNB_TYPE_ENTRY, MnbEntryPrivate))
-
-enum
-{
-  PROP_0,
-
-  PROP_HAS_KEYBOARD_FOCUS
-};
-
-enum
-{
-  KEYNAV_EVENT,
-
-  LAST_SIGNAL
-};
-
-typedef struct {
-  gboolean has_keyboard_focus;
-} MnbEntryPrivate;
-
-static guint _signals[LAST_SIGNAL] = { 0, };
-
-/*
- * MnbEntry
- */
-
-static gboolean
-_text_key_press_cb (ClutterActor     *actor,
-                    ClutterKeyEvent  *event,
-                    MplEntry         *entry)
-{
-  /* Some of the keys are swallowed, i.e. they don't move the
-   * focus away from the entry. */
-  switch (event->keyval)
-  {
-    case CLUTTER_Return:
-    /* case CLUTTER_Left: */
-    /* case CLUTTER_Up: */
-    case CLUTTER_Down:
-    /* case CLUTTER_Page_Up: */
-    case CLUTTER_Page_Down:
-    case CLUTTER_Tab:
-        g_signal_emit (entry, _signals[KEYNAV_EVENT], 0, event->keyval);
-        return TRUE;
-    case CLUTTER_Right:
-      if (-1 == clutter_text_get_cursor_position (CLUTTER_TEXT (actor)))
-      {
-        g_signal_emit (entry, _signals[KEYNAV_EVENT], 0, event->keyval);
-        return TRUE;
-      }
-      break;
-    default:
-      ;
-  }
-
-  return FALSE;
-}
-
-static void
-_get_property (GObject    *object,
-               guint       property_id,
-               GValue     *value,
-               GParamSpec *pspec)
-{
-  switch (property_id)
-  {
-  case PROP_HAS_KEYBOARD_FOCUS:
-    g_value_set_boolean (value,
-                         mnb_entry_get_has_keyboard_focus (MNB_ENTRY (object)));
-    break;
-  default:
-    G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
-  }
-}
-
-static void
-_set_property (GObject      *object,
-               guint         property_id,
-               const GValue *value,
-               GParamSpec   *pspec)
-{
-  switch (property_id) {
-  case PROP_HAS_KEYBOARD_FOCUS:
-    mnb_entry_set_has_keyboard_focus (MNB_ENTRY (object),
-                                      g_value_get_boolean (value));
-    break;
-  default:
-    G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
-  }
-}
-
-static gboolean
-_captured_event (ClutterActor *actor,
-                 ClutterEvent *event)
-{
-  MnbEntryPrivate *priv = GET_PRIVATE (actor);
-
-  /* Swallow keyboard events while navigating outside the widget. */
-  if (CLUTTER_KEY_PRESS == event->type &&
-      !priv->has_keyboard_focus)
-  {
-    ClutterKeyEvent *key_event = (ClutterKeyEvent *) event;
-
-    switch (key_event->keyval)
-    {
-      case CLUTTER_Return:
-      case CLUTTER_Left:
-      case CLUTTER_Up:
-      case CLUTTER_Right:
-      case CLUTTER_Down:
-      case CLUTTER_Page_Up:
-      case CLUTTER_Page_Down:
-      case CLUTTER_Tab:
-        g_signal_emit (actor, _signals[KEYNAV_EVENT], 0, key_event->keyval);
-        return TRUE;
-      default:
-        ;
-    }
-  }
-
-  return FALSE;
-}
-
-static void
-mnb_entry_class_init (MnbEntryClass *klass)
-{
-  GObjectClass *object_class = G_OBJECT_CLASS (klass);
-  ClutterActorClass *actor_class = CLUTTER_ACTOR_CLASS (klass);
-
-  g_type_class_add_private (klass, sizeof (MnbEntryPrivate));
-
-  object_class->get_property = _get_property;
-  object_class->set_property = _set_property;
-
-  actor_class->captured_event = _captured_event;
-
-  /* Properties */
-
-  g_object_class_install_property (object_class,
-                                   PROP_HAS_KEYBOARD_FOCUS,
-                                   g_param_spec_boolean ("has-keyboard-focus",
-                                                         "Keyboard focus",
-                                                         "If the widget has keyboard focus",
-                                                         FALSE,
-                                                         G_PARAM_READWRITE));
-
-  /* Signals */
-
-  _signals[KEYNAV_EVENT] = g_signal_new ("keynav-event",
-                                         G_TYPE_FROM_CLASS (object_class),
-                                         G_SIGNAL_RUN_LAST,
-                                         0, NULL, NULL,
-                                         g_cclosure_marshal_VOID__UINT,
-                                         G_TYPE_NONE, 1, G_TYPE_UINT);
-}
-
-static void
-mnb_entry_init (MnbEntry *self)
-{
-  MxWidget      *entry;
-  ClutterActor  *text;
-
-  entry = mpl_entry_get_mx_entry (MPL_ENTRY (self));
-  text = mx_entry_get_clutter_text (MX_ENTRY (entry));
-  g_signal_connect (text, "key-press-event",
-                    G_CALLBACK (_text_key_press_cb),
-                    self);
-}
-
-ClutterActor *
-mnb_entry_new (const char *label)
-{
-  return g_object_new (MNB_TYPE_ENTRY,
-                       "label", label,
-                       NULL);
-}
-
-gboolean
-mnb_entry_get_has_keyboard_focus (MnbEntry *self)
-{
-  MnbEntryPrivate *priv = GET_PRIVATE (self);
-
-  g_return_val_if_fail (MNB_IS_ENTRY (self), FALSE);
-
-  return priv->has_keyboard_focus;
-}
-
-void
-mnb_entry_set_has_keyboard_focus (MnbEntry *self,
-                                  gboolean  keyboard_focus)
-{
-  MnbEntryPrivate *priv = GET_PRIVATE (self);
-
-  g_return_if_fail (MNB_IS_ENTRY (self));
-
-  if (keyboard_focus != priv->has_keyboard_focus)
-  {
-    MxEntry     *entry = (MxEntry *) mpl_entry_get_mx_entry (MPL_ENTRY (self));
-    ClutterText *text = (ClutterText *) mx_entry_get_clutter_text (entry);
-
-    priv->has_keyboard_focus = keyboard_focus;
-    g_object_notify (G_OBJECT (self), "has-keyboard-focus");
-
-    if (priv->has_keyboard_focus)
-    {
-      clutter_text_set_selection (text, 0, -1);
-      clutter_text_set_cursor_visible (text, TRUE);
-    } else {
-      gint pos = clutter_text_get_cursor_position (text);
-      clutter_text_set_selection_bound (text, pos);
-      clutter_text_set_cursor_visible (text, FALSE);
-    }
-  }
-}
-
--- src/mnb-entry.h
+++ src/mnb-entry.h
-
-/*
- * Copyright (c) 2009 Intel Corp.
- *
- * Author: Robert Staudinger <robertx.staudinger at intel.com>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU Lesser General Public License,
- * version 2.1, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT ANY
- * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
- * FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for
- * more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef MNB_ENTRY_H
-#define MNB_ENTRY_H
-
-#include <glib-object.h>
-#include <meego-panel/mpl-entry.h>
-
-G_BEGIN_DECLS
-
-#define MNB_TYPE_ENTRY mnb_entry_get_type()
-
-#define MNB_ENTRY(obj) \
-  (G_TYPE_CHECK_INSTANCE_CAST ((obj), MNB_TYPE_ENTRY, MnbEntry))
-
-#define MNB_ENTRY_CLASS(klass) \
-  (G_TYPE_CHECK_CLASS_CAST ((klass), MNB_TYPE_ENTRY, MnbEntryClass))
-
-#define MNB_IS_ENTRY(obj) \
-  (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MNB_TYPE_ENTRY))
-
-#define MNB_IS_ENTRY_CLASS(klass) \
-  (G_TYPE_CHECK_CLASS_TYPE ((klass), MNB_TYPE_ENTRY))
-
-#define MNB_ENTRY_GET_CLASS(obj) \
-  (G_TYPE_INSTANCE_GET_CLASS ((obj), MNB_TYPE_ENTRY, MnbEntryClass))
-
-typedef struct
-{
-  MplEntry parent;
-} MnbEntry;
-
-typedef struct
-{
-  MplEntryClass parent_class;
-} MnbEntryClass;
-
-GType mnb_entry_get_type (void);
-
-ClutterActor *  mnb_entry_new                     (const char *label);
-
-gboolean        mnb_entry_get_has_keyboard_focus  (MnbEntry   *self);
-void            mnb_entry_set_has_keyboard_focus  (MnbEntry   *self,
-                                                   gboolean    keyboard_focus);
-
-G_END_DECLS
-
-#endif /* MNB_ENTRY_H */
-
--- src/mnb-filter.c
+++ src/mnb-filter.c
@@ -147,6 +147,9 @@
   priv->entry = (MxEntry *) mx_entry_new ();
   mx_entry_set_secondary_icon_from_file (priv->entry,
                                          THEMEDIR"/clear-entry.png");
+  mx_entry_set_secondary_icon_tooltip_text (priv->entry, _("Clear"));
+  mx_entry_set_icon_highlight_suffix (priv->entry, "-hover");
+
   g_signal_connect (priv->entry, "notify::text",
                     G_CALLBACK (_entry_text_notify_cb), self);
   g_signal_connect (priv->entry, "secondary-icon-clicked",
@@ -159,6 +162,10 @@
                                NULL);
 
   button = mx_button_new_with_label (_("Search"));
+  /* This button is a visual guide only and does not perform any other
+   * function. Disabled to stop focus.
+   */
+  mx_widget_set_disabled (MX_WIDGET(button), TRUE);
   clutter_container_add_actor (CLUTTER_CONTAINER (self), button);
 }
 
--- src/mnb-launcher-button.c
+++ src/mnb-launcher-button.c
@@ -30,6 +30,12 @@
 #include <mx/mx.h>
 #include "mnb-launcher-button.h"
 
+static void mx_focusable_iface_init (MxFocusableIface *iface);
+
+G_DEFINE_TYPE_WITH_CODE (MnbLauncherButton, mnb_launcher_button, MX_TYPE_TABLE,
+                         G_IMPLEMENT_INTERFACE (MX_TYPE_FOCUSABLE,
+                                                mx_focusable_iface_init))
+
 #define MNB_LAUNCHER_BUTTON_GET_PRIVATE(obj)    \
         (G_TYPE_INSTANCE_GET_PRIVATE ((obj), MNB_TYPE_LAUNCHER_BUTTON, MnbLauncherButtonPrivate))
 
@@ -42,7 +48,6 @@
 
 enum
 {
-  HOVERED,
   ACTIVATED,
   FAV_TOGGLED,
 
@@ -71,6 +76,7 @@
   char          *title_key;
   char          *description_key;
   char          *comment_key;
+  char          *executable_key;
 
   /* Those are mutually exclusive.
    * fav_sibling:   sibling in the fav pane.
@@ -81,7 +87,16 @@
 
 static guint _signals[LAST_SIGNAL] = { 0, };
 
-G_DEFINE_TYPE (MnbLauncherButton, mnb_launcher_button, MX_TYPE_TABLE);
+static MxFocusable *
+mnb_launcher_button_accept_focus (MxFocusable *focusable,
+                                  MxFocusHint hint)
+{
+  clutter_ungrab_pointer ();
+  clutter_actor_grab_key_focus (CLUTTER_ACTOR (focusable));
+  mx_stylable_set_style_pseudo_class (MX_STYLABLE (focusable), "hover");
+
+  return focusable;
+}
 
 static void
 fav_button_notify_toggled_cb (MxButton          *button,
@@ -154,6 +169,7 @@
   g_free (self->priv->category_key);
   g_free (self->priv->title_key);
   g_free (self->priv->description_key);
+  g_free (self->priv->executable_key);
 
   G_OBJECT_CLASS (mnb_launcher_button_parent_class)->finalize (object);
 }
@@ -198,20 +214,56 @@
   return FALSE;
 }
 
+/* probably not really needed but making sure the is_pressed state is
+ * consistent
+ */
 static gboolean
-_enter_event_cb (ClutterActor         *actor,
-                 ClutterCrossingEvent *event,
-                 gpointer              data)
+mnb_launcher_button_key_press_event (ClutterActor       *actor,
+                                     ClutterKeyEvent *event)
 {
-  MnbLauncherButton *self = MNB_LAUNCHER_BUTTON (actor);
+  if (event->keyval == CLUTTER_KEY_Return ||
+      event->keyval == CLUTTER_KEY_KP_Enter ||
+      event->keyval == CLUTTER_KEY_ISO_Enter)
+    {
+      MnbLauncherButton *self = MNB_LAUNCHER_BUTTON (actor);
+
+      self->priv->is_pressed = TRUE;
+      clutter_actor_grab_key_focus (actor);
+      return TRUE;
+    }
+
+  return FALSE;
+}
 
-  g_signal_emit (self, _signals[HOVERED], 0);
+static gboolean
+mnb_launcher_button_key_release_event (ClutterActor       *actor,
+                                       ClutterKeyEvent    *event)
+{
+  if (event->keyval == CLUTTER_KEY_Return ||
+      event->keyval == CLUTTER_KEY_KP_Enter ||
+      event->keyval == CLUTTER_KEY_ISO_Enter)
+    {
+      MnbLauncherButton *self = MNB_LAUNCHER_BUTTON (actor);
 
-  mx_stylable_set_style_pseudo_class (MX_STYLABLE (self), "hover");
+      if (!self->priv->is_pressed)
+        return FALSE;
+
+      clutter_ungrab_keyboard ();
+      self->priv->is_pressed = FALSE;
+      g_signal_emit (self, _signals[ACTIVATED], 0);
+
+      mx_stylable_set_style_pseudo_class (MX_STYLABLE (self), NULL);
+      mx_widget_hide_tooltip (MX_WIDGET (self));
+
+      return TRUE;
+    }
 
   return FALSE;
 }
 
+/* Accept focus handles setting hover pseudo style class and leave events
+ * handle unsetting the hover pseudo style class
+ */
 static gboolean
 _leave_event_cb (ClutterActor         *actor,
                  ClutterCrossingEvent *event,
@@ -224,12 +276,23 @@
   if (self->priv->is_pressed)
     {
       clutter_ungrab_pointer ();
+      clutter_ungrab_keyboard ();
       self->priv->is_pressed = FALSE;
     }
 
   return FALSE;
 }
 
+static gboolean
+_enter_event_cb (ClutterActor         *actor,
+                 ClutterCrossingEvent *event,
+                 gpointer              data)
+{
+  mx_focusable_accept_focus (MX_FOCUSABLE (actor), MX_FOCUS_HINT_FIRST);
+
+  return FALSE;
+}
+
 static void
 mnb_launcher_button_allocate (ClutterActor          *actor,
                               const ClutterActorBox *box,
@@ -276,6 +339,12 @@
 }
 
 static void
+mx_focusable_iface_init (MxFocusableIface *iface)
+{
+  iface->accept_focus = mnb_launcher_button_accept_focus;
+}
+
+static void
 mnb_launcher_button_class_init (MnbLauncherButtonClass *klass)
 {
   GObjectClass *object_class = G_OBJECT_CLASS (klass);
@@ -287,18 +356,13 @@
 
   actor_class->button_press_event = mnb_launcher_button_button_press_event;
   actor_class->button_release_event = mnb_launcher_button_button_release_event;
+  actor_class->key_press_event = mnb_launcher_button_key_press_event;
+  actor_class->key_release_event = mnb_launcher_button_key_release_event;
   actor_class->allocate = mnb_launcher_button_allocate;
   actor_class->allocate = mnb_launcher_button_allocate;
   actor_class->pick = mnb_launcher_button_pick;
   actor_class->paint = mnb_launcher_button_paint;
 
-  _signals[HOVERED] = g_signal_new ("hovered",
-                                    G_TYPE_FROM_CLASS (klass),
-                                    G_SIGNAL_RUN_LAST,
-                                    G_STRUCT_OFFSET (MnbLauncherButtonClass, hovered),
-                                    NULL, NULL,
-                                    g_cclosure_marshal_VOID__VOID,
-                                    G_TYPE_NONE, 0);
 
   _signals[ACTIVATED] = g_signal_new ("activated",
                                     G_TYPE_FROM_CLASS (klass),
@@ -318,17 +382,6 @@
 }
 
 static void
-_mapped_notify_cb (MnbLauncherButton  *self,
-                   GParamSpec         *pspec,
-                   gpointer            user_data)
-{
-  if (!CLUTTER_ACTOR_IS_MAPPED (self))
-  {
-    mx_stylable_set_style_pseudo_class (MX_STYLABLE (self), NULL);
-  }
-}
-
-static void
 mnb_launcher_button_init (MnbLauncherButton *self)
 {
   ClutterActor *label;
@@ -337,14 +390,13 @@
 
   mx_table_set_column_spacing (MX_TABLE (self), COL_SPACING);
 
-  g_signal_connect (self, "enter-event",
-                    G_CALLBACK (_enter_event_cb), NULL);
   g_signal_connect (self, "leave-event",
                     G_CALLBACK (_leave_event_cb), NULL);
-  g_signal_connect (self, "notify::mapped",
-                    G_CALLBACK (_mapped_notify_cb), NULL);
+  g_signal_connect (self, "key-focus-out",
+                    G_CALLBACK (_leave_event_cb), NULL);
+  g_signal_connect (self, "enter-event",
+                    G_CALLBACK (_enter_event_cb), NULL);
 
-  /* icon */
   self->priv->icon = NULL;
 
   /* "app" label */
@@ -673,6 +725,16 @@
       return TRUE;
     }
 
+  /* Executable. */
+  if (self->priv->executable && !self->priv->executable_key)
+    self->priv->executable_key = g_utf8_strdown (self->priv->executable, -1);
+
+  if (self->priv->executable_key &&
+      NULL != strstr (self->priv->executable_key, lcase_needle))
+    {
+      return TRUE;
+    }
+
   return FALSE;
 }
 
@@ -703,6 +765,9 @@
                                    gfloat             width,
                                    gfloat             height)
 {
+  mx_widget_set_tooltip_text (MX_WIDGET (self),
+                              mx_label_get_text (self->priv->title));
+
   clutter_actor_destroy ((ClutterActor *) self->priv->title);
   self->priv->title = NULL;
   clutter_actor_destroy ((ClutterActor *) self->priv->launched);
--- src/mnb-launcher-grid.c
+++ src/mnb-launcher-grid.c
@@ -20,8 +20,14 @@
  */
 
 #include "mnb-launcher-grid.h"
+#include "mnb-expander.h"
+
+static void mx_focusable_iface_init (MxFocusableIface *iface);
+
+G_DEFINE_TYPE_WITH_CODE (MnbLauncherGrid, mnb_launcher_grid, MX_TYPE_GRID,
+                         G_IMPLEMENT_INTERFACE (MX_TYPE_FOCUSABLE,
+                                                mx_focusable_iface_init))
 
-G_DEFINE_TYPE (MnbLauncherGrid, mnb_launcher_grid, MX_TYPE_GRID)
 
 #define GET_PRIVATE(o) \
   (G_TYPE_INSTANCE_GET_PRIVATE ((o), MNB_TYPE_LAUNCHER_GRID, MnbLauncherGridPrivate))
@@ -149,54 +155,15 @@
   return g_object_new (MNB_TYPE_LAUNCHER_GRID, NULL);
 }
 
-typedef struct
-{
-  const gchar *pseudo_class;
-  MxWidget    *widget;
-} find_widget_by_pseudo_class_data;
-
-static void
-_find_widget_by_pseudo_class_cb (ClutterActor                      *actor,
-                                 find_widget_by_pseudo_class_data  *data)
-{
-  const gchar *pseudo_class;
-
-  if (!CLUTTER_ACTOR_IS_MAPPED (actor))
-    return;
-
-  if (!MX_IS_STYLABLE (actor))
-    return;
-
-  pseudo_class = mx_stylable_get_style_pseudo_class (MX_STYLABLE (actor));
-  if (0 == g_strcmp0 (data->pseudo_class, pseudo_class))
-    data->widget = MX_WIDGET (actor);
-}
-
-MxWidget *
-mnb_launcher_grid_find_widget_by_pseudo_class (MnbLauncherGrid  *grid,
-                                               const gchar      *pseudo_class)
-{
-  find_widget_by_pseudo_class_data data;
-
-  data.pseudo_class = pseudo_class;
-  data.widget = NULL;
-
-  clutter_container_foreach (CLUTTER_CONTAINER (grid),
-                             (ClutterCallback) _find_widget_by_pseudo_class_cb,
-                             &data);
-
-  return data.widget;
-}
-
 typedef struct {
   gfloat  x;
   gfloat  y;
-  MxWidget  *widget;
-} find_widget_by_point_data_t;
+  ClutterActor  *actor;
+} find_actor_by_point_data_t;
 
 static void
-_find_widget_by_point_cb (ClutterActor                *actor,
-                          find_widget_by_point_data_t *data)
+_find_actor_by_point_cb (ClutterActor                *actor,
+                         find_actor_by_point_data_t  *data)
 {
   gfloat left = clutter_actor_get_x (actor);
   gfloat top = clutter_actor_get_y (actor);
@@ -209,266 +176,285 @@
       right >= data->x &&
       bottom >= data->y)
     {
-      data->widget = MX_WIDGET (actor);
+      data->actor = actor;
     }
 }
 
-MxWidget *
-mnb_launcher_grid_find_widget_by_point (MnbLauncherGrid *self,
-                                        gfloat           x,
-                                        gfloat           y)
+static ClutterActor *
+mnb_launcher_grid_find_actor_by_point (MnbLauncherGrid *self,
+                                       gfloat           x,
+                                       gfloat           y)
 {
-  find_widget_by_point_data_t data;
+  find_actor_by_point_data_t data;
 
   data.x = x;
   data.y = y;
-  data.widget = NULL;
+  data.actor = NULL;
 
   clutter_container_foreach (CLUTTER_CONTAINER (self),
-                             (ClutterCallback) _find_widget_by_point_cb,
+                             (ClutterCallback) _find_actor_by_point_cb,
                              &data);
 
-  return data.widget;
+  return data.actor;
 }
 
-MxWidget *
-mnb_launcher_grid_keynav_up (MnbLauncherGrid *self)
+static ClutterActor *
+mnb_launcher_grid_keynav_wrap_up (MnbLauncherGrid *self, ClutterActor *old)
 {
-  MxWidget    *old, *new;
+  ClutterActor *new = NULL;
+  MxPadding    padding;
   gfloat       x, y;
 
-  old = mnb_launcher_grid_find_widget_by_pseudo_class (self, "hover");
   if (old == NULL)
     return NULL;
 
-  x = clutter_actor_get_x (CLUTTER_ACTOR (old)) +
+  mx_widget_get_padding (MX_WIDGET (self), &padding);
+
+  x = clutter_actor_get_width (CLUTTER_ACTOR (self)) -
+      padding.right -
       clutter_actor_get_width (CLUTTER_ACTOR (old)) / 2;
 
   y = clutter_actor_get_y (CLUTTER_ACTOR (old)) -
       mx_grid_get_row_spacing (MX_GRID (self)) -
       clutter_actor_get_height (CLUTTER_ACTOR (old)) / 2;
 
-  new = mnb_launcher_grid_find_widget_by_point (self, x, y);
-  if (new)
-    {
-      mx_stylable_set_style_pseudo_class (MX_STYLABLE (old), NULL);
-      mx_stylable_set_style_pseudo_class (MX_STYLABLE (new), "hover");
-      return new;
-    }
+  new = mnb_launcher_grid_find_actor_by_point (self, x, y);
 
-  return NULL;
+  return new;
 }
 
-static MxWidget *
-mnb_launcher_grid_keynav_right (MnbLauncherGrid *self)
+static ClutterActor *
+mnb_launcher_grid_keynav_wrap_down (MnbLauncherGrid *self, ClutterActor *old)
 {
-  MxWidget    *old, *new;
+  ClutterActor *new = NULL;
+  MxPadding    padding;
   gfloat       x, y;
 
-  old = mnb_launcher_grid_find_widget_by_pseudo_class (self, "hover");
   if (old == NULL)
     return NULL;
 
-  x = clutter_actor_get_x (CLUTTER_ACTOR (old)) +
-      mx_grid_get_column_spacing (MX_GRID (self)) +
-      clutter_actor_get_width (CLUTTER_ACTOR (old)) * 1.5;
+  mx_widget_get_padding (MX_WIDGET (self), &padding);
+
+  x = padding.left +
+      clutter_actor_get_width (CLUTTER_ACTOR (old)) / 2;
 
   y = clutter_actor_get_y (CLUTTER_ACTOR (old)) +
-      clutter_actor_get_height (CLUTTER_ACTOR (old)) / 2;
+      mx_grid_get_row_spacing (MX_GRID (self)) +
+      clutter_actor_get_height (CLUTTER_ACTOR (old)) * 1.5;
 
-  new = mnb_launcher_grid_find_widget_by_point (self, x, y);
-  if (new)
-    {
-      mx_stylable_set_style_pseudo_class (MX_STYLABLE (old), NULL);
-      mx_stylable_set_style_pseudo_class (MX_STYLABLE (new), "hover");
-      return new;
-    }
+  new = mnb_launcher_grid_find_actor_by_point (self, x, y);
 
-  return NULL;
+  return new;
 }
 
-MxWidget *
-mnb_launcher_grid_keynav_down (MnbLauncherGrid *self)
+static ClutterActor *
+mnb_launcher_grid_keynav_up (MnbLauncherGrid *self, ClutterActor *old)
 {
-  MxWidget    *old, *new;
+  ClutterActor *new = NULL;
   gfloat       x, y;
 
-  old = mnb_launcher_grid_find_widget_by_pseudo_class (self, "hover");
   if (old == NULL)
     return NULL;
 
   x = clutter_actor_get_x (CLUTTER_ACTOR (old)) +
       clutter_actor_get_width (CLUTTER_ACTOR (old)) / 2;
 
-  y = clutter_actor_get_y (CLUTTER_ACTOR (old)) +
-      mx_grid_get_row_spacing (MX_GRID (self)) +
-      clutter_actor_get_height (CLUTTER_ACTOR (old)) * 1.5;
+  y = clutter_actor_get_y (CLUTTER_ACTOR (old)) -
+      mx_grid_get_row_spacing (MX_GRID (self)) -
+      clutter_actor_get_height (CLUTTER_ACTOR (old)) / 2;
 
-  new = mnb_launcher_grid_find_widget_by_point (self, x, y);
-  if (new)
-    {
-      mx_stylable_set_style_pseudo_class (MX_STYLABLE (old), NULL);
-      mx_stylable_set_style_pseudo_class (MX_STYLABLE (new), "hover");
-      return new;
-    }
+  new = mnb_launcher_grid_find_actor_by_point (self, x, y);
 
-  return NULL;
+  return new;
 }
 
-static MxWidget *
-mnb_launcher_grid_keynav_left (MnbLauncherGrid *self)
+static ClutterActor *
+mnb_launcher_grid_keynav_down (MnbLauncherGrid *self, ClutterActor *old)
 {
-  MxWidget    *old, *new;
+  ClutterActor *new = NULL;
   gfloat       x, y;
 
-  old = mnb_launcher_grid_find_widget_by_pseudo_class (self, "hover");
   if (old == NULL)
     return NULL;
 
-  x = clutter_actor_get_x (CLUTTER_ACTOR (old)) -
-      mx_grid_get_column_spacing (MX_GRID (self)) -
+  x = clutter_actor_get_x (CLUTTER_ACTOR (old)) +
       clutter_actor_get_width (CLUTTER_ACTOR (old)) / 2;
 
   y = clutter_actor_get_y (CLUTTER_ACTOR (old)) +
-      clutter_actor_get_height (CLUTTER_ACTOR (old)) / 2;
+      mx_grid_get_row_spacing (MX_GRID (self)) +
+      clutter_actor_get_height (CLUTTER_ACTOR (old)) * 1.5;
 
-  new = mnb_launcher_grid_find_widget_by_point (self, x, y);
-  if (new)
-    {
-      mx_stylable_set_style_pseudo_class (MX_STYLABLE (old), NULL);
-      mx_stylable_set_style_pseudo_class (MX_STYLABLE (new), "hover");
-      return new;
-    }
+  new = mnb_launcher_grid_find_actor_by_point (self, x, y);
 
-  return NULL;
+  return new;
 }
 
-static MxWidget *
-mnb_launcher_grid_keynav_wrap_up (MnbLauncherGrid *self)
+static ClutterActor *
+_find_first_focusable (ClutterActor *self)
 {
-  MxWidget    *old, *new;
-  MxPadding    padding;
-  gfloat       x, y;
-
-  old = mnb_launcher_grid_find_widget_by_pseudo_class (self, "hover");
-  if (old == NULL)
-    return NULL;
+  GList *iter, *children = NULL;
+  ClutterActor *actor = NULL;
 
-  mx_widget_get_padding (MX_WIDGET (self), &padding);
+  children = clutter_container_get_children (CLUTTER_CONTAINER (self));
 
-  x = clutter_actor_get_width (CLUTTER_ACTOR (self)) -
-      padding.right -
-      clutter_actor_get_width (CLUTTER_ACTOR (old)) / 2;
-
-  y = clutter_actor_get_y (CLUTTER_ACTOR (old)) -
-      mx_grid_get_row_spacing (MX_GRID (self)) -
-      clutter_actor_get_height (CLUTTER_ACTOR (old)) / 2;
-
-  new = mnb_launcher_grid_find_widget_by_point (self, x, y);
-  if (new)
+  if (children)
     {
-      mx_stylable_set_style_pseudo_class (MX_STYLABLE (old), NULL);
-      mx_stylable_set_style_pseudo_class (MX_STYLABLE (new), "hover");
-      return new;
+      for (iter = children; iter; iter = iter->next)
+        {
+          if (CLUTTER_ACTOR_IS_MAPPED (iter->data) &&
+              MX_IS_FOCUSABLE (iter->data))
+            {
+              actor = iter->data;
+              break;
+            }
+        }
+      g_list_free (children);
+      return actor;
     }
-
   return NULL;
 }
 
-static MxWidget *
-mnb_launcher_grid_keynav_wrap_down (MnbLauncherGrid *self)
-{
-  MxWidget    *old, *new;
-  MxPadding    padding;
-  gfloat       x, y;
 
-  old = mnb_launcher_grid_find_widget_by_pseudo_class (self, "hover");
-  if (old == NULL)
-    return NULL;
+static ClutterActor *
+_find_next_focusable (ClutterActor *self, ClutterActor *from)
+{
+  GList *iter, *list, *children = NULL;
+  ClutterActor *actor = NULL;
 
-  mx_widget_get_padding (MX_WIDGET (self), &padding);
+  children =
+    clutter_container_get_children (CLUTTER_CONTAINER (self));
 
-  x = padding.left +
-      clutter_actor_get_width (CLUTTER_ACTOR (old)) / 2;
+  if (!children)
+    return NULL;
 
-  y = clutter_actor_get_y (CLUTTER_ACTOR (old)) +
-      mx_grid_get_row_spacing (MX_GRID (self)) +
-      clutter_actor_get_height (CLUTTER_ACTOR (old)) * 1.5;
+  list = g_list_find (children, from);
+  list = g_list_next (list);
 
-  new = mnb_launcher_grid_find_widget_by_point (self, x, y);
-  if (new)
+  if (list)
     {
-      mx_stylable_set_style_pseudo_class (MX_STYLABLE (old), NULL);
-      mx_stylable_set_style_pseudo_class (MX_STYLABLE (new), "hover");
-      return new;
+      for (iter = list; iter; iter = iter->next)
+        {
+          if (CLUTTER_ACTOR_IS_MAPPED (iter->data) &&
+              MX_IS_FOCUSABLE (iter->data) &&
+              iter->data != from)
+            {
+              actor = iter->data;
+              break;
+            }
+        }
+      g_list_free (children);
     }
-
-  return NULL;
+  return actor;
 }
 
-MxWidget *
-mnb_launcher_grid_keynav_first (MnbLauncherGrid *self)
+static ClutterActor *
+_find_previous_focusable (ClutterActor *self, ClutterActor *from)
 {
-  MxWidget    *widget;
-  MxPadding    padding;
-  gfloat       x, y;
+  GList *iter, *list, *children = NULL;
+  ClutterActor *actor = NULL;
 
-  mx_widget_get_padding (MX_WIDGET (self), &padding);
+  children =
+    clutter_container_get_children (CLUTTER_CONTAINER (self));
 
-  x = padding.left + 1;
-  y = padding.top + 1;
+  list = g_list_find (children, from);
+  list = g_list_previous (list);
 
-  widget = mnb_launcher_grid_find_widget_by_point (self, x, y);
-  if (widget)
+  if (list)
     {
-      mx_stylable_set_style_pseudo_class (MX_STYLABLE (widget), "hover");
-      return widget;
+      for (iter = list; iter; iter = iter->prev)
+        {
+          if (CLUTTER_ACTOR_IS_MAPPED (iter->data) &&
+              MX_IS_FOCUSABLE (iter->data))
+            {
+              actor = iter->data;
+              break;
+            }
+        }
+      g_list_free (children);
     }
-
-  return NULL;
+  return actor;
 }
 
-void
-mnb_launcher_grid_keynav_out (MnbLauncherGrid *self)
+static MxFocusable *
+mnb_launcher_grid_accept_focus (MxFocusable *focusable,
+                                MxFocusHint hint)
 {
-  MxWidget  *widget;
+  MxFocusable *focus;
 
-  widget = mnb_launcher_grid_find_widget_by_pseudo_class (self, "hover");
-  if (widget)
-    mx_stylable_set_style_pseudo_class (MX_STYLABLE (widget), NULL);
+  focus = MX_FOCUSABLE (_find_first_focusable (CLUTTER_ACTOR (focusable)));
+  if (focus)
+    {
+      clutter_actor_grab_key_focus (CLUTTER_ACTOR (focusable));
+      return mx_focusable_accept_focus (focus, hint);
+    }
+
+  return focusable;
 }
 
-MxWidget *
-mnb_launcher_grid_keynav (MnbLauncherGrid *self,
-                          guint            keyval)
+static MxFocusable *
+mnb_launcher_grid_move_focus (MxFocusable *focusable,
+                              MxFocusDirection direction,
+                              MxFocusable *from)
 {
-  MxWidget *widget;
+  ClutterActor *focus = NULL;
 
-  widget = NULL;
-  switch (keyval)
+  switch (direction)
     {
-      case CLUTTER_Return:
-        widget = mnb_launcher_grid_find_widget_by_pseudo_class (self, "hover");
-        break;
-      case CLUTTER_Left:
-        widget = mnb_launcher_grid_keynav_left (self);
-        if (!widget)
-          widget = mnb_launcher_grid_keynav_wrap_up (self);
-        break;
-      case CLUTTER_Up:
-        widget = mnb_launcher_grid_keynav_up (self);
-        break;
-      case CLUTTER_Right:
-        widget = mnb_launcher_grid_keynav_right (self);
-        if (!widget)
-          widget = mnb_launcher_grid_keynav_wrap_down (self);
-        break;
-      case CLUTTER_Down:
-        widget = mnb_launcher_grid_keynav_down (self);
-        break;
-    }
+     case MX_FOCUS_DIRECTION_UP:
+       focus = mnb_launcher_grid_keynav_up (MNB_LAUNCHER_GRID (focusable),
+                                            CLUTTER_ACTOR (from));
+       if (!focus)
+         focus =
+           mnb_launcher_grid_keynav_wrap_up (MNB_LAUNCHER_GRID (focusable),
+                                             CLUTTER_ACTOR (from));
+       break;
+     case  MX_FOCUS_DIRECTION_DOWN:
+       focus = mnb_launcher_grid_keynav_down (MNB_LAUNCHER_GRID (focusable),
+                                              CLUTTER_ACTOR (from));
+       if (!focus)
+         focus =
+           mnb_launcher_grid_keynav_wrap_down (MNB_LAUNCHER_GRID (focusable),
+                                               CLUTTER_ACTOR (from));
+       break;
+     case MX_FOCUS_DIRECTION_LEFT:
+     case MX_FOCUS_DIRECTION_PREVIOUS:
+
+       focus = _find_previous_focusable (CLUTTER_ACTOR (focusable),
+                                         CLUTTER_ACTOR (from));
+       break;
+
+     case MX_FOCUS_DIRECTION_RIGHT:
+     case MX_FOCUS_DIRECTION_NEXT:
+       focus = _find_next_focusable (CLUTTER_ACTOR (focusable),
+                                     CLUTTER_ACTOR (from));
+       break;
+     default:
+       break;
+   }
+
+ if (focus)
+   {
+     ClutterActor *parent;
+     parent = clutter_actor_get_parent (CLUTTER_ACTOR (focusable));
+     if (MX_IS_SCROLL_VIEW (parent))
+       {
+         ClutterGeometry geo;
+         clutter_actor_get_geometry (focus, &geo);
+         mx_scroll_view_ensure_visible (MX_SCROLL_VIEW (parent),
+                                        &geo);
+       }
+
+     return mx_focusable_accept_focus (MX_FOCUSABLE (focus),
+                                       MX_FOCUS_HINT_FIRST);
+   }
+ return NULL;
+}
 
-  return widget;
+static void
+mx_focusable_iface_init (MxFocusableIface *iface)
+{
+  iface->accept_focus = mnb_launcher_grid_accept_focus;
+  iface->move_focus = mnb_launcher_grid_move_focus;
 }
 
 gboolean
--- src/mnb-launcher-grid.h
+++ src/mnb-launcher-grid.h
@@ -62,19 +62,6 @@
 
 MxWidget  * mnb_launcher_grid_new         (void);
 
-MxWidget  * mnb_launcher_grid_keynav        (MnbLauncherGrid  *self,
-                                             guint             keyval);
-MxWidget *  mnb_launcher_grid_keynav_up     (MnbLauncherGrid  *self);
-MxWidget *  mnb_launcher_grid_keynav_down   (MnbLauncherGrid  *self);
-MxWidget *  mnb_launcher_grid_keynav_first  (MnbLauncherGrid  *self);
-void        mnb_launcher_grid_keynav_out    (MnbLauncherGrid  *self);
-
-MxWidget *  mnb_launcher_grid_find_widget_by_point        (MnbLauncherGrid  *self,
-                                                           gfloat            x,
-                                                           gfloat            y);
-
-MxWidget  * mnb_launcher_grid_find_widget_by_pseudo_class (MnbLauncherGrid  *self,
-                                                           const gchar      *pseudo_class);
 
 gboolean   mnb_launcher_grid_get_x_expand_children (MnbLauncherGrid *self);
 

++++++ meego-panel-applications.yaml
--- meego-panel-applications.yaml
+++ meego-panel-applications.yaml
@@ -1,7 +1,7 @@
 Name: meego-panel-applications
 Summary: Applications panel
 Description: Meego applications panel
-Version: 0.2.6
+Version: 0.2.7
 Release: 1
 Group: System/Desktop
 License: LGPL 2.1



More information about the MeeGo-commits mailing list