I am still working to get the warnings on , I get core dumped after clicking a recent item , but here is may code based on zetcode tutorial till now:
// submenu of recent files.
// http://zetcode.com/gui/gtk2/menusandtoolbars/
// GTK 2
#include <gtk/gtk.h>
#include <glib.h>
#include <stdbool.h>
#include <assert.h>
#define RECENTS_COUNT 5
GtkWidget *recents_ptr[RECENTS_COUNT+1];
gchar recent_title[40];
typedef struct data
{
gchar* str;
GtkWidget* window;
}data;
void choice_clicked(GtkWidget * ,gpointer );
void produce_recent_items(void) ;
void show_message(data*);
void show_message_caller(GtkWidget*choice,gpointer);
int main(int argc, char *argv[])
{
GtkWidget *window;
GtkWidget *vbox;
GtkWidget *menubar;
GtkWidget *fileMenu;
GtkWidget *imprMenu;
GtkWidget *sep;
GtkWidget *fileMi;
GtkWidget *imprMi;
GtkWidget *feedMi;
GtkWidget *bookMi;
GtkWidget *quitMi;
GtkWidget *rec_labels[RECENTS_COUNT+1];
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
gtk_window_set_default_size(GTK_WINDOW(window), 300, 200);
gtk_window_set_title(GTK_WINDOW(window), "Submenu");
produce_recent_items();
assert(recents_ptr[0]!=NULL);
vbox = gtk_vbox_new(FALSE, 0);
gtk_container_add(GTK_CONTAINER(window), vbox);
menubar = gtk_menu_bar_new();
fileMenu = gtk_menu_new();
fileMi = gtk_menu_item_new_with_label("File");
imprMenu = gtk_menu_new();
imprMi = gtk_menu_item_new_with_label("Import");
feedMi = gtk_menu_item_new_with_label("Import news feed...");
bookMi = gtk_menu_item_new_with_label("Import bookmarks...");
for(int i=0; i<RECENTS_COUNT; i++)
{
gchar *uri_l=gtk_recent_info_get_uri(recents_ptr[i]);
rec_labels[i]=gtk_menu_item_new_with_label(uri_l);
}
gtk_menu_item_set_submenu(GTK_MENU_ITEM(imprMi), imprMenu);
gtk_menu_shell_append(GTK_MENU_SHELL(imprMenu), feedMi);
gtk_menu_shell_append(GTK_MENU_SHELL(imprMenu), bookMi);
sep = gtk_separator_menu_item_new();
quitMi = gtk_menu_item_new_with_label("Quit");
gtk_menu_item_set_submenu(GTK_MENU_ITEM(fileMi), fileMenu);
for(int i=0; i<RECENTS_COUNT; i++)
gtk_menu_shell_append(GTK_MENU_SHELL(imprMenu), recents_ptr[i]);
gtk_menu_shell_append(GTK_MENU_SHELL(fileMenu), imprMi);
gtk_menu_shell_append(GTK_MENU_SHELL(fileMenu), sep);
gtk_menu_shell_append(GTK_MENU_SHELL(fileMenu), quitMi);
gtk_menu_shell_append(GTK_MENU_SHELL(menubar), fileMi);
gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, FALSE, 0);
g_signal_connect(G_OBJECT(window), "destroy",
G_CALLBACK(gtk_main_quit), NULL);
g_signal_connect(G_OBJECT(quitMi), "activate",
G_CALLBACK(gtk_main_quit), NULL);
g_signal_connect(G_OBJECT(feedMi),"activate"
,G_CALLBACK(choice_clicked),"Test str.");
gint i;
data* dip=g_new(data,RECENTS_COUNT+1);
for( i=0; i<RECENTS_COUNT; i++)
{
gchar stri[20];
gchar *str_ptr;
str_ptr=g_strdup_printf ("si is %d\n",i);
g_signal_connect_data(G_OBJECT(recents_ptr[i]), "activate",
G_CALLBACK(choice_clicked), str_ptr, (GClosureNotify)g_free, 0);
(dip+i)->str=str_ptr;
(dip+i)->window=window;
g_signal_connect_data(G_OBJECT(recents_ptr[i]),"activate"
,G_CALLBACK(show_message_caller),(dip+i),(GClosureNotify)g_free, 0);
}
gtk_widget_show_all(window);
gtk_main();
return 0;
}
void choice_clicked(GtkWidget *widget, gpointer str)
{
g_print("%s\n",str);
return;
}
void produce_recent_items(void)
{ // TODO "file://" may be removed
GtkRecentInfo *ri;
GList *rf_list;
const gchar *rf_str;
GtkWidget *rf_widget;
GtkRecentManager *manager=gtk_recent_manager_get_default();
assert(manager!=NULL);
GtkWidget *chooser=gtk_recent_chooser_menu_new_for_manager(manager);
assert(chooser!=NULL);
gtk_recent_chooser_set_limit (chooser,RECENTS_COUNT);
rf_list=gtk_recent_chooser_get_items (chooser);
assert(rf_list!=NULL);
int i;
for(i=0; i<RECENTS_COUNT; )
{
recents_ptr[i]=NULL;
if(rf_list==NULL)
break;
ri=rf_list->data;
bool this_app ;
gchar * name = gtk_recent_info_last_application(ri);
if(1)//(strstr(name,"xboard")) // true
this_app=true;
else
this_app=false;
if(this_app)
{
rf_str=gtk_recent_info_get_uri(ri);
rf_widget=gtk_menu_item_new_with_label(rf_str); // TODO warning here
recents_ptr[i]=rf_widget;
i++;
}
rf_list=rf_list->next;
}
printf("i is %d\n",i);
return;
}
void show_message ( data* mes_par) //
{
GtkWidget* dialog;
gchar * message=G_OBJECT(mes_par->str);
GtkWidget* parent=GTK_WINDOW(mes_par->window);
dialog = gtk_message_dialog_new (GTK_WINDOW(parent),
GTK_DIALOG_DESTROY_WITH_PARENT,
GTK_MESSAGE_INFO,
GTK_BUTTONS_CLOSE,
"Message: %s",
message);
// Destroy the dialog when the user responds to it (e.g. clicks a button)
g_signal_connect_swapped (dialog, "response",
G_CALLBACK (gtk_widget_destroy),
dialog);
gtk_widget_show_all (dialog);
return;
}
void show_message_caller(GtkWidget*choice,gpointer mes_par)
{
data *udp=mes_par;
show_message(udp);
return;
}