Thanks for your help.
Translation of this code : http://plan99.net/~mike/files/alphademo.c
May be you have an another solution for making transparent windows under linux ?
Code: Select all
Declare screen_changed(*widget, *old_screen, user_data)
Declare expose(*widget, *event, user_data)
Declare clicked(*win, *event, user_data)
Global gdk_screen_get_rgba_colormap
Global gdk_screen_get_rgb_colormap
Global gdk_cairo_create
Global cairo_set_source_rgba
Global cairo_set_source_rgb
Global cairo_set_operator
Global cairo_paint
Global cairo_stroke
Global cairo_destroy
Global cairo_arc
Global cairo_fill
ProcedureCDLL cairo_set_source_rgba(*cairo,r.f,g.f,b.f,a.f)
ProcedureReturn CallCFunctionFast(cairo_set_source_rgba,*cairo,r.f,g.f,b.f,a.f)
EndProcedure
ProcedureCDLL cairo_set_source_rgb(*cairo,r.f,g.f,b.f)
ProcedureReturn CallCFunctionFast(cairo_set_source_rgb,*cairo,r.f,g.f,b.f)
EndProcedure
ProcedureCDLL cairo_set_operator(*cairo,type)
ProcedureReturn CallCFunctionFast(cairo_set_operator,*cairo,type)
EndProcedure
ProcedureCDLL cairo_paint(*cairo)
ProcedureReturn CallCFunctionFast(cairo_paint,*cairo)
EndProcedure
ProcedureCDLL cairo_stroke(*cairo)
ProcedureReturn CallCFunctionFast(cairo_stroke,*cairo);
EndProcedure
ProcedureCDLL cairo_destroy(*cairo)
ProcedureReturn CallCFunctionFast(cairo_destroy,*cairo)
EndProcedure
ProcedureCDLL cairo_fill(*cairo)
ProcedureReturn CallCFunctionFast(cairo_fill,*cairo)
EndProcedure
ProcedureCDLL cairo_arc(*cairo, xc.f, yc.f, radius.f, angle1.f, angle2.f)
ProcedureReturn CallCFunctionFast(cairo_arc, *cairo, xc, yc, radius, angle1, angle2)
EndProcedure
ProcedureCDLL gdk_screen_get_rgba_colormap(*widget)
ProcedureReturn CallCFunctionFast(gdk_screen_get_rgba_colormap,*widget)
EndProcedure
ProcedureCDLL gdk_screen_get_rgb_colormap(*widget)
ProcedureReturn CallCFunctionFast(gdk_screen_get_rgb_colormap,*widget)
EndProcedure
ProcedureCDLL gdk_cairo_create(*context)
ProcedureReturn CallCFunctionFast(gdk_cairo_create,*context)
EndProcedure
Enumeration
#CAIRO_OPERATOR_CLEAR
#CAIRO_OPERATOR_SOURCE
#CAIRO_OPERATOR_OVER
#CAIRO_OPERATOR_IN
#CAIRO_OPERATOR_OUT
#CAIRO_OPERATOR_ATOP
#CAIRO_OPERATOR_DEST
#CAIRO_OPERATOR_DEST_OVER
#CAIRO_OPERATOR_DEST_IN
#CAIRO_OPERATOR_DEST_OUT
#CAIRO_OPERATOR_DEST_ATOP
#CAIRO_OPERATOR_XOR
#CAIRO_OPERATOR_ADD
#CAIRO_OPERATOR_SATURATE
EndEnumeration
If OpenLibrary(2,"/usr/lib/libcairo.so")
cairo_set_source_rgba=GetFunction(2,"cairo_set_source_rgba")
cairo_set_source_rgb=GetFunction(2,"cairo_set_source_rgb")
cairo_set_operator=GetFunction(2,"cairo_set_operator")
cairo_paint=GetFunction(2,"cairo_paint")
cairo_stroke=GetFunction(2,"cairo_stroke")
cairo_destroy=GetFunction(2,"cairo_destroy")
cairo_arc=GetFunction(2,"cairo_arc")
cairo_fill=GetFunction(2,"cairo_fill")
CloseLibrary(2)
EndIf
If OpenLibrary(1,"/usr/lib/libgdk-x11-2.0.so.0")
gdk_screen_get_rgba_colormap=GetFunction(1,"gdk_screen_get_rgba_colormap")
gdk_screen_get_rgb_colormap=GetFunction(1,"gdk_screen_get_rgb_colormap")
gdk_cairo_create=GetFunction(1,"gdk_cairo_create")
; gdk_window_set_back_pixmap=GetFunction(1,"gdk_window_set_back_pixmap")
CloseLibrary(1)
EndIf
Global supports_alpha = #False ; Only some X servers support alpha channels. Always have a fallback
gtk_init_(0,0)
window = gtk_window_new_(#GTK_WINDOW_TOPLEVEL)
gtk_window_set_title_(window, "Alpha Demo")
;g_signal_connect_(window, "delete-event", @gtk_main_quit(), #Null)
gtk_widget_set_app_paintable_(window, #True)
g_signal_connect_(window, "expose-event", @expose(), #Null)
g_signal_connect_(window, "screen-changed", @screen_changed(), #Null)
gtk_window_set_decorated_(window, #False)
gtk_widget_add_events_(window, #GDK_BUTTON_PRESS_MASK)
g_signal_connect_(window, "button-press-event", @clicked(), #Null)
screen_changed(window, #Null, #Null)
gtk_widget_show_all_(window)
gtk_main_()
ProcedureC screen_changed(widget, old_screen, userdata)
; To check If the display supports alpha channels, get the colormap
screen = gtk_widget_get_screen_(widget)
colormap = gdk_screen_get_rgba_colormap(screen)
Debug colormap
If Not colormap
Debug ("Your screen does not support alpha channels!")
colormap = gdk_screen_get_rgb_colormap(screen)
supports_alpha = #False
Else
Debug ("Your screen supports alpha channels!")
supports_alpha = #True
EndIf
; Now we have a colormap appropriate For the screen, use it
gtk_widget_set_colormap_(widget, colormap)
EndProcedure
ProcedureC expose( *widget.GtkWidget, *event, userdata)
cr = gdk_cairo_create(*widget\window)
If (supports_alpha)
cairo_set_source_rgba (cr, 1.0, 1.0, 1.0, 0.0) ; transparent
Else
cairo_set_source_rgb (cr, 1.0, 1.0, 1.0) ; opaque white
EndIf
; draw the background
cairo_set_operator (cr, #CAIRO_OPERATOR_SOURCE)
cairo_paint (cr)
; draw a circle
Protected width, height
gtk_window_get_size_(widget, @width, @height)
cairo_set_source_rgba(cr, 1, 0.2, 0.2, 0.6)
If width < height
cairo_arc(cr, width / 2, height / 2, width - 8 , 0, 2 * 3.14)
Else
cairo_arc(cr, width / 2, height / 2, height - 8 , 0, 2 * 3.14)
EndIf
cairo_fill(cr)
cairo_stroke(cr)
cairo_destroy(cr)
ProcedureReturn #False
EndProcedure
ProcedureC clicked(win, *event, user_data)
; toggle window manager frames
gtk_window_set_decorated_(win, 1-gtk_window_get_decorated_(win))
EndProcedure