See-through container

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

 



Hi folks,

I previously posted a question about containers; specifically, i want to
have a layout container in which drawing
done to the parent window "shows through" layout where nothing is placed
on the layout.  Here's an example of what's not working for me.
The diagonal line is obscured by the inner_layout Layout container,
although I am setting the back_pixmap for the Layout's window and
bin_window to NULL, which is supposed to do what I want.  Anybody have
any suggestions?

#include <stdio.h>
#include <gtk/gtk.h>
#include <gdk/gdk.h>

static gboolean layout_expose(GtkWidget *widget, GdkEventExpose *event) {
  printf("expose, %d, %d\n", event->area.width, event->area.height);
  GtkLayout *layout = GTK_LAYOUT(widget);
  gdk_draw_line (layout->bin_window,
         widget->style->black_gc,
         0, 0,
         widget->allocation.width, widget->allocation.height);
}

static gboolean inner_layout_realize(GtkWidget *widget, GdkEventExpose
*event) {
  printf("realize\n");
  GtkLayout *layout = GTK_LAYOUT(widget);
  gdk_window_set_back_pixmap(widget->window, NULL, FALSE);
  gdk_window_set_back_pixmap(layout->bin_window, NULL, FALSE);
}

int main( int   argc,
          char *argv[] ) {
  /* GtkWidget is the storage type for widgets */
  GtkWidget *window, *layout, *inner_layout, *label;
  GdkColor color;

  /* Initialise GTK */
  gtk_init (&argc, &argv);
    
  /* Create a new window */
  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  gtk_window_set_title (GTK_WINDOW (window), "Frame Example");

  /* Here we connect the "destroy" event to a signal handler */
  g_signal_connect (G_OBJECT (window), "destroy",
            G_CALLBACK (gtk_main_quit), NULL);

  gtk_widget_set_size_request (window, 500, 500);

  /* Create a layout */
  layout = gtk_layout_new (NULL, NULL);
  gtk_container_add (GTK_CONTAINER (window), layout);
  gtk_widget_set_size_request (layout, 500, 500);
  gtk_widget_show (layout);

  /* Create an inner layout */
  inner_layout = gtk_layout_new (NULL, NULL);
  gtk_layout_put (GTK_LAYOUT (layout), inner_layout, 100, 100);
  gtk_widget_set_size_request (inner_layout, 200, 200);
  gtk_widget_show (inner_layout);

  /* Create a label in inner layout */
  label = gtk_label_new ("Test");
  gtk_container_add (GTK_CONTAINER (inner_layout), label);
  gtk_widget_show (label);

  g_signal_connect (G_OBJECT (layout), "expose_event",
            G_CALLBACK (layout_expose), NULL);
  g_signal_connect (G_OBJECT (inner_layout), "realize",
            G_CALLBACK (inner_layout_realize), NULL);


  /* Create a layout inside the layout */
  /* Display the window */
  gtk_widget_show (window);
    
  /* Enter the event loop */
  gtk_main ();
    
  return 0;
}

_______________________________________________

gtk-list@xxxxxxxxx
http://mail.gnome.org/mailman/listinfo/gtk-list

[Index of Archives]     [Touch Screen Library]     [GIMP Users]     [Gnome]     [KDE]     [Yosemite News]     [Steve's Art]

  Powered by Linux