Openmobility Zlín 2010.0 Maemo workshop

Instalace SDK

Bude pouze naznačena - je potřeba více úkonů a může být časově náročná. Rychlý průlet na pět až deset minut...

Pro hardocore zájemce - návod na Maemo.org.

Připojení ke vzdálenému SDK

Pro jednoduchost - přeci jen instalace SDK může zabrat půlku worshopu - je připravený bežící server (díky JoeJoe) pcmlich.fit.vutbr.cz. Přihlašovací údaje jsou - uživatel i heslo - openmobility. Následně se přihlaste

/scratchbox/login

Pro připojení z Windows použijte MobaXterm.

V Linuxu:

ssh -x openmobility@pcmlich.fit.vutbr.cz

Ještě před spuštěním Scratchboxu můžete spustit Xephyr s parametry displeje N900. (Případně nasměrovat výstup přímo na Xephyr na Vašem lokálním PC, či přímo do X serveru.

Xephyr :X -host-cursor -screen 800x480x16 -dpi 96 &
,kde za X dejte libovolné číslo > 1, které bude volné.

Poté již ve Scratchboxu:

export DISPLAY=:X

Příklady

Na hraní je připravené na serveru pískoviště - Sandbox. Vzhledem k zbytečné náročnosti (tolik práce by to zase nebylo :D) připravit pro každého uživatele vlastní účet, prosím - vytvořte si v daném adresáři vlastní unikátní! podadresář a do něho nakopírujte vzorové příklady.

Status menu widget

Tento widget přidá do status menu ikonku (malý zavináč) a na kliknutí "vyjede" nápis Openmobility. 1. Do Sandboxu si zkopírujte Workshop/hildon-status-menu-widget-example 2. Vytvořte soubor lib-example-status-menu-widget.c 3. Do souboru zkopírujte šablonu
#include 
#include 
#include 
#include 

#include "lib-example-status-menu-widget.h"

#define EXAMPLE_STATUS_PLUGIN_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE (obj,   \
                            TYPE_EXAMPLE_STATUS_PLUGIN, ExampleStatusPluginPrivate))

struct _ExampleStatusPluginPrivate
{
    /* TODO 1 */
    gpointer data;
};

static void
example_status_plugin_class_finalize (ExampleStatusPluginClass *klass) {}

static void
example_status_plugin_class_init (ExampleStatusPluginClass *klass)
{
    g_type_class_add_private (klass, sizeof (ExampleStatusPluginPrivate));
}

static void
example_status_plugin_init (ExampleStatusPlugin *plugin)
{
    plugin->priv = EXAMPLE_STATUS_PLUGIN_GET_PRIVATE (plugin);


/* TODO 2 */

}
Hlavičkový soubor je celý zde:
#ifndef __EXAMPLE_STATUS_PLUGIN_H__
#define __EXAMPLE_STATUS_PLUGIN_H__

#include <libhildondesktop/libhildondesktop.h>

G_BEGIN_DECLS

#define TYPE_EXAMPLE_STATUS_PLUGIN            (example_status_plugin_get_type ())

#define EXAMPLE_STATUS_PLUGIN(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), \
                                    TYPE_EXAMPLE_STATUS_PLUGIN, ExampleStatusPlugin))
 
#define EXAMPLE_STATUS_PLUGIN_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), \
                                TYPE_EXAMPLE_STATUS_PLUGIN, ExampleStatusPluginClass))

#define IS_EXAMPLE_STATUS_PLUGIN(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \
                                                    TYPE_EXAMPLE_STATUS_PLUGIN))

#define IS_EXAMPLE_STATUS_PLUGIN_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), \
                                                    TYPE_EXAMPLE_STATUS_PLUGIN))

#define EXAMPLE_STATUS_PLUGIN_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), \
                            TYPE_EXAMPLE_STATUS_PLUGIN, ExampleStatusPluginClass))

#define STATUS_AREA_EXAMPLE_ICON_SIZE 22

typedef struct _ExampleStatusPlugin        ExampleStatusPlugin;
typedef struct _ExampleStatusPluginClass   ExampleStatusPluginClass;
typedef struct _ExampleStatusPluginPrivate ExampleStatusPluginPrivate; 

struct _ExampleStatusPlugin
{
    HDStatusMenuItem parent;

    ExampleStatusPluginPrivate *priv;
};

struct _ExampleStatusPluginClass
{
    HDStatusMenuItemClass parent;
};

GType example_status_plugin_get_type (void);

G_END_DECLS

#endif
Teď nám chybí doplnit TODOS. Co chceme udělat je, nastavit ikonku a zobrazit nápis - tedy chceme GtkWidget a ten bude label. Do privátní struktury si přidáme GtkWidget *label;
struct _ExampleStatusPluginPrivate
{
    GtkWidget *label;
    gpointer data;
};
Skutečně ho vytvoříme pozdějí a nejprve zkusíme nastavit ikonku ve status baru.
    GtkIconTheme *icon_theme = gtk_icon_theme_get_default ();
    GList *list = gtk_icon_theme_list_icons (icon_theme, NULL);
    GdkPixbuf *pixbuf = gtk_icon_theme_load_icon (icon_theme, "general_email",
                    STATUS_AREA_EXAMPLE_ICON_SIZE, GTK_ICON_LOOKUP_NO_SVG, NULL);
    hd_status_plugin_item_set_status_area_icon (HD_STATUS_PLUGIN_ITEM (plugin), pixbuf);
    g_object_unref (pixbuf);
Máme ikonku nastavenou a vytvořme label.
    GtkWidget *b = gtk_label_new ("Openmobility");
    gtk_widget_show_all (b);
Label si schováme na horší časy (ale nemusíme) a zobrazíme ho v kontejneru pluginu.
    plugin->priv->label = b;

    gtk_container_add (GTK_CONTAINER (plugin), plugin->priv->label);

    gtk_widget_show_all (plugin->priv->label);

   gtk_widget_show (GTK_WIDGET (plugin));

Překlad

./autogen.sh
./configure
make
Instalace (tento krok přeskočíme).
fakeroot make install
Samozřejmě nejčistší řešení je připravení Debianího balíčku.

Hildon timeout widget

Stejným způsobem si můžete zkusit i widget na plochu :)

Ostatní

Další příklady, které si můžete zkusit naleznete v adresáři Examples. Doporučuji téže mrknout se do SVN Maema, odkud jsou čerpány.

Příkaz pro checkout z SVN:

svn co http://vcs.maemo.org/svn/maemoexamples/tags/maemo_5.0/priklad

Telepathy-Qt a SMS

Zajímavým příkladem je využití frameworku Telepathy k odesílání SMS zpráv (a samozřejmě taky k jejich příjmu). A celou práci opravdu hodně ulehčí knihovna TpSession. Zdrojáky tentokráte v GITu.
git clone https://vcs.maemo.org/git/tpsession
TestProg::TestProg(QString addr,QString msg)
{
  message=msg;
  address=addr;
  tps =new TpSession("ring");
  connect(tps,SIGNAL(accountReady(TpSessionAccount *)),SLOT(onAccountReady(TpSessionAccount *)));
  connect(tps,SIGNAL(messageReceived(const Tp::ReceivedMessage &,TpSessionAccount *)),
                SLOT(onMessageReceived(const Tp::ReceivedMessage &,TpSessionAccount *)));
}

void TestProg::onAccountReady(TpSessionAccount *tpsa)
{
    tpsa->sendMessageToAddress(address,message);
};

void TestProg::onMessageReceived(const Tp::ReceivedMessage &msg,TpSessionAccount *acc)
{
    qDebug() << "TestProg::onMessageReceived " << msg.text() << "from " << msg.sender()->id();
}
Více v garáži..