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 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162
| /*
First save troumad.glade through Glade3
Save this file as troumad.cpp and compile it using this command
(those are backticks, not single quotes):
gcc -Wall -g -o troumad troumad.cpp `pkg-config --cflags --libs gtk+-3.0`
gcc `pkg-config --cflags gtk+-3.0` -o troumad troumad.cpp `pkg-config --libs gtk+-3.0`
Then execute it using:
./troumad
*/
#include <stdlib.h>
#include <string.h>
#include <gtk/gtk.h>
typedef enum _ColorName {
COLOR_NAME_RED,
COLOR_NAME_GREEN,
COLOR_NAME_BLUE,
COLOR_NAME_LENGTH
} ColorName;
typedef struct _LabelContext {
GtkLabel *label;
ColorName name;
} LabelContext;
static GtkToggleToolButton *active = NULL;
static void cb_change_color (GtkWidget * p_wid, gpointer p_data)
{
GtkToggleToolButton *current = (GtkToggleToolButton *) p_wid;
if (active && active!=current) {
gtk_toggle_tool_button_set_active (active, FALSE);
}
active = current;
if (p_data) {
gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON(p_wid), TRUE);
}
LabelContext *p_ctx = (LabelContext *) g_object_get_data(G_OBJECT(p_wid), "my_data" );
ColorName couleur = p_ctx->name;// check if < COLOR_NAME_LENGTH
GtkLabel *label = p_ctx->label;
const char naming[COLOR_NAME_LENGTH][6] = {"red", "green", "blue"};
GtkStyleContext * css = gtk_widget_get_style_context (GTK_WIDGET(label));
if (gtk_toggle_tool_button_get_active (active)) {
g_print("Enable color : %s\n", naming[couleur]);
gtk_style_context_add_class (css, naming[couleur]);
} else {
g_print("Disable color : %s\n", naming[couleur]);
gtk_style_context_remove_class (css, naming[couleur]);
}
}
static void cb_quit (GtkWidget * p_wid, gpointer p_data)
{
gtk_main_quit ();
}
int main (int argc, char ** argv)
{
GtkBuilder * p_builder = NULL;
GError * p_err = NULL;
/* Initialisation de GTK+ */
gtk_init (& argc, & argv);
/* Creation d'un nouveau GtkBuilder */
p_builder = gtk_builder_new ();
if (p_builder != NULL)
{
/* Chargement du XML dans p_builder */
gtk_builder_add_from_file (p_builder, "troumad.glade", & p_err);
if (p_err == NULL)
{
/* 1.- Recuparation d'un pointeur sur la fenetre. */
GtkWidget * p_win = (GtkWidget *) gtk_builder_get_object (
p_builder, "window"
);
g_signal_connect(p_win, "destroy",
G_CALLBACK(cb_quit/*gtk_main_quit*/), NULL);
/* changement des style */
GtkCssProvider *provider = gtk_css_provider_new ();
GdkDisplay *display = gdk_display_get_default ();
GdkScreen *screen = gdk_display_get_default_screen ( display );
gtk_style_context_add_provider_for_screen ( screen, GTK_STYLE_PROVIDER ( provider ), GTK_STYLE_PROVIDER_PRIORITY_USER );
gtk_css_provider_load_from_data ( GTK_CSS_PROVIDER ( provider ),
".red {\n"
" color: rgb(100%,0%,0%);\n"
"}\n"
".green {\n"
" color: rgb(0%,100%,0%);\n"
"}\n"
".blue {\n"
" color: rgb(0%,0%,100%);\n"
"}\n"
, -1, NULL);
/* 2.- */
GtkLabel *p_label = (GtkLabel*) gtk_builder_get_object(p_builder, "label1");
LabelContext *red_ctx = g_new(LabelContext, 1);
red_ctx->label = p_label;
red_ctx->name = COLOR_NAME_RED;
g_object_set_data(gtk_builder_get_object (p_builder, "button1"), "my_data", red_ctx);
LabelContext *green_ctx = g_new(LabelContext, 1);
green_ctx->label = p_label;
green_ctx->name = COLOR_NAME_GREEN;
g_object_set_data(gtk_builder_get_object (p_builder, "button2"), "my_data", green_ctx);
LabelContext *blue_ctx = g_new(LabelContext, 1);
blue_ctx->label = p_label;
blue_ctx->name = COLOR_NAME_BLUE;
g_object_set_data(gtk_builder_get_object (p_builder, "button3"), "my_data", blue_ctx);
cb_change_color((GtkWidget*) gtk_builder_get_object (p_builder, "button3"), (gpointer) 1);
/* Signal du bouton Rouge */
g_signal_connect (
gtk_builder_get_object (p_builder, "button1"),
"clicked", G_CALLBACK (cb_change_color), NULL
);
/* Signal du bouton Vert */
g_signal_connect (
gtk_builder_get_object (p_builder, "button2"),
"clicked", G_CALLBACK (cb_change_color), NULL
);
/* Signal du bouton Bleu */
g_signal_connect (
gtk_builder_get_object (p_builder, "button3"),
"clicked", G_CALLBACK (cb_change_color), NULL
);
GtkToolbar *p_toolbar = (GtkToolbar*) gtk_builder_get_object(p_builder, "toolbar1");
GtkStyleContext *ctx = gtk_widget_get_style_context (GTK_WIDGET(p_toolbar));
gtk_style_context_add_class (ctx, GTK_STYLE_CLASS_INLINE_TOOLBAR);
gtk_widget_show_all (p_win);
gtk_main ();
}
else
{
/* Affichage du message d'erreur de GTK+ */
g_error ("%s", p_err->message);
g_error_free (p_err);
}
}
return EXIT_SUCCESS;
} |
Partager