r1157 - in trunk/src/target/OM-2007/applications/openmoko-mainmenu: . src

zhiyong_sun at sita.openmoko.org zhiyong_sun at sita.openmoko.org
Wed Feb 28 08:26:33 CET 2007


Author: zhiyong_sun
Date: 2007-02-28 08:26:23 +0100 (Wed, 28 Feb 2007)
New Revision: 1157

Added:
   trunk/src/target/OM-2007/applications/openmoko-mainmenu/src/dbus-conn.c
   trunk/src/target/OM-2007/applications/openmoko-mainmenu/src/dbus-conn.h
Modified:
   trunk/src/target/OM-2007/applications/openmoko-mainmenu/configure.ac
   trunk/src/target/OM-2007/applications/openmoko-mainmenu/src/Makefile.am
   trunk/src/target/OM-2007/applications/openmoko-mainmenu/src/callbacks.c
   trunk/src/target/OM-2007/applications/openmoko-mainmenu/src/callbacks.h
   trunk/src/target/OM-2007/applications/openmoko-mainmenu/src/main.c
   trunk/src/target/OM-2007/applications/openmoko-mainmenu/src/main.h
   trunk/src/target/OM-2007/applications/openmoko-mainmenu/src/mainmenu.c
Log:
add dbus message send function: when one item was selected, its name will be sent to footer

Modified: trunk/src/target/OM-2007/applications/openmoko-mainmenu/configure.ac
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-mainmenu/configure.ac	2007-02-28 07:04:28 UTC (rev 1156)
+++ trunk/src/target/OM-2007/applications/openmoko-mainmenu/configure.ac	2007-02-28 07:26:23 UTC (rev 1157)
@@ -13,12 +13,15 @@
 # base deps
 PKG_CHECK_MODULES(OPENMOKO, openmoko-libs >= 0.0.1,,
                  AC_MSG_ERROR([*** Required OpenMoko Libraries >= 0.0.1 not installed ***]))
-
 PKG_CHECK_MODULES(LIBMB, libmb >= 1.8,,
                  AC_MSG_ERROR([*** You need to install libmatchbox >= 1.8***]))
+PKG_CHECK_MODULES(DBUSGLIB, dbus-glib-1,,
+                 AC_MSG_ERROR([*** Required dbus-glib-1 not installed ***]))
+PKG_CHECK_MODULES(DBUS, dbus-1,,
+                 AC_MSG_ERROR([*** Required dbus-1 not installed ***]))
 
-LIBS="$LIBS $OPENMOKO_LIBS $LIBMB_LIBS"
-CFLAGS="$CFLAGS $OPENMOKO_CFLAGS $LIBMB_CFLAGS"
+LIBS="$LIBS $OPENMOKO_LIBS $LIBMB_LIBS $DBUSGLIB_LIBS $DBUS_LIBS"
+CFLAGS="$CFLAGS $OPENMOKO_CFLAGS $LIBMB_CFLAGS $DBUSGLIB_CFLAGS $DBUS_CFALGS"
 
 # output stuff
 AC_OUTPUT([

Modified: trunk/src/target/OM-2007/applications/openmoko-mainmenu/src/Makefile.am
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-mainmenu/src/Makefile.am	2007-02-28 07:04:28 UTC (rev 1156)
+++ trunk/src/target/OM-2007/applications/openmoko-mainmenu/src/Makefile.am	2007-02-28 07:26:23 UTC (rev 1157)
@@ -7,7 +7,7 @@
 openmoko_mainmenu_SOURCES = main.c \
 			   mainmenu.c mokoiconview.c\
 			   mokodesktop.c mokodesktop_item.c\
-			   callbacks.c app-history.c
+			   callbacks.c app-history.c dbus-conn.c
 
 
 openmoko_mainmenu_LDADD = @OPENMOKO_LIBS@ @LIBMB_LIBS@

Modified: trunk/src/target/OM-2007/applications/openmoko-mainmenu/src/callbacks.c
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-mainmenu/src/callbacks.c	2007-02-28 07:04:28 UTC (rev 1156)
+++ trunk/src/target/OM-2007/applications/openmoko-mainmenu/src/callbacks.c	2007-02-28 07:26:23 UTC (rev 1157)
@@ -35,100 +35,111 @@
 void
 moko_wheel_bottom_press_cb (GtkWidget *self, MokoMainmenuApp *mma)
 {
-  if (mma->mm->current->type != ITEM_TYPE_ROOT)
-  {
-    mma->mm->current = mokodesktop_item_get_parent(mma->mm->current);
-    moko_main_menu_update_content (mma->mm, mma->mm->current);
-    gtk_window_present (mma->window);
-  }
-  else 
-  {
-    gtk_widget_hide (GTK_WIDGET (mma->wheel));
-    gtk_widget_hide (GTK_WIDGET (mma->toolbox));
-    gtk_widget_hide (GTK_WIDGET (mma->window));
-  }
+    if (mma->mm->current->type != ITEM_TYPE_ROOT)
+    {
+        mma->mm->current = mokodesktop_item_get_parent(mma->mm->current);
+        moko_main_menu_update_content (mma->mm, mma->mm->current);
+        gtk_window_present (mma->window);
+    }
+    else 
+    {
+        gtk_widget_hide (GTK_WIDGET (mma->wheel));
+        gtk_widget_hide (GTK_WIDGET (mma->toolbox));
+        gtk_widget_hide (GTK_WIDGET (mma->window));
+    }
 }
 
 void
 moko_wheel_left_up_press_cb (GtkWidget *self, MokoMainmenuApp *mma)
 {
  
-  g_signal_emit_by_name (G_OBJECT(mma->mm->icon_view), "move-cursor", GTK_MOVEMENT_DISPLAY_LINES, -1);
+    g_signal_emit_by_name (G_OBJECT(mma->mm->icon_view), "move-cursor", GTK_MOVEMENT_DISPLAY_LINES, -1);
   //gtk_window_present (mma->window);
   //gtk_widget_grab_focus (mma->mm->icon_view);
-
 }
 
 void
 moko_wheel_right_down_press_cb (GtkWidget *self, MokoMainmenuApp *mma)
 {
   //gtk_widget_grab_focus (mma->mm->icon_view);
-  g_signal_emit_by_name (G_OBJECT(mma->mm->icon_view), "move-cursor", GTK_MOVEMENT_DISPLAY_LINES, 1);
+    g_signal_emit_by_name (G_OBJECT(mma->mm->icon_view), "move-cursor", GTK_MOVEMENT_DISPLAY_LINES, 1);
 }
 
-void 
-moko_up_btn_cb (GtkButton *button, MokoMainMenu *mm)
-{
-  gtk_widget_grab_focus (mm->icon_view);
-  g_signal_emit_by_name (G_OBJECT(mm->icon_view), "move-cursor", GTK_MOVEMENT_DISPLAY_LINES, -1);
-}
-
-void 
-moko_down_btn_cb (GtkButton *button, MokoMainMenu *mm)
-{
-  gtk_widget_grab_focus (mm->icon_view);
-  g_signal_emit_by_name (G_OBJECT(mm->icon_view), "move-cursor", GTK_MOVEMENT_DISPLAY_LINES, 1);
-}
-
 void
-moko_icon_view_item_acitvated_cb(GtkIconView *icon_view, 
-						GtkTreePath *path, MokoMainmenuApp *mma) 
+moko_icon_view_item_acitvated_cb(MokoIconView *icon_view, 
+				GtkTreePath *path, MokoMainmenuApp *mma) 
 {
-  g_debug ("call moko_item_acitvated_cb");
-  MokoDesktopItem *select_item = mokodesktop_item_get_child (mma->mm->current);
-  gint index, i;
+    g_debug ("call moko_item_acitvated_cb");
+    MokoDesktopItem *select_item = mokodesktop_item_get_child (mma->mm->current);
+    gint index, i;
   
-  index = moko_icon_view_get_cursor_positon (icon_view);
+    index = moko_icon_view_get_cursor_positon (icon_view);
 
-  for (i = 1; i < index; i++)
-  {
-    select_item = mokodesktop_item_get_next_sibling (select_item);
-  }
+    for (i = 1; i < index; i++)
+    {
+        select_item = mokodesktop_item_get_next_sibling (select_item);
+    }
 
-  g_debug ("select_item name %s TYPE is %d", select_item->name, select_item->type);
+    g_debug ("select_item name %s TYPE is %d", select_item->name, select_item->type);
 
-  if (select_item->type == ITEM_TYPE_FOLDER)
-  {
-    mma->mm->current = select_item;
-    g_debug ("current name %s------------------", mma->mm->current->name);
-    moko_main_menu_update_content (mma->mm, select_item);
-  }
-  else if (select_item->type == ITEM_TYPE_DOTDESKTOP_ITEM ||select_item->type == ITEM_TYPE_APP)
-  {
-   switch (fork())
+    if (select_item->type == ITEM_TYPE_FOLDER)
     {
-        case 0:
-      mb_exec((char *)select_item->data);
-      fprintf(stderr, "exec failed, cleaning up child\n");
-      exit(1);
-    case -1:
-      fprintf(stderr, "can't fork\n");
-      break;
+        mma->mm->current = select_item;
+        g_debug ("current name %s------------------", mma->mm->current->name);
+        moko_main_menu_update_content (mma->mm, select_item);
     }
-     char path[512];
-     snprintf (path, 512, "%s/%s", PIXMAP_PATH, select_item->icon_name);
-     g_debug ("-------select_item path: %s", path);
-      moko_hisory_app_fill(mma->history, path);
-  }
+    else if (select_item->type == ITEM_TYPE_DOTDESKTOP_ITEM ||select_item->type == ITEM_TYPE_APP)
+    {
+        switch (fork())
+        {
+          case 0:
+              mb_exec((char *)select_item->data);
+              fprintf(stderr, "exec failed, cleaning up child\n");
+              exit(1);
+          case -1:
+              fprintf(stderr, "can't fork\n");
+              break;
+        }
+    
+        char path[512];
+        snprintf (path, 512, "%s/%s", PIXMAP_PATH, select_item->icon_name);
+        g_debug ("-------select_item path: %s", path);
+        moko_hisory_app_fill (mma->history, path);
+    }
 
-moko_icon_view_selection_changed_cb(mma->mm->icon_view, mma);  
-
+    moko_icon_view_selection_changed_cb (mma->mm->icon_view, mma);  
 }
 
 void
-moko_icon_view_selection_changed_cb(GtkIconView *iconview, 
-								MokoMainmenuApp *mma) 
+moko_icon_view_selection_changed_cb(MokoIconView *iconview, 
+				MokoMainmenuApp *mma) 
 {
+    GList *selected_item;
+    GtkTreeIter iter;
+    GtkTreePath *path;
+    GtkTreeModel *icon_view_model;
+    gchar *text;
+  
+    selected_item = moko_icon_view_get_selected_items (iconview);
+    if (!selected_item)
+        g_debug ("Can't get selected item");
+    else 
+    {
+        icon_view_model = moko_icon_view_get_model (iconview);
+        gtk_tree_model_get_iter (icon_view_model, &iter, selected_item->data);
+
+        gtk_tree_model_get (icon_view_model, &iter,
+                       TEXT_COLUMN , &text,
+                      -1);
+
+        moko_dbus_send_message (text);
+        
+	g_list_foreach (selected_item, gtk_tree_path_free, NULL);
+        g_list_free (selected_item);
+        if (text) 
+	    free (text);
+    }
+
     moko_main_menu_update_item_total_label (mma->mm);
 }
 

Modified: trunk/src/target/OM-2007/applications/openmoko-mainmenu/src/callbacks.h
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-mainmenu/src/callbacks.h	2007-02-28 07:04:28 UTC (rev 1156)
+++ trunk/src/target/OM-2007/applications/openmoko-mainmenu/src/callbacks.h	2007-02-28 07:26:23 UTC (rev 1157)
@@ -34,13 +34,13 @@
 
 void moko_down_btn_cb (GtkButton *button, MokoMainMenu *mm);
 
-void moko_item_select_cb(GtkIconView *icon_view, 
+void moko_item_select_cb(MokoIconView *icon_view, 
 				GtkTreePath *path, MokoMainmenuApp *mma);
 
-void moko_icon_view_item_acitvated_cb(GtkIconView *iconview, 
+void moko_icon_view_item_acitvated_cb(MokoIconView *iconview, 
 				GtkTreePath *path, MokoMainmenuApp *mma);
 
-void moko_icon_view_selection_changed_cb(GtkIconView *iconview, 
+void moko_icon_view_selection_changed_cb(MokoIconView *iconview, 
 				MokoMainmenuApp *mma);
 
 #endif /*_MAIN_MENU_CALLBACKS_H*/

Added: trunk/src/target/OM-2007/applications/openmoko-mainmenu/src/dbus-conn.c
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-mainmenu/src/dbus-conn.c	2007-02-28 07:04:28 UTC (rev 1156)
+++ trunk/src/target/OM-2007/applications/openmoko-mainmenu/src/dbus-conn.c	2007-02-28 07:26:23 UTC (rev 1157)
@@ -0,0 +1,73 @@
+/**
+ *  @file dbus-conn.c
+ *  @brief dbus connection and message send for openmoko mainmenu
+ *  
+ *  Authored by Sun Zhiyong <sunzhiyong at fic-sh.com.cn>
+ *  
+ *  Copyright (C) 2006-2007 OpenMoko 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 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 "dbus-conn.h"
+
+static DBusConnection *bus;
+static DBusError error;
+
+gboolean
+moko_dbus_connect_init (void)
+{
+    /* Get a connection to the session bus */
+    dbus_error_init (&error);
+    bus = dbus_bus_get (DBUS_BUS_SESSION, &error);
+
+    if (!bus)
+    {
+        g_warning ("Failed to connect to the D-BUS daemon: %s", error.message);
+        return FALSE;
+    }
+  
+    if (dbus_error_is_set (&error))
+    {
+        fprintf(stdout, "Connection Error (%s)\n", error.message);
+        dbus_error_free (&error);
+    }
+
+    return TRUE;
+}
+
+gboolean
+moko_dbus_send_message (const char *str)
+{
+  DBusMessage *message;
+  //char *str = "openmoko taskmanager";
+
+  /* Create a new signal on the "org.openmoko.dbus.TaskManager" interface,
+   * from the object "/org/openmoko/footer". */
+  message = dbus_message_new_signal ("/org/openmoko/footer",
+                                     "org.openmoko.dbus.TaskManager", "push_statusbar_message");
+  /* Append the string "openmoko taskmanager" to the signal */
+  dbus_message_append_args (message,
+  			    DBUS_TYPE_STRING, &str,
+                            DBUS_TYPE_INVALID);
+  /* Send the signal */
+  dbus_connection_send (bus, message, NULL);
+
+  /* Free the signal now we have finished with it */
+  dbus_message_unref (message);
+  
+  /* Tell the user we send a signal */
+  g_print("send signal\n");
+  
+  /* Return TRUE to tell the event loop we want to be called again */
+  return TRUE;
+}

Added: trunk/src/target/OM-2007/applications/openmoko-mainmenu/src/dbus-conn.h
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-mainmenu/src/dbus-conn.h	2007-02-28 07:04:28 UTC (rev 1156)
+++ trunk/src/target/OM-2007/applications/openmoko-mainmenu/src/dbus-conn.h	2007-02-28 07:26:23 UTC (rev 1157)
@@ -0,0 +1,35 @@
+/**
+ *  @file dbus-conn.h
+ *  @brief dbus connection and message send for openmoko mainmenu
+ *  
+ *  Authored by Sun Zhiyong <sunzhiyong at fic-sh.com.cn>
+ *  
+ *  Copyright (C) 2006-2007 OpenMoko 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 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$]
+ *
+ */
+#ifndef MOKO_DBUS_MESSAGE_SEND_H
+#define MOKO_DBUS_MESSAGE_SEND_H
+#include <glib.h>
+#include <dbus/dbus-glib.h>
+#include <dbus/dbus.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+#define DBUS_API_SUBJECT_TO_CHANGE
+
+gboolean moko_dbus_connect_init (void);
+
+gboolean moko_send_message (const char *str);
+
+#endif /*MOKO_DBUS_MESSAGE_SEND_H*/

Modified: trunk/src/target/OM-2007/applications/openmoko-mainmenu/src/main.c
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-mainmenu/src/main.c	2007-02-28 07:04:28 UTC (rev 1156)
+++ trunk/src/target/OM-2007/applications/openmoko-mainmenu/src/main.c	2007-02-28 07:26:23 UTC (rev 1157)
@@ -125,13 +125,21 @@
     g_debug ("test");
     
     mma = g_malloc0 (sizeof (MokoMainmenuApp));
-    if (!mma) {
+    if (!mma)
+    {
     	fprintf (stderr, "openmoko-mainmenu application initialize FAILED");
     	exit (0);
-    	}
+    }
     memset (mma, 0, sizeof (MokoMainmenuApp));
+
+    if (!moko_dbus_connect_init ())
+    {
+        g_error ("Failed to initial dbus connection.");
+	exit (0);
+    }
     gtk_init( &argc, &argv );
 
+
     /* application object */
     mma->app = MOKO_APPLICATION(moko_application_get_instance());
     g_set_application_name( "OpenMoko Main Menu" );

Modified: trunk/src/target/OM-2007/applications/openmoko-mainmenu/src/main.h
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-mainmenu/src/main.h	2007-02-28 07:04:28 UTC (rev 1156)
+++ trunk/src/target/OM-2007/applications/openmoko-mainmenu/src/main.h	2007-02-28 07:26:23 UTC (rev 1157)
@@ -30,6 +30,7 @@
 
 #include "mainmenu.h"
 #include "app-history.h"
+#include "dbus-conn.h"
 
 typedef struct _MokoMainmenuApp MokoMainmenuApp;
 

Modified: trunk/src/target/OM-2007/applications/openmoko-mainmenu/src/mainmenu.c
===================================================================
--- trunk/src/target/OM-2007/applications/openmoko-mainmenu/src/mainmenu.c	2007-02-28 07:04:28 UTC (rev 1156)
+++ trunk/src/target/OM-2007/applications/openmoko-mainmenu/src/mainmenu.c	2007-02-28 07:26:23 UTC (rev 1157)
@@ -192,7 +192,7 @@
 */
 static gboolean
 moko_fill_model(GtkListStore *store, const char* icon_path, 
-						const char* icon_name, MokoDesktopItem *item)
+		const char* icon_name, MokoDesktopItem *item)
 {
     if (!icon_path && !icon_name)
         return FALSE;
@@ -234,12 +234,13 @@
 moko_main_menu_clear(MokoMainMenu *mm) 
 { 
     if (mm->top_item)
-    	{
-    	  /* Free Lists (free .directory and .desktop files) */
-	  mokodesktop_item_folder_contents_free(mm->top_item, mm->top_item);
-	  /* Free Root item */
-	  mokodesktop_item_free(mm->top_item);
-    	}
+    {
+        /* Free Lists (free .directory and .desktop files) */
+	mokodesktop_item_folder_contents_free(mm->top_item, mm->top_item);
+	/* Free Root item */
+	mokodesktop_item_free(mm->top_item);
+    }
+    
     if (mm) g_free (mm);
 }
 
@@ -256,50 +257,50 @@
 gboolean
 moko_main_menu_update_content (MokoMainMenu *mm, MokoDesktopItem *item)
 {
-  MokoDesktopItem *item_new;
-  gint count = 0;
-  char total_item[6];
-  //g_debug("mokodesktop: item [%d][%s][%s]\n", item->type, item->name, item->icon_name);
+    MokoDesktopItem *item_new;
+    gint count = 0;
+    char total_item[6];
+    //g_debug("mokodesktop: item [%d][%s][%s]\n", item->type, item->name, item->icon_name);
     
-  item_new = item->item_child;
-  //g_debug("mokodesktop: item [%d][%s][%s]\n", item_new->type, item_new->name, item_new->icon_name);
- // g_debug ("test");
+    item_new = item->item_child;
+    //g_debug("mokodesktop: item [%d][%s][%s]\n", item_new->type, item_new->name, item_new->icon_name);
+    // g_debug ("test");
 
-  if (item->type == ITEM_TYPE_ROOT)
-  	{
+    if (item->type == ITEM_TYPE_ROOT)
+    {
   	moko_set_label_content (mm->section_name, "Main Menu");
-  	}
-  else if (item->type == ITEM_TYPE_FOLDER)
-  	{
-  	moko_set_label_content (mm->section_name, item->name);
-  	}
-  else 
+    }
+    else if (item->type == ITEM_TYPE_FOLDER)
+    {
+        moko_set_label_content (mm->section_name, item->name);
+    }
+    else 
   	return FALSE; // neither ROOT nor FOLDER
 
-  if (mm->list_store)
+    if (mm->list_store)
   	gtk_list_store_clear (mm->list_store);
 
-  mokodesktop_items_enumerate_siblings(item->item_child, item_new)
-  { 
-     count +=1;
+    mokodesktop_items_enumerate_siblings(item->item_child, item_new)
+    { 
+        count +=1;
      
-     if (access (item_new->icon_name, 0) == 0)
-     {
-      	moko_fill_model(mm->list_store, item_new->icon_name, item_new->name, item_new);
-     }
-     else 
-     {
-       char path[512];
-       snprintf (path, 512, "%s/%s", PIXMAP_PATH, item_new->icon_name);
+        if (access (item_new->icon_name, 0) == 0)
+        {
+      	    moko_fill_model(mm->list_store, item_new->icon_name, item_new->name, item_new);
+        }
+        else 
+        {
+            char path[512];
+            snprintf (path, 512, "%s/%s", PIXMAP_PATH, item_new->icon_name);
 
-       if (access (path, 0) == 0)
-          moko_fill_model(mm->list_store, path, item_new->name, item_new);
-       else
-         {
-	     snprintf (path, 512, "%s/%s", PKGDATADIR, "default-app-icon.xpm");
-      	     moko_fill_model(mm->list_store, path, item_new->name, item_new);
-         }
-      }
+            if (access (path, 0) == 0)
+                moko_fill_model(mm->list_store, path, item_new->name, item_new);
+            else
+            {
+	        snprintf (path, 512, "%s/%s", PKGDATADIR, "default-app-icon.xpm");
+      	        moko_fill_model(mm->list_store, path, item_new->name, item_new);
+            }
+        }
     }
 
   snprintf (total_item, 6, "00/%.2d", count);
@@ -318,17 +319,17 @@
 void
 moko_main_menu_update_item_total_label (MokoMainMenu *mm)
 {  
-  gint total = 0, cursor = 0;
-  char item_total[6];
+    gint total = 0, cursor = 0;
+    char item_total[6];
 
-  total = moko_icon_view_get_total_items (mm->icon_view);
-  cursor = moko_icon_view_get_cursor_positon (mm->icon_view);
+    total = moko_icon_view_get_total_items (mm->icon_view);
+    cursor = moko_icon_view_get_cursor_positon (mm->icon_view);
 
-  if (cursor <0)
+    if (cursor <0)
   	return;
 
-  snprintf (item_total, 6, "%.2d/%.2d", cursor, total);
-  moko_set_label_content (mm->item_total, item_total);
+    snprintf (item_total, 6, "%.2d/%.2d", cursor, total);
+    moko_set_label_content (mm->item_total, item_total);
 }
 
 /**





More information about the commitlog mailing list