Button Labels & Test Post



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;
}

 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]