r1496 - in trunk/src/target/OM-2007/panel-plugins/openmoko-panel-mainmenu: . src

zhiyong_sun at sita.openmoko.org zhiyong_sun at sita.openmoko.org
Mon Mar 26 11:18:07 CEST 2007


Author: zhiyong_sun
Date: 2007-03-26 11:17:57 +0200 (Mon, 26 Mar 2007)
New Revision: 1496

Added:
   trunk/src/target/OM-2007/panel-plugins/openmoko-panel-mainmenu/src/mokodesktop.c
   trunk/src/target/OM-2007/panel-plugins/openmoko-panel-mainmenu/src/mokodesktop.h
   trunk/src/target/OM-2007/panel-plugins/openmoko-panel-mainmenu/src/mokodesktop_item.c
   trunk/src/target/OM-2007/panel-plugins/openmoko-panel-mainmenu/src/mokodesktop_item.h
   trunk/src/target/OM-2007/panel-plugins/openmoko-panel-mainmenu/src/stylusmenu.c
   trunk/src/target/OM-2007/panel-plugins/openmoko-panel-mainmenu/src/stylusmenu.h
Modified:
   trunk/src/target/OM-2007/panel-plugins/openmoko-panel-mainmenu/configure.ac
   trunk/src/target/OM-2007/panel-plugins/openmoko-panel-mainmenu/src/Makefile.am
   trunk/src/target/OM-2007/panel-plugins/openmoko-panel-mainmenu/src/openmoko-panel-mainmenu.c
Log:
add stylus style menu object to openmoko-panel-mainmenu 

Modified: trunk/src/target/OM-2007/panel-plugins/openmoko-panel-mainmenu/configure.ac
===================================================================
--- trunk/src/target/OM-2007/panel-plugins/openmoko-panel-mainmenu/configure.ac	2007-03-26 06:52:52 UTC (rev 1495)
+++ trunk/src/target/OM-2007/panel-plugins/openmoko-panel-mainmenu/configure.ac	2007-03-26 09:17:57 UTC (rev 1496)
@@ -13,10 +13,11 @@
 # base deps
 PKG_CHECK_MODULES(OPENMOKO, openmoko-libs >= 0.0.2,,
                  AC_MSG_ERROR([*** Required OpenMoko Libraries >= 0.0.2 not installed ***]))
+PKG_CHECK_MODULES(LIBMB, libmb,,
+                 AC_MSG_ERROR([matchbox-lib required]))
+LIBS="$LIBS $OPENMOKO_LIBS $LIBMB_LIBS"
+CFLAGS="$CFLAGS $OPENMOKO_CFLAGS $LIBMB_CFLAGS"
 
-LIBS="$LIBS $OPENMOKO_LIBS"
-CFLAGS="$CFLAGS $OPENMOKO_CFLAGS"
-
 # output stuff
 AC_OUTPUT([
 Makefile

Modified: trunk/src/target/OM-2007/panel-plugins/openmoko-panel-mainmenu/src/Makefile.am
===================================================================
--- trunk/src/target/OM-2007/panel-plugins/openmoko-panel-mainmenu/src/Makefile.am	2007-03-26 06:52:52 UTC (rev 1495)
+++ trunk/src/target/OM-2007/panel-plugins/openmoko-panel-mainmenu/src/Makefile.am	2007-03-26 09:17:57 UTC (rev 1496)
@@ -1,11 +1,11 @@
 AM_CPPFLAGS=-DPKGDATADIR=\"$(pkgdatadir)\" -DGETTEXT_PACKAGE=\"matchbox-panel\"
-AM_CFLAGS = -Wall -std=c99 -pedantic @OPENMOKO_CFLAGS@
+AM_CFLAGS = -Wall -std=c99 -pedantic @OPENMOKO_CFLAGS@ @LIBMB_CFLAGS@
 
 appletdir = $(libdir)/matchbox-panel/
 applet_LTLIBRARIES = libopenmoko-panel-mainmenu.la
 
-libopenmoko_panel_mainmenu_la_SOURCES = openmoko-panel-mainmenu.c
-libopenmoko_panel_mainmenu_la_LIBADD = @OPENMOKO_LIBS@
+libopenmoko_panel_mainmenu_la_SOURCES = openmoko-panel-mainmenu.c stylusmenu.c mokodesktop.c mokodesktop_item.c
+libopenmoko_panel_mainmenu_la_LIBADD = @OPENMOKO_LIBS@ @LIBMB_LIBS@
 
 MAINTAINERCLEANFILES = Makefile.in
 

Added: trunk/src/target/OM-2007/panel-plugins/openmoko-panel-mainmenu/src/mokodesktop.c
===================================================================
--- trunk/src/target/OM-2007/panel-plugins/openmoko-panel-mainmenu/src/mokodesktop.c	2007-03-26 06:52:52 UTC (rev 1495)
+++ trunk/src/target/OM-2007/panel-plugins/openmoko-panel-mainmenu/src/mokodesktop.c	2007-03-26 09:17:57 UTC (rev 1496)
@@ -0,0 +1,344 @@
+#include "mokodesktop.h"
+#include "mokodesktop_item.h"
+
+static void
+item_activate_cb(void *data1, void *data2);
+
+static char* RootMatchStr = NULL;
+static int ItemTypeDotDesktop = 0;
+
+
+static MokoDesktopItem *
+mokodesktop_get_top_level_folder(MokoDesktopItem     *top_head_item)
+{
+  return top_head_item;
+}
+
+static MokoDesktopItem *
+get_folder_from_name ( MokoDesktopItem *top_head_item, char *name )
+{
+  MokoDesktopItem *item, *item_top;
+
+  item_top = mokodesktop_get_top_level_folder(top_head_item);
+
+  if (!strcasecmp(name, "root"))
+    return item_top; 
+
+  mokodesktop_items_enumerate_siblings(mokodesktop_item_get_child(item_top), item)
+    {
+      if (!strcmp(name, mokodesktop_item_get_name (item)))
+	    return item;
+    }
+  
+  return NULL;
+}
+
+static MokoDesktopItem *
+match_folder ( MokoDesktopItem *top_head_item, char *category )
+{
+  MokoDesktopItem *item, *item_fallback = NULL, *item_top;
+  char          *match_str;  
+
+  if (category && strstr(category, "Action")) 
+    return NULL;
+
+  item_top = mokodesktop_get_top_level_folder(top_head_item);
+
+  if (RootMatchStr)
+    {
+      if (!strcmp("fallback", RootMatchStr))
+	    {
+	       item_fallback = item_top;
+	    }
+      else if (category && strstr(category, RootMatchStr))
+	    {
+	       return item_top;
+	    }
+    }
+
+  mokodesktop_items_enumerate_siblings(mokodesktop_item_get_child(item_top), item)
+    {
+      if (mokodesktop_item_get_type (item) == ItemTypeDotDesktop)
+	    {
+	      match_str = (char *)mokodesktop_item_get_user_data(item);
+	      if (match_str != NULL)
+	      {
+	        if (item_fallback == NULL && !strcmp("fallback", match_str))
+		      {
+		        item_fallback = item;
+		        continue;
+		      }
+	        if (category && strstr(category, match_str))
+		      {
+		        return item;
+		      }
+	      }
+	    }
+    }
+  return item_fallback; 
+}
+
+
+static void
+add_a_dotdesktop_item (MokoDesktopItem  *top_head_item, 
+		       MBDotDesktop     *dd,
+		       MokoDesktopItem  *folder)
+{
+  MokoDesktopItem  *item_new = NULL, *item_before, *found_folder_item = NULL;
+  Bool              have_attached = False;
+
+  if (folder)
+    found_folder_item = folder;
+  else
+    found_folder_item = match_folder( top_head_item, mb_dotdesktop_get(dd, "Categories"));
+
+  if ( found_folder_item == NULL) return;
+      
+  item_new = mokodesktop_item_new_with_params( 
+					     mb_dotdesktop_get(dd, "Name"),
+					     mb_dotdesktop_get(dd, "Icon"),
+					     (void *)mb_dotdesktop_get_exec(dd),
+					     ITEM_TYPE_DOTDESKTOP_ITEM
+					     );
+  if (item_new == NULL ) return;
+
+  mokodesktop_item_set_activate_callback (item_new, item_activate_cb); 
+
+  item_before = mokodesktop_item_get_child (found_folder_item);
+
+
+  if(!item_before)
+  {
+  	
+  	mokodesktop_items_append_to_folder( found_folder_item, item_new);
+  	have_attached = True;
+  }
+  else 
+  {
+
+     do
+       {
+         MokoDesktopItem *item_next = NULL;
+         if ((item_next = mokodesktop_item_get_next_sibling(item_before)) != NULL)
+       	{
+      		
+   	      if (item_next->type == ITEM_TYPE_FOLDER
+   	          || item_next->type == ITEM_TYPE_PREVIOUS)
+   	          continue;
+   	  
+   	      if ( (strcasecmp(item_before->name, item_new->name) < 0
+   		       || item_before->type == ITEM_TYPE_FOLDER
+   		       || item_before->type == ITEM_TYPE_PREVIOUS )
+   	         && strcasecmp(item_next->name, item_new->name) > 0)
+   	      {
+   	        have_attached = True;
+   	        mokodesktop_items_insert_after (item_before, item_new);
+   	        break;
+   	      }
+   	    }
+       }
+     while ((item_before = mokodesktop_item_get_next_sibling(item_before)) != NULL);
+   }
+   
+
+  if (!have_attached)
+    {
+      mokodesktop_items_append_to_folder( found_folder_item, item_new);
+    }
+
+}
+
+
+
+MokoDesktopItem*
+mokodesktop_folder_create ( MokoDesktopItem *top_head_item,
+				 char      *name,
+				 char      *icon_name )
+{
+  MokoDesktopItem* item_folder = NULL;
+
+  item_folder
+    = mokodesktop_item_new_with_params( name,
+				      icon_name,
+				      NULL,
+				      ITEM_TYPE_FOLDER
+				      );
+
+  mokodesktop_item_set_activate_callback (item_folder, 
+					mokodesktop_item_folder_activate_cb); 
+
+  return item_folder;
+}
+
+int
+mokodesktop_init ( MokoDesktopItem *top_head_item,
+		              int              type_reg_cnt )
+{
+#define APP_PATHS_N 4
+
+  DIR *dp;
+  struct stat    stat_info;
+
+  char vfolder_path_root[512];
+  char vfolder_path[512];
+  char orig_wd[256];
+
+  int   desktops_dirs_n  = APP_PATHS_N;
+
+  int   i = 0;
+
+  MBDotDesktopFolders     *ddfolders;
+  MBDotDesktopFolderEntry *ddentry;
+  MokoDesktopItem         *item_new = NULL;
+  MBDotDesktop            *dd, *user_overides = NULL;
+
+  char                     app_paths[APP_PATHS_N][256];
+  struct dirent          **namelist;
+/*
+	top_head_item  = mokodesktop_item_new_with_params ("Home", 
+						       NULL,
+						       NULL,
+						       ITEM_TYPE_ROOT );
+*/
+	ItemTypeDotDesktop  = type_reg_cnt;
+  
+  snprintf( vfolder_path_root, 512, "%s/.matchbox/vfolders/Root.directory", 
+	    mb_util_get_homedir());
+  snprintf( vfolder_path, 512, "%s/.matchbox/vfolders", 
+	    mb_util_get_homedir());
+
+ if (stat(vfolder_path_root, &stat_info))
+    {
+      snprintf(vfolder_path_root, 512, VFOLDERDIR"/vfolders/Root.directory");
+      snprintf(vfolder_path, 512, VFOLDERDIR "/vfolders" );
+    }
+ 
+fprintf(stdout, "moko: vfolder_path_root=[%s]\n", vfolder_path_root);
+fprintf(stdout, "moko: vfolder_path=[%s]\n", vfolder_path);
+  
+  dd = mb_dotdesktop_new_from_file(vfolder_path_root);
+
+  if (!dd) 
+    { 
+      fprintf( stderr, "mokodesktop: cant open %s\n", vfolder_path ); 
+      return -1; 
+    }
+
+  RootMatchStr = mb_dotdesktop_get(dd, "Match");
+
+fprintf(stdout, "moko: RootMatchStr=[%s]\n", RootMatchStr);
+  
+  mokodesktop_item_set_name (top_head_item, 
+			   mb_dotdesktop_get(dd, "Name"));  
+  ddfolders = mb_dot_desktop_folders_new(vfolder_path);
+
+  mb_dot_desktop_folders_enumerate(ddfolders, ddentry)
+    {
+      item_new
+	         = mokodesktop_folder_create ( top_head_item,
+					   mb_dot_desktop_folder_entry_get_name(ddentry),
+					   mb_dot_desktop_folder_entry_get_icon(ddentry));
+
+      mokodesktop_item_set_user_data (item_new, 
+				    (void *)mb_dot_desktop_folder_entry_get_match(ddentry));
+
+      mokodesktop_item_set_type (item_new, ItemTypeDotDesktop);
+
+      mokodesktop_items_append_to_top_level (top_head_item, item_new);
+    }
+  
+  
+  //snprintf(app_paths[0], 256, "%s/applications", DATADIR);
+  snprintf(app_paths[0], 256, "/usr/share/applications");
+  snprintf(app_paths[1], 256, "/usr/share/applications");
+  snprintf(app_paths[2], 256, "/usr/local/share/applications");
+  snprintf(app_paths[3], 256, "%s/.applications", mb_util_get_homedir());
+
+  if (getcwd(orig_wd, 255) == (char *)NULL)
+    {
+      fprintf(stderr, "Cant get current directory\n");
+      return -1;
+    }
+
+  for (i = 0; i < desktops_dirs_n; i++)
+    {
+      int   n = 0, j = 0;
+
+      if (i > 0 && !strcmp(app_paths[0], app_paths[i]))
+	        continue;
+
+      if ((dp = opendir(app_paths[i])) == NULL)
+	    {
+	       fprintf(stderr, "mokodesktop: failed to open %s\n", app_paths[i]);
+	       continue;
+	    }
+  
+      chdir(app_paths[i]);
+
+      //n = scandir(".", &namelist, 0, alphasort);
+      n = scandir(".", &namelist, 0, NULL);
+
+      
+      while (j < n && n > 0)
+	    {
+    	  if (namelist[j]->d_name[0] ==  '.')
+	         goto end;
+
+	      if (strcmp(namelist[j]->d_name+strlen(namelist[j]->d_name)-8,".desktop"))
+	         goto end;
+
+	      lstat(namelist[j]->d_name, &stat_info);
+	      if (!(S_ISDIR(stat_info.st_mode)))
+	      {
+	         MBDotDesktop *dd;
+	         dd = mb_dotdesktop_new_from_file(namelist[j]->d_name);
+	         if (dd)
+		       {
+		          if (mb_dotdesktop_get(dd, "Type") 
+		              && !strcmp(mb_dotdesktop_get(dd, "Type"), "Application")
+		              && mb_dotdesktop_get(dd, "Name")
+		              && mb_dotdesktop_get(dd, "Exec"))
+		          {
+		              MokoDesktopItem *folder = NULL;
+		              char             full_path[512];
+		              char          *folder_name = NULL;
+
+		      	      add_a_dotdesktop_item (top_head_item, dd, folder);
+		          }
+		          mb_dotdesktop_free(dd);
+		       }
+	      }
+	      end:
+	         free(namelist[j]);
+	         ++j;
+	    }
+      
+      closedir(dp);
+      free(namelist);
+    }
+    
+  chdir(orig_wd);
+
+  return 1;
+}
+
+
+
+static void
+item_activate_cb(void *data1, void *data2)
+{
+  MokoDesktopItem *top_head_item = (MokoDesktopItem *)data1;
+  MokoDesktopItem *item = (MokoDesktopItem *)data2;
+
+  switch (fork())
+    {
+    case 0:
+      mb_exec((char *)item->data);
+      fprintf(stderr, "exec failed, cleaning up child\n");
+      exit(1);
+    case -1:
+      fprintf(stderr, "can't fork\n");
+      break;
+    }
+}
+

Added: trunk/src/target/OM-2007/panel-plugins/openmoko-panel-mainmenu/src/mokodesktop.h
===================================================================
--- trunk/src/target/OM-2007/panel-plugins/openmoko-panel-mainmenu/src/mokodesktop.h	2007-03-26 06:52:52 UTC (rev 1495)
+++ trunk/src/target/OM-2007/panel-plugins/openmoko-panel-mainmenu/src/mokodesktop.h	2007-03-26 09:17:57 UTC (rev 1496)
@@ -0,0 +1,75 @@
+#ifndef _MOKODESKTOP_H
+#define _MOKODESKTOP_H
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <fcntl.h> 
+#include <signal.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <dirent.h>
+#include <ctype.h>
+#include <time.h>
+
+#include <libmb/mb.h>
+
+#define VFOLDERDIR 		"/usr/share/matchbox"
+#define DD_DIR 		 	"/usr/share/applications/" 
+
+#define PIXMAP_PATH 	"/usr/share/pixmaps"
+
+#ifdef DEBUG
+#define DBG(txt, args... ) fprintf(stderr, "DT-DEBUG: " txt , ##args )
+#else
+#define DBG(txt, args... ) /* nothing */
+#endif
+
+
+enum {	   
+  ITEM_TYPE_UNKNOWN = 0,
+  ITEM_TYPE_ROOT,
+
+  ITEM_TYPE_DOTDESKTOP_FOLDER,
+  ITEM_TYPE_DOTDESKTOP_ITEM,
+  ITEM_TYPE_MODULE_ITEM,
+  ITEM_TYPE_MODULE_WINDOW,
+  ITEM_TYPE_APP,
+  ITEM_TYPE_FOLDER,  /* Same as 'official' Directory */
+  ITEM_TYPE_LINK,    /* URL  */
+
+  ITEM_TYPE_FSDEVICE, 
+  ITEM_TYPE_MIMETYPE, 
+  ITEM_TYPE_DIRECTORY, 
+  ITEM_TYPE_SERVICE, 
+  ITEM_TYPE_SERVICETYPE ,
+
+  ITEM_TYPE_TASK_FOLDER, 		/* Not official */
+  ITEM_TYPE_PREVIOUS,
+  ITEM_TYPE_CNT, 
+};
+
+typedef void (*MokoDesktopCB)( void *data1, void *data2 ) ;
+
+typedef struct _mokodesktop_item {
+
+  int type;
+  int subtype; /* user defined type */
+
+  char *name;
+  char *name_extended;
+  char *comment;
+  char *icon_name;
+  void *data;
+
+  MokoDesktopCB activate_cb;
+
+  struct _mokodesktop_item *item_next_sibling; 
+  struct _mokodesktop_item *item_prev_sibling; 
+  struct _mokodesktop_item *item_child; 
+  struct _mokodesktop_item *item_parent; 
+
+} MokoDesktopItem;
+
+#endif

Added: trunk/src/target/OM-2007/panel-plugins/openmoko-panel-mainmenu/src/mokodesktop_item.c
===================================================================
--- trunk/src/target/OM-2007/panel-plugins/openmoko-panel-mainmenu/src/mokodesktop_item.c	2007-03-26 06:52:52 UTC (rev 1495)
+++ trunk/src/target/OM-2007/panel-plugins/openmoko-panel-mainmenu/src/mokodesktop_item.c	2007-03-26 09:17:57 UTC (rev 1496)
@@ -0,0 +1,321 @@
+#include "mokodesktop_item.h"
+
+
+#define WARN(txt) fprintf(stderr, "%s:%i %s %s", __FILE__, __LINE__, __func__, txt )
+
+
+MokoDesktopItem *
+mokodesktop_item_new()
+{
+  MokoDesktopItem *ditem;
+  ditem = malloc(sizeof(MokoDesktopItem));
+  memset(ditem, 0, sizeof(MokoDesktopItem));
+  
+  ditem->type = ITEM_TYPE_UNKNOWN;
+
+  return ditem;
+}
+
+void
+mokodesktop_item_free(MokoDesktopItem *item)
+{
+  if (item->name)               	free(item->name);
+  if (item->name_extended)      	free(item->name_extended);
+  if (item->comment)            	free(item->comment);
+  if (item->icon_name)         	free(item->icon_name);
+
+  free(item);
+}
+
+Bool
+mokodesktop_item_folder_has_contents(MokoDesktopItem *folder)
+{
+  if (folder->item_child && folder->item_child->item_next_sibling)
+    return True;
+  return False;
+}
+
+void
+mokodesktop_item_folder_contents_free( MokoDesktopItem *top_head_item,
+                                       MokoDesktopItem *item)
+{
+  MokoDesktopItem *item_tmp = NULL, *item_cur = NULL;
+
+  if (item->item_child && item->item_child->item_next_sibling)
+    {
+      if (item == top_head_item )
+	    {
+	       item_cur = item->item_child;
+	       top_head_item->item_child = NULL;
+	    }
+      else item_cur = item->item_child->item_next_sibling;
+
+      while (item_cur != NULL)
+	    {
+	       item_tmp = item_cur->item_next_sibling;
+
+	       if (item_cur->item_child)
+	            mokodesktop_item_folder_contents_free(top_head_item, item_cur->item_child);
+
+	       mokodesktop_item_free(item_cur); 
+	       item_cur = item_tmp;
+	    }
+	    
+      if ( item != top_head_item)
+	       item->item_child->item_next_sibling = NULL;
+    }
+    
+  // fprintf(stdout, "moko:  free ok!\n");
+}
+
+MokoDesktopItem *
+mokodesktop_item_new_with_params (  const char    *name, 
+			                              const char    *icon_name,
+			                              void          *data,
+			                              int            type)
+{
+  MokoDesktopItem *ditem;
+  ditem = mokodesktop_item_new();
+
+  if (name) ditem->name           = strdup(name);
+  if (icon_name)
+    {
+      if (strlen(icon_name) > 5
+	  && icon_name[strlen(icon_name)-4] != '.'
+	  && icon_name[strlen(icon_name)-5] != '.')
+   	  {
+	      ditem->icon_name = malloc(sizeof(char)*(strlen(icon_name)+5));
+	      sprintf(ditem->icon_name, "%s.png", icon_name); 
+	    }
+      else
+	    {
+	      ditem->icon_name = strdup(icon_name);
+	    }
+    }
+
+  if (data) ditem->data           = data;
+
+  if (type) ditem->type           = type;
+
+  return ditem;
+}
+
+
+void
+mokodesktop_items_append ( MokoDesktopItem *item_head,
+			                     MokoDesktopItem *item )
+{
+  MokoDesktopItem *item_tmp = NULL;
+
+  item_tmp = item_head;
+
+  while ( item_tmp->item_next_sibling != NULL )
+    item_tmp = item_tmp->item_next_sibling;
+
+  item_tmp->item_next_sibling = item;
+  item->item_prev_sibling = item_tmp;
+  
+  item->item_parent = item_head->item_parent;
+
+}
+
+void
+mokodesktop_items_insert_after ( MokoDesktopItem *suffix_item,
+		  	                         MokoDesktopItem *item )
+{
+  if (!suffix_item->item_next_sibling)
+    {
+      mokodesktop_items_append (suffix_item, item);
+      return;
+    }
+
+  item->item_next_sibling = suffix_item->item_next_sibling;
+
+  suffix_item->item_next_sibling->item_prev_sibling = item;
+
+  suffix_item->item_next_sibling = item;
+
+  item->item_prev_sibling = suffix_item;  
+}
+
+void
+mokodesktop_items_append_to_folder ( MokoDesktopItem  *item_folder,
+				                             MokoDesktopItem  *item )
+{
+  if (!item_folder->item_child)
+  	{
+  	   item_folder->item_child = item;
+  	   item_folder->item_child->item_parent = item_folder;
+  	   return;	
+  	} 
+  	
+  	
+  mokodesktop_items_append (item_folder->item_child, item);
+
+}
+
+void
+mokodesktop_items_append_to_top_level ( MokoDesktopItem  *top_head_item,
+                                        MokoDesktopItem  *item )
+{
+  MokoDesktopItem *top_level = top_head_item;
+
+  item->item_parent = top_level;
+
+  if (top_level->item_child == NULL)
+    top_level->item_child = item;
+  else
+    mokodesktop_items_append (top_level->item_child, item); 
+}
+
+void
+mokodesktop_items_prepend ( MokoDesktopItem **item_head,
+			                      MokoDesktopItem  *item )
+{
+  MokoDesktopItem *item_tmp = NULL;
+
+  item_tmp = *item_head;
+  item->item_next_sibling = item_tmp;
+  item_tmp->item_prev_sibling = item;
+
+  *item_head = item;
+}
+
+MokoDesktopItem *
+mokodesktop_item_get_next_sibling(MokoDesktopItem *item)
+{
+  return item->item_next_sibling;
+}
+
+MokoDesktopItem *
+mokodesktop_item_get_prev_sibling(MokoDesktopItem *item)
+{
+  return item->item_prev_sibling;
+}
+
+MokoDesktopItem *
+mokodesktop_item_get_parent(MokoDesktopItem *item)
+{
+  MokoDesktopItem *result = mokodesktop_item_get_first_sibling(item);
+
+  if (result && result->item_parent)
+    return result->item_parent;
+
+  return NULL;
+}
+
+MokoDesktopItem *
+mokodesktop_item_get_child(MokoDesktopItem *item)
+{
+  return item->item_child;
+}
+
+
+MokoDesktopItem *
+mokodesktop_item_get_first_sibling(MokoDesktopItem *item)
+{
+  while (item->item_prev_sibling != NULL )
+    item = item->item_prev_sibling;
+  return item;
+}
+
+MokoDesktopItem *
+mokodesktop_item_get_last_sibling(MokoDesktopItem *item)
+{
+  while (item->item_next_sibling != NULL )
+    item = item->item_next_sibling;
+  return item;
+}
+
+
+
+void
+mokodesktop_item_set_name ( MokoDesktopItem *item, 
+			                      char            *name)
+{
+  if (item->name) free(item->name);
+  item->name = strdup(name);
+}
+
+char *
+mokodesktop_item_get_name (MokoDesktopItem *item)
+{
+  return item->name;
+}
+
+void
+mokodesktop_item_set_comment ( MokoDesktopItem *item, 
+			                         char            *comment)
+{
+  if (item->comment) free(item->comment);
+  item->comment = strdup(comment);
+}
+
+char *
+mokodesktop_item_get_comment (MokoDesktopItem *item)
+{
+  return item->comment;
+}
+
+
+void
+mokodesktop_item_set_extended_name ( MokoDesktopItem *item, 
+				                             char            *name)
+{
+  if (item->name_extended) free(item->name_extended);
+  item->name_extended = strdup(name);
+}
+
+char *
+mokodesktop_item_get_extended_name (MokoDesktopItem *item)
+{
+  return item->name_extended;
+}
+
+void
+mokodesktop_item_set_user_data ( MokoDesktopItem *item, 
+			                         void          *data)
+{
+  if (item->data) free(item->data); 
+  item->data = data;
+}
+
+void *
+mokodesktop_item_get_user_data (MokoDesktopItem *item)
+{
+  return item->data;
+}
+
+void
+mokodesktop_item_set_activate_callback (MokoDesktopItem *item, 
+				                                MokoDesktopCB    activate_cb)
+{
+  item->activate_cb = activate_cb;
+}
+
+void
+mokodesktop_item_set_type (MokoDesktopItem *item,
+			                     int            type)
+{
+  item->subtype = type;
+}
+
+int
+mokodesktop_item_get_type (MokoDesktopItem *item)
+{
+  return item->subtype;
+}
+
+void
+mokodesktop_item_folder_activate_cb(void *data1, void *data2)
+{
+  MokoDesktopItem *top_head_item = (MokoDesktopItem *)data1; 
+  MokoDesktopItem *item = (MokoDesktopItem *)data2; 
+}
+
+void
+mbdesktop_item_folder_prev_activate_cb(void *data1, void *data2)
+{
+  MokoDesktopItem *top_head_item = (MokoDesktopItem *)data1; 
+  MokoDesktopItem *item = (MokoDesktopItem *)data2; 
+}

Added: trunk/src/target/OM-2007/panel-plugins/openmoko-panel-mainmenu/src/mokodesktop_item.h
===================================================================
--- trunk/src/target/OM-2007/panel-plugins/openmoko-panel-mainmenu/src/mokodesktop_item.h	2007-03-26 06:52:52 UTC (rev 1495)
+++ trunk/src/target/OM-2007/panel-plugins/openmoko-panel-mainmenu/src/mokodesktop_item.h	2007-03-26 09:17:57 UTC (rev 1496)
@@ -0,0 +1,124 @@
+#ifndef _HAVE_MOKODESKTOP_ITEM_H
+#define _HAVE_MOKODESKTOP_ITEM_H
+
+#include "mokodesktop.h"
+
+
+#define mokodesktop_items_enumerate_siblings(item_head, item)  	\
+  					for ( (item) = (item_head);					\
+	   				(item) != NULL;                                      			\
+	   				(item) = (item)->item_next_sibling )             		
+
+/**
+ * Constructs a new blank mbpixbuf image without an alpha channel.
+ *
+ * @returns a MBPixbufImage object
+ */
+MokoDesktopItem *mokodesktop_item_new();
+
+/**
+ * Constructs a new blank mbpixbuf image without an alpha channel.
+ *
+ * @param mokodesktop
+ * @param item
+ */
+void
+mokodesktop_item_free(MokoDesktopItem *item);
+
+Bool
+mokodesktop_item_folder_has_contents(MokoDesktopItem *folder);
+
+void
+mokodesktop_item_folder_contents_free( MokoDesktopItem *top_head_item,
+                                       MokoDesktopItem *item);
+
+
+MokoDesktopItem *
+mokodesktop_item_new_with_params (  const char    *name, 
+			                              const char    *icon_name,
+			                              void          *data,
+			                              int            type);
+
+void
+mokodesktop_items_append ( MokoDesktopItem *item_head,
+			                     MokoDesktopItem *item );
+
+void
+mokodesktop_items_insert_after ( MokoDesktopItem *suffix_item,
+		  	                         MokoDesktopItem *item );
+
+void
+mokodesktop_items_append_to_folder ( MokoDesktopItem  *item_folder,
+				                             MokoDesktopItem  *item );
+
+void
+mokodesktop_items_append_to_top_level ( MokoDesktopItem  *top_head_item,
+                                        MokoDesktopItem  *item );
+
+void
+mokodesktop_items_prepend ( MokoDesktopItem **item_head,
+			                      MokoDesktopItem  *item );
+
+MokoDesktopItem *
+mokodesktop_item_get_next_sibling(MokoDesktopItem *item) ;
+
+MokoDesktopItem *
+mokodesktop_item_get_prev_sibling(MokoDesktopItem *item);
+
+MokoDesktopItem *
+mokodesktop_item_get_parent(MokoDesktopItem *item);
+
+MokoDesktopItem *
+mokodesktop_item_get_child(MokoDesktopItem *item);
+
+MokoDesktopItem *
+mokodesktop_item_get_first_sibling(MokoDesktopItem *item);
+
+MokoDesktopItem *
+mokodesktop_item_get_last_sibling(MokoDesktopItem *item);
+
+void
+mokodesktop_item_set_name ( MokoDesktopItem *item, 
+			                      char            *name);
+
+char *
+mokodesktop_item_get_name (MokoDesktopItem *item);
+
+void
+mokodesktop_item_set_comment ( MokoDesktopItem *item, 
+			                         char            *comment);
+
+char *
+mokodesktop_item_get_comment (MokoDesktopItem *item);
+
+void
+mokodesktop_item_set_extended_name ( MokoDesktopItem *item, 
+				                             char            *name);
+
+char *
+mokodesktop_item_get_extended_name (MokoDesktopItem *item);
+
+
+void
+mokodesktop_item_set_user_data ( MokoDesktopItem *item, 
+			                         void          *data);
+void *
+mokodesktop_item_get_user_data (MokoDesktopItem *item);
+
+void
+mokodesktop_item_set_type (MokoDesktopItem *item,
+			                     int            type);
+
+int
+mokodesktop_item_get_type (MokoDesktopItem *item);
+
+void
+mokodesktop_item_set_activate_callback (MokoDesktopItem *item, 
+				                                MokoDesktopCB    activate_cb);
+
+void
+mokodesktop_item_folder_activate_cb(void *data1, void *data2);
+
+void
+mbdesktop_item_folder_prev_activate_cb(void *data1, void *data2);
+#endif

Modified: trunk/src/target/OM-2007/panel-plugins/openmoko-panel-mainmenu/src/openmoko-panel-mainmenu.c
===================================================================
--- trunk/src/target/OM-2007/panel-plugins/openmoko-panel-mainmenu/src/openmoko-panel-mainmenu.c	2007-03-26 06:52:52 UTC (rev 1495)
+++ trunk/src/target/OM-2007/panel-plugins/openmoko-panel-mainmenu/src/openmoko-panel-mainmenu.c	2007-03-26 09:17:57 UTC (rev 1496)
@@ -26,16 +26,20 @@
 #include <X11/Xatom.h>
 
 #include <unistd.h>
+#include "stylusmenu.h"
+#include "mokodesktop.h"
+#include "mokodesktop_item.h"
 
+static GtkWidget *sm = NULL;
+
 static void click( MokoPanelApplet* applet )
 {
-    //TODO integrate main menu widget into this code and just gtk_widget_show() / gtk_widget_hide() here
-    static gboolean visible = FALSE;
-    if ( !visible )
-        g_debug( "NOT YET IMPLEMENTED: show openmoko-mainmenu" );
-    else
-        g_debug( "NOT YET IMPLEMENTED: hide openmoko-mainmenu" );
-    visible = !visible;
+  g_debug ("mainmenu click callback");
+  if (sm)
+   gtk_menu_popup (sm, NULL, NULL,
+                   (GtkMenuPositionFunc)moko_menu_position_cb,
+                   NULL, 0, gtk_get_current_event_time());
+  else g_debug ("no stylus menu objcet");
 }
 
 static void tap_hold( MokoPanelApplet* applet )
@@ -64,7 +68,7 @@
 
 G_MODULE_EXPORT GtkWidget* mb_panel_applet_create(const char* id, GtkOrientation orientation)
 {
-    g_debug( "openmoko-panel-demo-simple new" );
+    g_debug( "openmoko-panel-mainmenu new" );
 
     MokoPanelApplet* applet = moko_panel_applet_new();
     g_debug( "applet is %p", applet );
@@ -72,6 +76,21 @@
     g_signal_connect( applet, "clicked", G_CALLBACK( click ), applet );
     g_signal_connect( applet, "tap-hold", G_CALLBACK( tap_hold ), applet );
     gtk_widget_show_all( GTK_WIDGET(applet) );
+    sm = gtk_menu_new ();
+    gtk_widget_show (sm);
+
+    MokoDesktopItem *top_item = NULL;
+    int ret;
+
+    top_item = mokodesktop_item_new_with_params ("Home", 
+						       NULL,
+						       NULL,
+						       ITEM_TYPE_ROOT );
+
+    ret = mokodesktop_init(top_item, ITEM_TYPE_CNT);
+
+    moko_stylus_menu_build(GTK_MENU(sm), top_item);
+
     return GTK_WIDGET(applet);
 }
 

Added: trunk/src/target/OM-2007/panel-plugins/openmoko-panel-mainmenu/src/stylusmenu.c
===================================================================
--- trunk/src/target/OM-2007/panel-plugins/openmoko-panel-mainmenu/src/stylusmenu.c	2007-03-26 06:52:52 UTC (rev 1495)
+++ trunk/src/target/OM-2007/panel-plugins/openmoko-panel-mainmenu/src/stylusmenu.c	2007-03-26 09:17:57 UTC (rev 1496)
@@ -0,0 +1,188 @@
+/*
+ *  openmoko-mainmenu
+ *
+ *  Authored by Sun Zhiyong <sunzhiyong at fic-sh.com.cn>
+ *
+ *  Copyright (C) 2006 First International Computer Inc.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU Public License as published by
+ *  the Free Software Foundation; version 2.1 of the license.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU Public License for more details.
+ *
+ *  Current Version: $Rev$ ($Date$) [$Author$]
+ */
+#include "mokodesktop_item.h"
+#include "stylusmenu.h"
+//#include "callbacks.h"
+
+struct _MokoStylusMenuPrivate{
+
+};
+enum {
+    MENU_SIGNAL = 0,
+    LAST_SIGNAL
+};
+
+static void moko_stylus_menu_class_init(MokoStylusMenuClass *klass);
+
+static void moko_stylus_menu_init(MokoStylusMenu *self);
+
+static guint stylus_menu_signals[LAST_SIGNAL] = { 0 };
+
+GType 
+moko_stylus_menu_get_type (void) /* Typechecking */
+{
+    static GType menu_type = 0;
+g_debug("get >");
+    if (!menu_type)
+    {
+        static const GTypeInfo menu_info =
+        {
+            sizeof (MokoStylusMenuClass),
+            NULL, /* base_init */
+            NULL, /* base_finalize */
+            (GClassInitFunc) moko_stylus_menu_class_init,
+            NULL, /* class_finalize */
+            NULL, /* class_data */
+            sizeof (MokoStylusMenu),
+            0,
+            (GInstanceInitFunc) moko_stylus_menu_init,
+            NULL
+        };
+        menu_type = g_type_register_static (GTK_TYPE_MENU_SHELL, "MokoStylusMenu", &menu_info, 0);
+    }
+
+g_debug("get <");
+    return menu_type;
+}
+
+void
+moko_stylus_menu_class_init (MokoStylusMenuClass * klass)
+{
+
+}
+
+void 
+moko_stylus_menu_init (MokoStylusMenu * self)
+{
+}
+
+MokoStylusMenu *
+moko_stylus_menu_new ()
+{
+    return STYLUSMENU(g_object_new(moko_stylus_menu_get_type, NULL));
+}
+
+static GtkImageMenuItem *moko_build_new_menu_item (const char *icon_name, const char *icon_path);
+
+void
+moko_stylus_menu_build (GtkMenu *menu, MokoDesktopItem *item)
+{
+  //GtkMenu *sub_menu;
+  GtkImageMenuItem *menu_item;
+    
+  MokoDesktopItem *item_new;
+g_debug ("menu build-------------------------V");
+  mokodesktop_items_enumerate_siblings(item->item_child, item_new)
+  { 
+     
+     if (access (item_new->icon_name, 0) == 0)
+     {
+         g_debug ("item patch %s", item_new->icon_name);
+         menu_item = moko_build_new_menu_item (item_new->name, item_new->icon_name);
+     }
+     else 
+     {
+       char path[512];
+       snprintf (path, 512, "%s/%s", PIXMAP_PATH, item_new->icon_name);
+       if (access (path, 0) == 0)
+           menu_item = moko_build_new_menu_item (item_new->name, path);
+       else
+         {
+	     snprintf (path, 512, "%s/%s", PKGDATADIR, "default-app-icon.xpm");
+	     menu_item = moko_build_new_menu_item (item_new->name, path);
+	     //moko_fill_model(self->list_store, path, item_new->name, item_new);
+         }
+      }
+    gtk_menu_shell_append( GTK_MENU_SHELL(menu), GTK_WIDGET(menu_item));
+    gtk_widget_show (GTK_WIDGET(menu_item));
+
+    if (item_new->type == ITEM_TYPE_FOLDER)
+    {
+      MokoDesktopItem *tmp_item;
+      GtkWidget *sub_menu;
+      sub_menu = gtk_menu_new();
+      gtk_menu_item_set_submenu (GTK_MENU_ITEM(menu_item), GTK_WIDGET(sub_menu));
+      mokodesktop_items_enumerate_siblings(item_new->item_child, tmp_item)
+      {
+        if (access (tmp_item->icon_name, 0) == 0)
+        {
+          menu_item = moko_build_new_menu_item (tmp_item->name, tmp_item->icon_name);
+        }
+        else 
+        {
+          char path[512];
+          snprintf (path, 512, "%s/%s", PIXMAP_PATH, tmp_item->icon_name);
+          if (access (path, 0) == 0)
+            menu_item = moko_build_new_menu_item (tmp_item->name, path);
+          else
+          {
+	        snprintf (path, 512, "%s/%s", PKGDATADIR, "default-app-icon.xpm");
+	        menu_item = moko_build_new_menu_item (tmp_item->name, path);
+	     //moko_fill_model(self->list_store, path, item_new->name, item_new);
+           }
+         }
+         
+		 if (tmp_item->type == ITEM_TYPE_DOTDESKTOP_ITEM ||tmp_item->type == ITEM_TYPE_APP )
+          // g_signal_connect (menu_item, "activate" ,G_CALLBACK(moko_stylus_menu_activate_item), tmp_item->data);
+         gtk_menu_shell_append( GTK_MENU_SHELL(sub_menu), GTK_WIDGET(menu_item) );
+         gtk_widget_show (GTK_WIDGET(menu_item));
+      }
+    }
+  }
+
+  return ;
+}
+
+
+static GtkImageMenuItem *
+moko_build_new_menu_item(const char *name, const char *path)
+{
+    GdkPixbuf *pixbuf;
+    GtkWidget *image;
+    GtkWidget *item;
+
+    pixbuf = gdk_pixbuf_new_from_file_at_size (path, 32, 32, NULL);
+    if(!pixbuf) g_debug ("Can't get pixbuf");
+    image = gtk_image_new_from_pixbuf (pixbuf);
+
+    item = gtk_image_menu_item_new_with_label (name);
+    gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM(item), image);
+    gtk_widget_show (GTK_WIDGET(item));
+    
+    return GTK_IMAGE_MENU_ITEM(item);
+}
+
+void
+moko_menu_position_cb (GtkMenu *menu, int *x, int *y, gboolean *push_in, gpointer *p)
+{
+ //   GtkAllocation* allocation = &GTK_WIDGET(button)->allocation;
+    //GtkRequisition req;
+    //GtkRequisition menu_req;
+    //GtkOrientation orientation;
+    //GtkTextDirection direction;
+
+   // gdk_window_get_origin(GTK_BUTTON(button)->event_window, x, y);
+    
+    //FIXME: 
+    *x = 0;
+    *y = 45;
+
+    *push_in = TRUE;
+}
+

Added: trunk/src/target/OM-2007/panel-plugins/openmoko-panel-mainmenu/src/stylusmenu.h
===================================================================
--- trunk/src/target/OM-2007/panel-plugins/openmoko-panel-mainmenu/src/stylusmenu.h	2007-03-26 06:52:52 UTC (rev 1495)
+++ trunk/src/target/OM-2007/panel-plugins/openmoko-panel-mainmenu/src/stylusmenu.h	2007-03-26 09:17:57 UTC (rev 1496)
@@ -0,0 +1,38 @@
+#ifndef _MOKO_STYLUS_MAIN_MENU_H
+#define _MOKO_STYLUS_MAIN_MENU_H
+
+#include <gtk/gtk.h>
+//#include "mokodesktop.h"
+
+G_BEGIN_DECLS
+
+#define STYLUSMENU_TYPE    (moko_stylus_menu_get_type())
+#define STYLUSMENU(obj)    (G_TYPE_CHECK_INSTANCE_CAST((obj), STYLUSMENU_TYPE, MokoStylusMenu))
+#define STYLUSMENUCALSS(klass)    (G_TYPE_CHECK_CLASS_CAST((klass), STYLUSMENU_TYPE, MokoStylusMenuClass))
+#define IS_STYLUSMENU(obj)    (G_TYPE_CHECK_INSTANCE_CAST((obj), STYLUSMENU_TYPE))
+#define IS_STYLUSMENUCALSS(klass)    (G_TYPE_CHECK_CLASS_CAST((klass), STYLUSMENU_TYPE))
+
+typedef struct _MokoStylusMenu    MokoStylusMenu;
+typedef struct _MokoStylusMenuPrivate    MokoStylusMenuPrivate;
+typedef struct _MokoStylusMenuClass    MokoStylusMenuClass;
+
+struct _MokoStylusMenu{
+    GtkMenu parent;
+
+  //  MokoStylusMenuPrivate *priv;
+};
+
+struct _MokoStylusMenuClass{
+    GtkMenuShell parent_class;
+};
+
+GType moko_stylus_menu_get_type(void);
+
+MokoStylusMenu *moko_stylus_menu_new ();
+
+//void moko_stylus_menu_build (GtkMenu *menu, MokoDesktopItem *item);
+
+void moko_menu_position_cb (GtkMenu *menu, int *x, int *y, gboolean *push_in, gpointer *p);
+ 
+G_END_DECLS
+#endif /*_MOKO_STYLUS_MAIN_MENU_H*/





More information about the commitlog mailing list