A bug or a screw up?



I just did a good-size upgrade I'd been putting off for too long that took me from GTK 3.2 to GTK 3.10.8, and some stuff that used to work doesn't any more:

Basically, I have a window that contains

    a vbox that contans

        a label
        another label
        a drawing area
        a third label

The problem is that the top of drawing area is lined up with the top of the enclosing vbox, or maybe at the top of the window, rather than at the bottom of the second label.

Is there something new I'm missing?  It didn't used to work that way.

Thanks,
Chris Moller

Fedora release 20 (Heisenbug) (Linux qcore.mollernet.net 3.13.10-200.fc20.x86_64 #1 SMP)
GTK+ Version: 3.10.8


A screenshot:  http://mollerware.com/example.png


The code showing it:

---------------------------------------------------------------------

#include <gtk/gtk.h>

#define DA_WIDTH  320
#define DA_HEIGHT 240

gboolean
da_draw_cb (GtkWidget *widget, cairo_t *cr, gpointer data)
{
  cairo_identity_matrix (cr);

  /***
Fill the entire da with a black a rectangle, then overlay the black rectangle
      with a smaller red one.

Notice that that top edge of the da, the top bit of the black rectangle,
      is cut off.
  ***/

  GdkRGBA black  = {0.0, 0.0, 0.0, 1.0};
  gdk_cairo_set_source_rgba (cr, &black);
  cairo_rectangle (cr, 0.0, 0.0, DA_WIDTH, DA_HEIGHT);
  cairo_fill (cr);

  GdkRGBA red  = {1.0, 0.0, 0.0, 1.0};
  gdk_cairo_set_source_rgba (cr, &red);
  cairo_rectangle (cr, 10.0, 10.0, DA_WIDTH - 20.0, DA_HEIGHT - 20.0);
  cairo_fill (cr);

  /***
Stroke a green line from the top left corner of the da, [0, 0], to a central
      point [100, 100].

      Notice that the top left extent of the line is cut off.

Following what's visible of the line, it appears that the top left corner of the da corresponds to the top left corner either of the enclosing vbox or the enclosing window rather than to where you'd expect it under label 2. Also note that label 3 is placed properly ender where the bottom edge of the
      da ought to be.
  ***/

  GdkRGBA green  = {0.0, 1.0, 0.0, 1.0};
  gdk_cairo_set_source_rgba (cr, &green);
  cairo_move_to (cr,  0.0,  0.0);
  cairo_line_to (cr, 100.0,  100.0);
  cairo_stroke (cr);

  return TRUE;
}

int
main (int   argc,
      char *argv[])
{
  GtkWidget *window;
  GtkWidget *vbox;
  GtkWidget *label;
  GtkWidget *da;

  gtk_init (&argc, &argv);

  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  g_signal_connect (window, "destroy",
                    G_CALLBACK (gtk_main_quit), NULL);

  vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 8);
  gtk_container_add (GTK_CONTAINER (window), vbox);

  label = gtk_label_new ("label 1");
  gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 2);

  label = gtk_label_new ("label 2");
  gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 2);

  da = gtk_drawing_area_new ();
  gtk_widget_set_size_request (da, DA_WIDTH, DA_HEIGHT);
  gtk_box_pack_start (GTK_BOX (vbox), da, TRUE, TRUE, 2);
  g_signal_connect (da,"draw", G_CALLBACK (da_draw_cb), NULL);

  label = gtk_label_new ("label 3");
  gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 2);

  gtk_widget_show_all (window);

  gtk_main ();

  return 0;

}



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