Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdbool.h>
- #include <gtk/gtk.h>
- static void close_window (void);
- static cairo_surface_t *surface1 = NULL;
- static cairo_surface_t *surface2 = NULL;
- static gboolean darea1_draw_cb (GtkWidget *widget,
- cairo_t *cr,
- gpointer data);
- static gboolean darea2_draw_cb (GtkWidget *widget,
- cairo_t *cr,
- gpointer data);
- static gboolean darea1_configure_event_cb (GtkWidget *widget,
- GdkEventConfigure *event,
- gpointer data);
- static gboolean darea2_configure_event_cb (GtkWidget *widget,
- GdkEventConfigure *event,
- gpointer data);
- int
- main (int argc, char *argv[])
- {
- GtkWidget *window;
- GtkWidget *viewport;
- GtkWidget *scrolled;
- GtkWidget *overlay;
- GtkWidget *darea;
- /// GtkSettings *settings;
- gtk_init (&argc, &argv);
- /* setup window */
- window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
- gtk_window_set_default_size (GTK_WINDOW (window), 800, 600);
- gtk_window_set_title (GTK_WINDOW (window), "Overlay");
- gtk_container_set_border_width (GTK_CONTAINER (window), 0);
- g_signal_connect (window, "delete-event", G_CALLBACK (gtk_main_quit), NULL);
- g_signal_connect (window, "destroy", G_CALLBACK (close_window), &window);
- /// settings = gtk_settings_get_default ();
- /// g_object_set (G_OBJECT (settings), "gtk-application-prefer-dark-theme", true, NULL);
- /* setup alignment */
- viewport = gtk_viewport_new (NULL, NULL);
- /* setup scrolled window */
- scrolled = gtk_scrolled_window_new (NULL, NULL);
- gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled),
- GTK_POLICY_AUTOMATIC,
- GTK_POLICY_AUTOMATIC);
- gtk_container_add (GTK_CONTAINER (viewport), scrolled);
- /* setup the overlay */
- overlay = gtk_overlay_new ();
- gtk_container_add (GTK_CONTAINER (overlay), viewport);
- gtk_container_add (GTK_CONTAINER (window), overlay);
- /* finally setup the widgets to place inside of the overlay */
- darea = gtk_drawing_area_new ();
- gtk_widget_set_size_request (darea, 200, 200);
- gtk_widget_set_app_paintable (darea, true);
- gtk_overlay_add_overlay (GTK_OVERLAY (overlay), darea);
- gtk_widget_set_halign (darea, GTK_ALIGN_START);
- gtk_widget_set_valign (darea, GTK_ALIGN_START);
- gtk_widget_set_margin_left (darea, 10);
- gtk_widget_set_margin_right (darea, 10);
- gtk_widget_set_margin_top (darea, 10);
- gtk_widget_set_margin_bottom (darea, 10);
- g_signal_connect (darea, "draw", G_CALLBACK (darea1_draw_cb), NULL);
- g_signal_connect (darea, "configure-event", G_CALLBACK (darea1_configure_event_cb), NULL);
- darea = gtk_drawing_area_new ();
- gtk_widget_set_size_request (darea, 300, 300);
- gtk_widget_set_app_paintable (darea, true);
- gtk_overlay_add_overlay (GTK_OVERLAY (overlay), darea);
- gtk_widget_set_halign (darea, GTK_ALIGN_END);
- gtk_widget_set_valign (darea, GTK_ALIGN_END);
- gtk_widget_set_margin_left (darea, 20);
- gtk_widget_set_margin_right (darea, 20);
- gtk_widget_set_margin_top (darea, 20);
- gtk_widget_set_margin_bottom (darea, 20);
- g_signal_connect (darea, "draw", G_CALLBACK (darea2_draw_cb), NULL);
- g_signal_connect (darea, "configure-event", G_CALLBACK (darea2_configure_event_cb), NULL);
- gtk_widget_show_all (window);
- gtk_main ();
- return 0;
- }
- static void
- close_window (void)
- {
- if (surface1)
- cairo_surface_destroy (surface1);
- surface1 = NULL;
- if (surface2)
- cairo_surface_destroy (surface2);
- surface2 = NULL;
- }
- static gboolean
- darea1_draw_cb (GtkWidget *widget,
- cairo_t *cr,
- gpointer data)
- {
- g_debug ("Draw: drawing area 1");
- cairo_set_source_surface (cr, surface1, 0, 0);
- cairo_set_source_rgba (cr, 0.6, 0.2, 0.2, 0.5);
- cairo_rectangle (cr, 10, 10, 150, 150);
- cairo_fill (cr);
- cairo_paint (cr);
- return false;
- }
- static gboolean
- darea2_draw_cb (GtkWidget *widget,
- cairo_t *cr,
- gpointer data)
- {
- g_debug ("Draw: drawing area 2");
- cairo_set_source_surface (cr, surface2, 0, 0);
- cairo_set_source_rgba (cr, 0.4, 0.8, 0.4, 0.5);
- cairo_rectangle (cr, 10, 10, 100, 100);
- cairo_fill (cr);
- cairo_paint (cr);
- return false;
- }
- static gboolean
- darea1_configure_event_cb (GtkWidget *widget,
- GdkEventConfigure *event,
- gpointer data)
- {
- GtkAllocation allocation;
- cairo_t *cr;
- g_debug ("Configure: drawing area 1");
- if (surface1)
- cairo_surface_destroy (surface1);
- gtk_widget_get_allocation (widget, &allocation);
- surface1 = gdk_window_create_similar_surface (gtk_widget_get_window (widget),
- CAIRO_CONTENT_COLOR,
- allocation.width,
- allocation.height);
- /* initialize the surface to white */
- cr = cairo_create (surface1);
- cairo_set_source_rgb (cr, 1, 1, 1);
- cairo_paint (cr);
- cairo_destroy (cr);
- return true;
- }
- static gboolean
- darea2_configure_event_cb (GtkWidget *widget,
- GdkEventConfigure *event,
- gpointer data)
- {
- GtkAllocation allocation;
- cairo_t *cr;
- g_debug ("Configure: drawing area 2");
- if (surface2)
- cairo_surface_destroy (surface2);
- gtk_widget_get_allocation (widget, &allocation);
- surface2 = gdk_window_create_similar_surface (gtk_widget_get_window (widget),
- CAIRO_CONTENT_COLOR,
- allocation.width,
- allocation.height);
- /* initialize the surface to white */
- cr = cairo_create (surface2);
- cairo_set_source_rgb (cr, 1, 1, 1);
- cairo_paint (cr);
- cairo_destroy (cr);
- return true;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement