文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>Hildon创建窗口,菜单,工具栏实例

Hildon创建窗口,菜单,工具栏实例

时间:2009-08-25  来源:hanjinlai

#include <gtk/gtk.h>

#ifdef USE_HILDON
#include <hildon/hildon-program.h>
#include <hildon/hildon-window.h>
#define USE_LIBOSSO
#endif

#ifdef USE_LIBOSSO
#include <libosso.h>

struct _instance
{
osso_context_t *osso;
GtkWidget *window;
};

typedef struct _instance instance;

static gint handler(const gchar *interface, const gchar *method,
                   GArray *arguments, gpointer data, osso_rpc_t *retval)
{
  retval->type = DBUS_TYPE_INT32;
  retval->value.i = OSSO_ERROR;

  if (method != NULL && strcmp(method, "top_application") == 0)
  {
    instance *inst = (instance *) data;
    gtk_window_present(GTK_WINDOW(inst->window));
    retval->value.i = OSSO_OK;
  }
  return retval->value.i;
}

static instance g_inst;

static osso_init(GtkWidget *window)
{
  g_inst.osso = osso_initialize("org.moblin.helloworld3", "", TRUE, NULL);
  g_inst.window = window;
  if(g_inst.osso == NULL)
    g_print("osso_initialize error\n");
  else
  {
    osso_return_t r;
    r = osso_rpc_set_default_cb_f(g_inst.osso, (osso_rpc_cb_f *) handler,
                                  &g_inst);
    if (r != OSSO_OK)
      g_print("osso_rpc_set_default_cb_f error\n");
  }
}

static osso_exit(void)
{
  if (g_inst.osso)
  {
    osso_deinitialize(g_inst.osso);
  }
}
#else
#define osso_init(a)
#define osso_exit()
#endif

static gboolean quit1(GtkWidget *widget, GdkEvent *event)
{
  g_print("quit1\n");
  gtk_main_quit();
}

static gboolean quit2(GtkWidget *widget, GdkEvent *event)
{
  g_print("quit2\n");
  gtk_main_quit();
}

static void destroy(GtkWidget *widget, gpointer data)
{
  g_print("destroy\n");
  gtk_main_quit();
}

static void add_menu(GtkWidget *window, GtkWidget *box)
{
#ifdef USE_HILDON
  GtkWidget *menubar = gtk_menu_new();
#else
  GtkWidget *menubar = gtk_menu_bar_new();
  gtk_box_pack_start(GTK_BOX(box), menubar, FALSE, FALSE, 0);
#endif
  GtkAccelGroup *accel = gtk_accel_group_new();
  gtk_window_add_accel_group(GTK_WINDOW(window), accel);

  GtkWidget *fileitem = gtk_menu_item_new_with_mnemonic("_File");
  gtk_menu_shell_append(GTK_MENU_SHELL(menubar), fileitem);

  GtkWidget *filemenu = gtk_menu_new();
  gtk_menu_item_set_submenu(GTK_MENU_ITEM(fileitem), filemenu);

  GtkWidget *q = gtk_image_menu_item_new_from_stock(GTK_STOCK_QUIT, accel);
  gtk_menu_shell_append(GTK_MENU_SHELL(filemenu), q);
  g_signal_connect_swapped(G_OBJECT(q), "activate", G_CALLBACK(quit1), NULL);
#ifdef USE_HILDON
  hildon_window_set_menu((HildonWindow *) window, GTK_MENU(menubar));
#endif
}

static void add_toolbar(GtkWidget *window, GtkWidget *box)
{
  GtkWidget *toolbar = gtk_toolbar_new();
#ifdef USE_HILDON
  hildon_window_add_toolbar((HildonWindow *) window, GTK_TOOLBAR(toolbar));
#else
  gtk_box_pack_start(GTK_BOX(box), toolbar, FALSE, FALSE, 0);
#endif

  GtkToolItem *q = gtk_tool_button_new_from_stock(GTK_STOCK_QUIT);
  g_signal_connect_swapped(G_OBJECT(q), "clicked", G_CALLBACK(quit2), NULL);

  gtk_toolbar_insert(GTK_TOOLBAR(toolbar), q, -1);
}

int main(int argc, char *argv[])
{
  static char hello[] = "Hello World! (v 3.0)";
 
  gtk_init (&argc, &argv);
#ifdef USE_HILDON
  HildonProgram *program = hildon_program_get_instance();
  HildonWindow *hildon_window = HILDON_WINDOW(hildon_window_new());
  hildon_program_add_window(program, hildon_window);
  GtkWidget *window = GTK_WIDGET(hildon_window);
#else
  GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
#endif
  gtk_widget_set_size_request(window, 250, -1);
  osso_init(window);
 
  GtkWidget *vbox = gtk_vbox_new(FALSE, 0);
  gtk_container_add(GTK_CONTAINER(window), vbox);
 
  gtk_window_set_title(GTK_WINDOW(window), hello);
  g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(destroy), NULL);
 
  add_menu(window, vbox);
  add_toolbar(window, vbox);

  GtkWidget *label1 = gtk_label_new(hello);
  gtk_box_pack_start_defaults(GTK_BOX(vbox), label1);

  time_t current_time;
  struct tm *local_time;
  time(&current_time);
  local_time = localtime(&current_time);
  GtkWidget *label2 = gtk_label_new(asctime(local_time));
  gtk_box_pack_start_defaults(GTK_BOX(vbox), label2);
 
  gtk_widget_show_all(window);
  gtk_main();
  osso_exit();
  return 0;
}

How to add a GtkUiManager menubar to a hildon window

Some time ago i found a very cool tip from this blog (http://blogs.igalia.com/svillar): a simple and easy function to convert from a gtkuimanager menubar to a gtkmenu. We need to do this because hildon_window_set_menu requires a GtkMenu. Let see the source:

static GtkWidget *
menubar_to_menu (GtkUIManager *ui_manager) {
GtkWidget *main_menu;
GtkWidget *menubar;
GList *iter;

/* Create new main menu */
main_menu = gtk_menu_new();

/* Get the menubar from the UI manager */
menubar = gtk_ui_manager_get_widget (ui_manager, "/MenuBar");

iter = gtk_container_get_children (GTK_CONTAINER (menubar));
while (iter) {
GtkWidget *menu;

menu = GTK_WIDGET (iter->data);
gtk_widget_reparent(menu, main_menu);

iter = g_list_next (iter);
}
return main_menu;
}

And you can use it this way:

ui = gtk_ui_manager_new ();
....
hildon_window_set_menu(HILDON_WINDOW(window), GTK_MENU(menubar_to_menu (ui)));
相关阅读 更多 +
排行榜 更多 +
试着飞手游下载

试着飞手游下载

休闲益智 下载
血染小镇(功能菜单)中文版下载

血染小镇(功能菜单)中文版下载

飞行射击 下载
泰坦之旅高爆版下载

泰坦之旅高爆版下载

角色扮演 下载