1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
|
/*
* test.c
*
* Copyright 2008 PCMan <pcman.tw@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*/
#include <gtk/gtk.h>
#include "menu-cache.h"
static void on_menu_item( GtkMenuItem* mi, MenuCacheItem* item )
{
g_debug( "Exec = %s", menu_cache_app_get_exec(MENU_CACHE_APP(item)) );
g_debug( "Terminal = %d", menu_cache_app_get_use_terminal(MENU_CACHE_APP(item)) );
}
static GtkWidget* create_item( MenuCacheItem* item )
{
GtkWidget* mi;
if( menu_cache_item_get_type(item) == MENU_CACHE_TYPE_SEP )
mi = gtk_separator_menu_item_new();
else
{
GtkWidget* img;
mi = gtk_image_menu_item_new_with_label( menu_cache_item_get_name(item) );
gtk_widget_set_tooltip_text( mi, menu_cache_item_get_comment(item) );
/*
if( g_file_test( menu_cache_item_get_icon(item), G_FILE_TEST_IS_REGULAR ) )
{
img = gtk_image_new_from_file(menu_cache_item_get_icon(item));
}
else
*/
img = gtk_image_new_from_icon_name(menu_cache_item_get_icon(item), GTK_ICON_SIZE_MENU );
gtk_image_menu_item_set_image( mi, img );
if( menu_cache_item_get_type(item) == MENU_CACHE_TYPE_APP )
{
g_object_set_data_full( mi, "mcitem", menu_cache_item_ref(item), menu_cache_item_unref );
g_signal_connect( mi, "activate", on_menu_item, item );
}
}
gtk_widget_show( mi );
return mi;
}
static GtkWidget* create_menu(MenuCacheDir* dir, GtkWidget* parent)
{
GSList* l;
GtkWidget* menu = gtk_menu_new();
GtkWidget* mi;
if( parent )
{
mi = create_item( dir );
gtk_menu_item_set_submenu( mi, menu );
gtk_menu_append( parent, mi );
gtk_widget_show( mi );
// printf( "comment:%s\n", menu_cache_item_get_comment(dir) );
}
for( l = menu_cache_dir_get_children(dir); l; l = l->next )
{
MenuCacheItem* item = MENU_CACHE_ITEM(l->data);
if( menu_cache_item_get_type(item) == MENU_CACHE_TYPE_DIR )
create_menu( item, menu );
else
{
mi = create_item(item);
gtk_widget_show( mi );
// printf( "comment:%s\n", menu_cache_item_get_comment(item) );
// printf( "icon:%s\n", menu_cache_item_get_icon(item) );
// printf( "exec:%s\n", menu_cache_app_get_exec(item) );
gtk_menu_append( menu, mi );
}
}
return menu;
}
static void on_clicked( GtkButton* btn, GtkWidget* pop )
{
gtk_menu_popup( pop, NULL, NULL, NULL, NULL, 0, GDK_CURRENT_TIME );
}
int main(int argc, char** argv)
{
GtkWidget* win, *btn;
gtk_init( &argc, &argv );
MenuCache* menu_cache = menu_cache_new( argv[1] ? argv[1] : "/etc/xdg/menus/applications.menu", NULL, NULL );
MenuCacheDir* menu = menu_cache_get_root_dir( menu_cache );
GtkWidget* pop = create_menu( menu, NULL );
// g_debug( "update: %d", menu_cache_is_updated( menu_cache ) );
g_debug( "update: %d", menu_cache_file_is_updated( argv[1] ) );
win = gtk_window_new( GTK_WINDOW_TOPLEVEL );
gtk_window_set_title( win, "MenuCache Test" );
btn = gtk_button_new_with_label( menu_cache_item_get_name(menu) );
gtk_widget_set_tooltip_text( btn, menu_cache_item_get_comment(menu) );
gtk_container_add( win, btn );
g_signal_connect( btn, "clicked", G_CALLBACK(on_clicked), pop );
g_signal_connect( win, "delete-event", G_CALLBACK(gtk_main_quit), NULL );
gtk_widget_show_all( win );
menu_cache_unref( menu );
gtk_main();
return 0;
}
|