14 void (*callback)(struct menu *menu, void *data1, void *data2);
15 struct menu *callback_menu;
18 struct menu_priv *child;
19 struct menu_priv *sibling;
24 /* Create callbacks that implement our Actions */
27 zoom_in_action(GtkWidget *w, struct navit *nav, void *dummy)
29 navit_zoom_in(nav, 2);
33 zoom_out_action(GtkWidget *w, struct navit *nav, void *dummy)
35 navit_zoom_out(nav, 2);
39 refresh_action(GtkWidget *w, struct navit *nav, void *dummy)
45 cursor_action(GtkWidget *w, struct navit *nav, void *dummy)
47 navit_toggle_cursor(nav);
49 ac->gui->co->flags->track=gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(w));
54 orient_north_action(GtkWidget *w, struct navit *nav, void *dummy)
57 ac->gui->co->flags->orient_north=gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(w));
63 #include "transform.h"
66 info_action(GtkWidget *w, struct navit *nav, void *dummy)
72 struct transformation *t;
74 t=navit_get_trans(nav);
75 transform_get_size(t, &mw, &mh);
78 transform_reverse(t, &p, <);
81 transform_reverse(t, &p, &rb);
83 sprintf(buffer,"./info.sh %d,%d 0x%x,0x%x 0x%x,0x%x", mw, mh, lt.x, lt.y, rb.x, rb.y);
91 destination_action(GtkWidget *w, struct navit *nav, void *dummy)
93 destination_address(nav);
98 quit_action (GtkWidget *w, struct navit *nav, void *dummy)
104 visible_blocks_action(GtkWidget *w, struct container *co)
107 co->data_window[data_window_type_block]=data_window("Visible Blocks",co->win,NULL);
113 visible_towns_action(GtkWidget *w, struct container *co)
116 co->data_window[data_window_type_town]=data_window("Visible Towns",co->win,NULL);
122 visible_polys_action(GtkWidget *w, struct container *co)
125 co->data_window[data_window_type_street]=data_window("Visible Polys",co->win,NULL);
131 visible_streets_action(GtkWidget *w, struct container *co)
134 co->data_window[data_window_type_street]=data_window("Visible Streets",co->win,NULL);
140 visible_points_action(GtkWidget *w, struct container *co)
143 co->data_window[data_window_type_point]=data_window("Visible Points",co->win,NULL);
149 static GtkActionEntry entries[] =
151 { "DisplayMenuAction", NULL, "Display" },
152 { "RouteMenuAction", NULL, "Route" },
153 { "Map", NULL, "Map" },
154 { "LayoutMenuAction", NULL, "Layout" },
155 { "ZoomOutAction", GTK_STOCK_ZOOM_OUT, "ZoomOut", NULL, NULL, G_CALLBACK(zoom_out_action) },
156 { "ZoomInAction", GTK_STOCK_ZOOM_IN, "ZoomIn", NULL, NULL, G_CALLBACK(zoom_in_action) },
157 { "RefreshAction", GTK_STOCK_REFRESH, "Refresh", NULL, NULL, G_CALLBACK(refresh_action) },
158 { "InfoAction", GTK_STOCK_INFO, "Info", NULL, NULL, G_CALLBACK(info_action) },
159 { "DestinationAction", "flag_icon", "Destination", NULL, NULL, G_CALLBACK(destination_action) },
160 { "Test", NULL, "Test", NULL, NULL, G_CALLBACK(destination_action) },
161 { "QuitAction", GTK_STOCK_QUIT, "_Quit", "<control>Q",NULL, G_CALLBACK (quit_action) }
164 static guint n_entries = G_N_ELEMENTS (entries);
166 static GtkToggleActionEntry toggleentries[] =
168 { "CursorAction", "cursor_icon","Cursor", NULL, NULL, G_CALLBACK(cursor_action),TRUE },
169 { "OrientationAction", "orientation_icon", "Orientation", NULL, NULL, G_CALLBACK(orient_north_action),FALSE }
172 static guint n_toggleentries = G_N_ELEMENTS (toggleentries);
174 static GtkActionEntry debug_entries[] =
176 { "DataMenuAction", NULL, "Data" },
177 { "VisibleBlocksAction", NULL, "VisibleBlocks", NULL, NULL, G_CALLBACK(visible_blocks_action) },
178 { "VisibleTownsAction", NULL, "VisibleTowns", NULL, NULL, G_CALLBACK(visible_towns_action) },
179 { "VisiblePolysAction", NULL, "VisiblePolys", NULL, NULL, G_CALLBACK(visible_polys_action) },
180 { "VisibleStreetsAction", NULL, "VisibleStreets", NULL, NULL, G_CALLBACK(visible_streets_action) },
181 { "VisiblePointsAction", NULL, "VisiblePoints", NULL, NULL, G_CALLBACK(visible_points_action) }
184 static guint n_debug_entries = G_N_ELEMENTS (debug_entries);
187 static const char * cursor_xpm[] = {
215 static const char * north_xpm[] = {
243 static const char * flag_xpm[] = {
274 const char **icon_xpm;
276 {"cursor_icon", cursor_xpm },
277 {"orientation_icon", north_xpm },
278 {"flag_icon", flag_xpm }
282 static gint n_stock_icons = G_N_ELEMENTS (stock_icons);
286 register_my_stock_icons (void)
288 GtkIconFactory *icon_factory;
289 GtkIconSet *icon_set;
293 icon_factory = gtk_icon_factory_new ();
295 for (i = 0; i < n_stock_icons; i++)
297 pixbuf = gdk_pixbuf_new_from_xpm_data(stock_icons[i].icon_xpm);
298 icon_set = gtk_icon_set_new_from_pixbuf (pixbuf);
299 g_object_unref(pixbuf);
300 gtk_icon_factory_add (icon_factory, stock_icons[i].stockid, icon_set);
301 gtk_icon_set_unref (icon_set);
304 gtk_icon_factory_add_default(icon_factory);
306 g_object_unref(icon_factory);
310 static char layout[] =
312 <menubar name=\"MenuBar\">\
313 <menu name=\"Display\" action=\"DisplayMenuAction\">\
314 <menuitem name=\"Zoom in\" action=\"ZoomInAction\" />\
315 <menuitem name=\"Zoom out\" action=\"ZoomOutAction\" />\
316 <menuitem name=\"Cursor\" action=\"CursorAction\"/>\
317 <menuitem name=\"Orientation\" action=\"OrientationAction\"/>\
318 <menuitem name=\"Quit\" action=\"QuitAction\" />\
319 <placeholder name=\"RouteMenuAdditions\" />\
321 <menu name=\"Data\" action=\"DataMenuAction\">\
322 <menuitem name=\"Visible Blocks\" action=\"VisibleBlocksAction\" />\
323 <menuitem name=\"Visible Towns\" action=\"VisibleTownsAction\" />\
324 <menuitem name=\"Visible Polys\" action=\"VisiblePolysAction\" />\
325 <menuitem name=\"Visible Streets\" action=\"VisibleStreetsAction\" />\
326 <menuitem name=\"Visible Points\" action=\"VisiblePointsAction\" />\
327 <placeholder name=\"DataMenuAdditions\" />\
329 <menu name=\"Route\" action=\"RouteMenuAction\">\
330 <menuitem name=\"Refresh\" action=\"RefreshAction\" />\
331 <menuitem name=\"Destination\" action=\"DestinationAction\" />\
332 <placeholder name=\"RouteMenuAdditions\" />\
335 <toolbar name=\"ToolBar\" action=\"BaseToolbar\" action=\"BaseToolbarAction\">\
336 <placeholder name=\"ToolItems\">\
338 <toolitem name=\"Zoom in\" action=\"ZoomInAction\"/>\
339 <toolitem name=\"Zoom out\" action=\"ZoomOutAction\"/>\
340 <toolitem name=\"Refresh\" action=\"RefreshAction\"/>\
341 <toolitem name=\"Cursor\" action=\"CursorAction\"/>\
342 <toolitem name=\"Orientation\" action=\"OrientationAction\"/>\
343 <toolitem name=\"Destination\" action=\"DestinationAction\"/>\
344 <toolitem name=\"Info\" action=\"InfoAction\"/>\
345 <toolitem name=\"Quit\" action=\"QuitAction\"/>\
349 <popup name=\"PopUp\">\
355 activate(void *dummy, struct menu_priv *menu)
358 (*menu->callback)(menu->callback_menu, menu->callback_data1, menu->callback_data2);
361 static struct menu_methods menu_methods;
363 static struct menu_priv *
364 add_menu(struct menu_priv *menu, struct menu_methods *meth, char *name, enum menu_type type, void (*callback)(struct menu *data_menu, void *data1, void *data2), struct menu *data_menu, void *data1, void *data2)
366 struct menu_priv *ret;
369 ret=g_new0(struct menu_priv, 1);
371 if (! strcmp(menu->path, "/ui/MenuBar") && !strcmp(name,"Route")) {
372 dynname=g_strdup("Route");
374 dynname=g_strdup_printf("%d", menu->gui->dyn_counter++);
375 if (type == menu_type_toggle)
376 ret->action=GTK_ACTION(gtk_toggle_action_new(dynname, name, NULL, NULL));
378 ret->action=gtk_action_new(dynname, name, NULL, NULL);
380 ret->handler_id=g_signal_connect(ret->action, "activate", G_CALLBACK(activate), ret);
381 gtk_action_group_add_action(menu->gui->dyn_group, ret->action);
382 ret->merge_id=gtk_ui_manager_new_merge_id(menu->gui->menu_manager);
383 gtk_ui_manager_add_ui( menu->gui->menu_manager, ret->merge_id, menu->path, dynname, dynname, type == menu_type_submenu ? GTK_UI_MANAGER_MENU : GTK_UI_MANAGER_MENUITEM, FALSE);
386 ret->path=g_strdup_printf("%s/%s", menu->path, dynname);
388 ret->callback=callback;
389 ret->callback_menu=data_menu;
390 ret->callback_data1=data1;
391 ret->callback_data2=data2;
392 ret->sibling=menu->child;
400 remove_menu(struct menu_priv *item, int recursive)
404 struct menu_priv *next,*child=item->child;
407 remove_menu(child, recursive);
412 gtk_ui_manager_remove_ui(item->gui->menu_manager, item->merge_id);
413 gtk_action_group_remove_action(item->gui->dyn_group, item->action);
416 g_signal_handler_disconnect(item->action, item->handler_id);
418 g_object_unref(item->action);
425 set_toggle(struct menu_priv *menu, int active)
427 gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(menu->action), active);
431 get_toggle(struct menu_priv *menu)
433 return gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(menu->action));
436 static struct menu_methods menu_methods = {
444 popup_deactivate(GtkWidget *widget, struct menu_priv *menu)
446 g_signal_handler_disconnect(widget, menu->handler_id);
447 remove_menu(menu, 1);
450 static struct menu_priv *
451 gui_gtk_ui_new (struct gui_priv *this, struct menu_methods *meth, char *path, int popup, GtkWidget **widget_ret)
453 struct menu_priv *ret;
458 ret=g_new0(struct menu_priv, 1);
459 ret->path=g_strdup(path);
461 if (! this->menu_manager) {
462 this->base_group = gtk_action_group_new ("BaseActions");
463 this->debug_group = gtk_action_group_new ("DebugActions");
464 this->dyn_group = gtk_action_group_new ("DynamicActions");
465 register_my_stock_icons();
466 this->menu_manager = gtk_ui_manager_new ();
467 gtk_action_group_add_actions (this->base_group, entries, n_entries, this->nav);
468 gtk_action_group_add_toggle_actions (this->base_group, toggleentries, n_toggleentries, this->nav);
469 gtk_ui_manager_insert_action_group (this->menu_manager, this->base_group, 0);
470 gtk_action_group_add_actions (this->debug_group, debug_entries, n_debug_entries, this->nav);
471 gtk_ui_manager_insert_action_group (this->menu_manager, this->debug_group, 0);
472 gtk_ui_manager_add_ui_from_string (this->menu_manager, layout, strlen(layout), &error);
473 gtk_ui_manager_insert_action_group (this->menu_manager, this->dyn_group, 0);
476 g_message ("building menus failed: %s", error->message);
477 g_error_free (error);
480 widget=gtk_ui_manager_get_widget(this->menu_manager, path);
481 GTK_WIDGET_UNSET_FLAGS (widget, GTK_CAN_FOCUS);
485 gtk_box_pack_start (GTK_BOX(this->vbox), widget, FALSE, FALSE, 0);
486 gtk_widget_show (widget);
488 gtk_menu_popup(GTK_MENU(widget), NULL, NULL, NULL, NULL, 0, gtk_get_current_event_time ());
489 ret->handler_id=g_signal_connect(widget, "deactivate", G_CALLBACK(popup_deactivate), ret);
495 gui_gtk_toolbar_new(struct gui_priv *this, struct menu_methods *meth)
497 return gui_gtk_ui_new(this, meth, "/ui/ToolBar", 0, NULL);
501 gui_gtk_menubar_new(struct gui_priv *this, struct menu_methods *meth)
503 return gui_gtk_ui_new(this, meth, "/ui/MenuBar", 0, &this->menubar);
507 gui_gtk_popup_new(struct gui_priv *this, struct menu_methods *meth)
509 return gui_gtk_ui_new(this, meth, "/ui/PopUp", 1, NULL);