first--I've been subscribed to the list for 6 hours and surprisingly have not seen a single message come through. Is this normal, or can someone e-mail me direct and tell me messages aren't getting thru.
ok,
I started out working on a project to learn gtk+.
I created a window with a vbox and inside the vbox is a GtkDrawingArea, and a button with label.
In the drawing area's paint routine, first I set the foreground color to green-ish and draw a rectangle to fill the background area. Then I set the foreground color to white and draw a few more rectangles (smaller) on top of that rectangle.
This results, somehow, in the label text (on the button) being WHITE. The box itself is not white (in fact it has black borders I think).
I feel, and am willing to try to do this myself, that there should (if there's not already) be a way for there to be a DEFAULT button label color, possibly changable by a window manager theme or something, that is also changable by somehow setting a property on the button, which perhaps if it's using a label object could somehow pass that property setting down to the label. Then whenever the label would draw, perhaps it could save the foreground color that was previously set, then change to the appropriate color, then after it drew, reverted back to the original foreground color.
I'd appreciate some feedback (not on my code quality below, but on the idea for the change) before I get too involved in it.
p.s. I'm new here .. Sorry if I don't follow protocol properly, I'll learn if you yell at me enough (usually).
To save some headache of trying to figure out what I'm talking about, below I've included the code (and yes, a good portion of it looks remarkably similar to the tutorial code on gtk.org).
To compile:
gcc -Wall
-g main.c -o domino `pkg-config --cflags
gtk+-2.0`\
`pkg-config --libs gtk+-2.0`
---------------------
#include <gtk/gtk.h>
/* This is a callback function. The data arguments
are ignored
* in this example. More on callbacks below. */
static
void hello( GtkWidget
*widget,
gpointer data )
{
g_print
("Goodbye!\n");
}
static gboolean delete_event( GtkWidget
*widget,
GdkEvent
*event,
gpointer data )
{
/* If you return FALSE in
the "delete_event" signal handler,
* GTK will emit
the "destroy" signal. Returning TRUE means
* you
don't want the window to be destroyed.
* This is
useful for popping up 'are you sure you want to
quit?'
* type dialogs. */
g_print ("delete event occurred\n");
/* Change TRUE to FALSE and the
main window will be destroyed with
* a
"delete_event". */
return TRUE;
}
int DrawDomino(int x, int y, int orientation, GdkGC
*gc , GtkWidget *widget)
{
GdkColormap
*Colormap;
Colormap=gdk_gc_get_colormap(gc);
GdkColor
DominoBkColor;
DominoBkColor.red=65535;
DominoBkColor.green=65535;
DominoBkColor.blue=65535;
gdk_colormap_alloc_color(Colormap,&DominoBkColor,FALSE,TRUE);
gdk_gc_set_foreground(gc,&DominoBkColor);
gdk_draw_rectangle(widget->window,gc,TRUE,x,y,45,75);
}
/*
Another callback */
static void destroy( GtkWidget
*widget,
gpointer data )
{
gtk_main_quit
();
}
gboolean drawingExpose(GtkWidget *widget,
GdkEventExpose *event, gpointer data)
{
GdkGC
*gc=widget->style->fg_gc[GTK_WIDGET_STATE(widget)];
GdkColormap
*Colormap;
Colormap=gdk_gc_get_colormap(gc);
GdkColor
TableColor;
TableColor.pixel=1;
TableColor.red=10000;
TableColor.green=25500;
TableColor.blue=10000;
gdk_colormap_alloc_color(Colormap,&TableColor,FALSE,TRUE);
int
GreenPixel=TableColor.pixel;
gdk_gc_set_foreground(gc,&TableColor);
gdk_draw_rectangle(widget->window,gc,TRUE,0,0,800,500);
int
i;
for (i=0;i<7;i++){
DrawDomino(150+i*60, 400,
0, gc,widget );
}
return TRUE;
}
int main(
int argc,
char *argv[] )
{
/* GtkWidget is the storage type for
widgets */
GtkWidget *window;
GtkWidget *button;
GtkDrawingArea
*drawingArea;
GtkWidget *vbox;
/* This is called in all GTK applications. Arguments are
parsed
* from the command line and are returned to
the application. */
gtk_init (&argc,
&argv);
/* create a new window
*/
window = gtk_window_new
(GTK_WINDOW_TOPLEVEL);
/* When the
window is given the "delete_event" signal (this is
given
* by the window manager, usually by the
"close" option, or on the
* titlebar), we ask it to
call the delete_event () function
* as defined
above. The data passed to the callback
* function is
NULL and is ignored in the callback function. */
g_signal_connect (G_OBJECT (window),
"delete_event",
G_CALLBACK
(delete_event), NULL);
/* Here we
connect the "destroy" event to a signal handler.
* This event occurs when we call
gtk_widget_destroy() on the window,
* or if we
return FALSE in the "delete_event" callback. */
g_signal_connect (G_OBJECT (window),
"destroy",
G_CALLBACK (destroy),
NULL);
/* Sets the border width of
the window. */
gtk_container_set_border_width
(GTK_CONTAINER (window), 10);
vbox
= gtk_vbox_new(FALSE,10);
gtk_container_add (GTK_CONTAINER
(window), (GtkWidget *)vbox);
gtk_widget_show ((GtkWidget
*)vbox);
drawingArea=(GtkDrawingArea
*)gtk_drawing_area_new();
gtk_drawing_area_size(drawingArea,800,500);
g_signal_connect(G_OBJECT(drawingArea),"expose_event",G_CALLBACK(drawingExpose),NULL);
gtk_box_pack_start((GtkBox
*)vbox,(GtkWidget*)drawingArea,FALSE,FALSE,10);
//gtk_container_add (GTK_CONTAINER (window), (GtkWidget
*)drawingArea);
gtk_widget_show ((GtkWidget
*)drawingArea);
button = gtk_button_new_with_label
("Click To Exit");
/* When the
button receives the "clicked" signal, it will call
the
* function hello() passing it NULL as its
argument. The hello()
* function is defined
above. */
g_signal_connect (G_OBJECT (button),
"clicked",
G_CALLBACK (hello),
NULL);
/* This will cause the
window to be destroyed by calling
*
gtk_widget_destroy(window) when "clicked". Again, the
destroy
* signal could come from here, or the window
manager. */
g_signal_connect_swapped (G_OBJECT (button),
"clicked",
G_CALLBACK
(gtk_widget_destroy),
G_OBJECT (window));
/* This packs
the button into the window (a gtk container). */
//gtk_container_add (GTK_CONTAINER (window), button);
gtk_box_pack_start((GtkBox
*)vbox,(GtkWidget*)button,FALSE,FALSE,10);
/* The final step is to display this newly created
widget. */
gtk_widget_show (button);
/* and the window */
gtk_widget_show (window);
/* All
GTK applications must have a gtk_main(). Control ends
here
* and waits for an event to occur (like a key
press or
* mouse event). */
gtk_main ();
return
0;
}