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 = >K_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