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 126 127 128 129 130 131 132 133 134
|
#include "gtk/gtk.h"
#include <stdlib.h>
GList *list = NULL;
gint g_page_num_last = 0;
typedef struct _pages
{
gint page_num;
GtkWidget *icon;
GtkWidget *label;
GtkWidget *onglet_box;
GtkWidget *box;
GtkWidget *button;
} t_pages;
void
on_notebook_switch_page (GtkNotebook *notebook,
GtkNotebookPage *page,
guint page_num,
gpointer user_data)
{
// g_print ( "on_notebook_switch_page from old %u to new %u\n", g_page_num_last, page_num );
GtkWidget *nb_page = gtk_notebook_get_nth_page ( notebook, g_page_num_last );
t_pages *nouvelle = (t_pages *)g_object_get_data ( G_OBJECT ( nb_page ), "objects" );
gtk_widget_set_sensitive ( nouvelle->button, false );
g_page_num_last = page_num;
nb_page = gtk_notebook_get_nth_page ( notebook, page_num );
nouvelle = (t_pages *)g_object_get_data ( G_OBJECT ( nb_page ), "objects" );
gtk_widget_set_sensitive ( nouvelle->button, true );
}
void DeleteOnglet (GtkWidget *widget, gpointer data)
{
gtk_notebook_remove_page ( GTK_NOTEBOOK (data), g_page_num_last );
}
void
on_notebook_page_removed (GtkNotebook *notebook,
GtkWidget *widget,
guint page_num,
gpointer user_data)
{
t_pages *nouvelle = (t_pages *)g_object_get_data ( G_OBJECT ( widget ), "objects" );
free ( nouvelle );
// g_print ( "on_notebook_page_removed %u\n", page_num );
}
int main (int argc, char **argv)
{
gint i = 0;
gchar *string = NULL;
GtkWidget *win = NULL;
GtkWidget *notebook = NULL;
/* Initialize GTK+ */
gtk_init (&argc, &argv);
/* Create the main window */
win = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_default_size(GTK_WINDOW(win), 320, 200);
gtk_window_set_position (GTK_WINDOW (win), GTK_WIN_POS_CENTER);
g_signal_connect (win, "destroy", gtk_main_quit, NULL );
notebook = gtk_notebook_new ();
gtk_container_add(GTK_CONTAINER(win), notebook);
/* Create 6 pages with close button */
for(i = 0; i < 6; i++)
{
t_pages *nouvelle = (t_pages *)malloc( sizeof(t_pages) );
fprintf ( stderr, "adresse p>>%p\n", nouvelle );
nouvelle->page_num = i;
string = g_strdup_printf("page %d", i);
nouvelle->label = gtk_label_new(string);
nouvelle->box = gtk_vbox_new(FALSE, 0);
nouvelle->onglet_box = gtk_hbox_new(FALSE, 0);
gtk_box_pack_start (GTK_BOX(nouvelle->onglet_box), nouvelle->label, TRUE, TRUE, 0);
nouvelle->button = gtk_button_new ();
nouvelle->icon = gtk_image_new_from_stock(GTK_STOCK_CLOSE, GTK_ICON_SIZE_MENU);
gtk_button_set_image (GTK_BUTTON(nouvelle->button), nouvelle->icon);
gtk_button_set_relief (GTK_BUTTON(nouvelle->button), GTK_RELIEF_NONE);
/* Associate button with the "num page" */
g_object_set_data ( G_OBJECT(nouvelle->box), "objects", nouvelle );
gtk_box_pack_start (GTK_BOX(nouvelle->onglet_box), nouvelle->button, TRUE, TRUE, 0);
/* Add the structure _pages in Glist */
list = g_list_append (list, &nouvelle);
gtk_notebook_append_page(GTK_NOTEBOOK(notebook), nouvelle->box, nouvelle->onglet_box);
g_signal_connect (G_OBJECT(nouvelle->button), "clicked", G_CALLBACK(DeleteOnglet), notebook);
gtk_widget_show_all ( nouvelle->onglet_box );
gtk_widget_set_sensitive ( nouvelle->button, false );
}
g_signal_connect ((gpointer) notebook, "switch_page",
G_CALLBACK (on_notebook_switch_page), NULL );
g_signal_connect ((gpointer) notebook, "page_removed",
G_CALLBACK (on_notebook_page_removed), NULL );
gtk_widget_show_all (win);
gtk_main ();
return EXIT_SUCCESS;
} |
Partager