program TransparentGtkWindow;
uses
glib2,
gdk2,
gtk2,
gtk2def,
gtk2proc,
gtk2int,
gdk2pixbuf,
gtk2extra,
cairo,
pango,
pangocairo,
BGRABitmap,
BGRABitmapTypes,
Classes,
SysUtils,
Graphics;
var
Bitmap: TBGRABitmap;
procedure gdk_window_input_shape_combine_mask(window: PGdkWindow; mask: PGdkBitmap; x, y: GInt); cdecl; external gdklib;
function gtk_widget_get_window(widget: PGtkWidget): PGdkWindow; cdecl; external gtklib;
procedure Destroy(widget: PGtkWidget; Data: pgpointer); cdecl;
begin
gtk_main_quit;
end;
procedure SplashExpose(widget: PGtkWidget; event: PGdkEventExpose; userdata: GPointer); cdecl;
var
cr: Pcairo_t;
surface: Pcairo_surface_t;
begin
cr := gdk_cairo_create(widget^.window);
cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE);
surface := cairo_image_surface_create_for_data(PByte(Bitmap.Data), CAIRO_FORMAT_ARGB32, Bitmap.Width, Bitmap.Height, cairo_format_stride_for_width(CAIRO_FORMAT_ARGB32, Bitmap.Width));
cairo_set_source_surface(cr, surface, 100, 100);
cairo_paint(cr);
cairo_destroy(cr);
end;
procedure SplashScreenChanged(widget: PGtkWidget; old_screen: PGdkScreen; userdata: GPointer); cdecl;
var
Screen: PGdkScreen;
Colormap: PGdkColormap;
begin
Screen := gtk_widget_get_screen(widget);
Colormap := gdk_screen_get_rgba_colormap(Screen);
gtk_widget_set_colormap(widget, Colormap);
end;
var
window, fixed_container, button: PGtkWidget;
procedure clicked(win: PGtkWindow; event: PGdkEventButton; userdata: gpointer); cdecl;
begin
gtk_window_set_decorated(GTK_WINDOW(window), not gtk_window_get_decorated(GTK_WINDOW(window)));
end;
begin
Bitmap := TBGRABitmap.Create(100, 100);
Bitmap.FillEllipseAntialias(100, 100, 100, 100, BGRA(255, 0, 0, 125));
gtk_init(@argc, @argv);
window := gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_widget_set_size_request(window, 500, 500);
gtk_widget_set_app_paintable(window, True);
g_signal_connect(G_OBJECT(window), 'destroy',
GTK_SIGNAL_FUNC(@Destroy), NULL);
g_signal_connect(G_OBJECT(window), 'expose-event',
G_CALLBACK(@SplashExpose), NULL);
g_signal_connect(G_OBJECT(window), 'screen-changed',
G_CALLBACK(@SplashScreenChanged), nil);
gtk_widget_add_events(window, GDK_BUTTON_PRESS_MASK);
fixed_container := gtk_fixed_new();
gtk_container_add(GTK_CONTAINER(window), fixed_container);
button := gtk_button_new_with_label('button');
g_signal_connect(G_OBJECT(button), 'button-press-event', G_CALLBACK(@clicked), NULL);
gtk_widget_set_size_request(button, 150, 150);
gtk_container_add(GTK_CONTAINER(fixed_container), button);
SplashScreenChanged(window, nil, nil);
gtk_window_set_decorated(GTK_WINDOW(window), False);
gtk_widget_show_all(window);
gtk_main;
end.