Transparent window

Linux specific forum
User avatar
Progi1984
Addict
Addict
Posts: 806
Joined: Fri Feb 25, 2005 1:01 am
Location: France > Rennes
Contact:

Transparent window

Post by Progi1984 »

Hi all, when i launch this code, i've got an IMA at line 39, but function and arguments seem corrects.
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
walker
Enthusiast
Enthusiast
Posts: 634
Joined: Wed May 05, 2004 4:04 pm
Location: Germany

Post by walker »

the reason for the ima are 2 issues... 1st.. some typos and second the default type isn't long anymore (guessing youre using 4.30) :wink:
3rd: all gtk/gdk funktions are expecting utf8 strings.. not a problem if compiling without unicode mode.. but a big one if compiling with... here's your corrected code including a procedure which does the ascii to utf8 conversion

Code: Select all

Define.l
Declare screen_changed(*widget, *old_screen,  user_data.l)
Declare expose(*widget, *event,  user_data.l)
Declare clicked(*win, *event,  user_data.l)
    gtk_init_(0,0)
    gdk_init_(0,0)
Global gdk_screen_get_rgba_colormap.l
Global gdk_screen_get_rgb_colormap.l
Global gdk_cairo_create.l
Global cairo_set_source_rgba.l
Global cairo_set_source_rgb.l
Global cairo_set_operator.l
Global cairo_paint.l
Global cairo_stroke.l
Global cairo_destroy.l
Global cairo_arc.l
Global cairo_fill.l
Procedure to_utf8(txt.s)
    mem=AllocateMemory(Len(txt)*6)
    PokeS(mem,txt,-1,#PB_UTF8)
    ProcedureReturn mem
EndProcedure
  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.l)
    ProcedureReturn CallCFunctionFast(cairo_set_operator,*cairo,type.l)
  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,"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,"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


    window = gtk_window_new_(#GTK_WINDOW_TOPLEVEL)
    gtk_window_set_title_(window, "Alpha Demo")
    gtk_widget_set_size_request_(Window,200,100)
    gtk_window_move_(window,100,100)
    g_signal_connect_object_(*window, "delete-event", gtk_main_quit_(),#Null,#G_CONNECT_SWAPPED)
    
    f=gtk_fixed_new_()
    gtk_container_add_(window,f)
    
    gtk_widget_set_app_paintable_(window, #True)
    mp=to_utf8("expose-event")
    g_signal_connect_(window, mp, @expose(), #Null)
    FreeMemory(mp)
    mp=to_utf8("screen-changed")    
    g_signal_connect_(window, mp, @screen_changed(), #Null)
    FreeMemory(mp)   
    gtk_window_set_decorated_(window, #False)
    gtk_widget_add_events_(window, #GDK_BUTTON_PRESS_MASK)
    
    
    b=gtk_button_new_with_label_("toggle frame")
    gtk_fixed_put_(f,b,90,60)
    gtk_widget_set_size_request_(b,100,30)  
    mp=to_utf8("clicked")        
    g_signal_connect_data_(b, mp, @clicked(),window,#Null,#G_CONNECT_SWAPPED )    
    FreeMemory(mp)   
    gtk_widget_show_(b)
    
    screen_changed(window, #Null, #Null)
    
    gtk_widget_show_all_(window)
    gtk_main_()
  
ProcedureC screen_changed(*widget, *old_screen, userdata.l)
    ; 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.l)
    *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.l, height.l
;     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
ProcedureCDLL clicked(*win, *event,  user_data.l)
    ; toggle window manager frames
    
    gtk_window_set_decorated_(*win, 1-gtk_window_get_decorated_(*win))
EndProcedure
Last edited by walker on Tue Sep 23, 2008 11:34 pm, edited 1 time in total.
Fred
Administrator
Administrator
Posts: 18162
Joined: Fri May 17, 2002 4:39 pm
Location: France
Contact:

Post by Fred »

You should really use prototypes, it's much cleaner and will handle automatic ascii or unicode to utf8 conversion.
User avatar
Progi1984
Addict
Addict
Posts: 806
Joined: Fri Feb 25, 2005 1:01 am
Location: France > Rennes
Contact:

Post by Progi1984 »

I use PB 4.20 And Ascii Mode.

But walker with your sample, i see a simple window not a transparent window like here : http://gtk.developpez.com/faq/images/transparent.png
walker
Enthusiast
Enthusiast
Posts: 634
Joined: Wed May 05, 2004 4:04 pm
Location: Germany

Post by walker »

uups...... updated my code... it now shows a button at startup... nothing else if you click this button, the window decoration is toggled....
User avatar
Progi1984
Addict
Addict
Posts: 806
Joined: Fri Feb 25, 2005 1:01 am
Location: France > Rennes
Contact:

Post by Progi1984 »

Ouah but always a black window ! We progress, but are not successed...

My system supports alpha channels.
The toggle frame runs... and improve the quit function

Code: Select all

Declare quit()
Declare screen_changed(*widget, *old_screen,  user_data.l)
Declare expose(*widget, *event,  user_data.l)
Declare clicked(*win, *event,  user_data.l)
    gtk_init_(0,0)
    gdk_init_(0,0)
Global gdk_screen_get_rgba_colormap.l
Global gdk_screen_get_rgb_colormap.l
Global gdk_cairo_create.l
Global cairo_set_source_rgba.l
Global cairo_set_source_rgb.l
Global cairo_set_operator.l
Global cairo_paint.l
Global cairo_stroke.l
Global cairo_destroy.l
Global cairo_arc.l
Global cairo_fill.l
Procedure to_utf8(txt.s)
    mem=AllocateMemory(Len(txt)*6)
    PokeS(mem,txt,-1,#PB_UTF8)
    ProcedureReturn mem
EndProcedure
  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.l)
    ProcedureReturn CallCFunctionFast(cairo_set_operator,*cairo,type.l)
  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,"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,"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


    window = gtk_window_new_(#GTK_WINDOW_TOPLEVEL)
    gtk_window_set_title_(window, "Alpha Demo")
    gtk_widget_set_size_request_(Window,200,100)
    gtk_window_move_(window,100,100)
    mp=to_utf8("delete-event")        : g_signal_connect_object_(window, mp, @quit(),#Null,#G_CONNECT_SWAPPED) : FreeMemory(mp)
    f=gtk_fixed_new_()
    gtk_container_add_(window,f)
   
    gtk_widget_set_app_paintable_(window, #True)
    mp=to_utf8("expose-event")      : g_signal_connect_(window, mp, @expose(), #Null) : FreeMemory(mp)
    mp=to_utf8("screen-changed")  : g_signal_connect_(window, mp, @screen_changed(), #Null) : FreeMemory(mp)   
    gtk_window_set_decorated_(window, #False)
    gtk_widget_add_events_(window, #GDK_BUTTON_PRESS_MASK)

    b=gtk_button_new_with_label_("toggle frame")
    gtk_fixed_put_(f,b,90,60)
    gtk_widget_set_size_request_(b,100,30) 
    
    mp=to_utf8("clicked")                 : g_signal_connect_data_(b, mp, @clicked(),window,#Null,#G_CONNECT_SWAPPED ) : FreeMemory(mp)   

    gtk_widget_show_(b)
    screen_changed(window, #Null, #Null)
    gtk_widget_show_all_(window)
    gtk_main_()

ProcedureC quit()
  gtk_main_quit_()
  End
EndProcedure
ProcedureC screen_changed(*widget, *old_screen, userdata.l)
    ; 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.l)
    *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.l, height.l
;     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
ProcedureCDLL clicked(*win, *event,  user_data.l)
    ; toggle window manager frames
    gtk_window_set_decorated_(*win, 1-gtk_window_get_decorated_(*win))
EndProcedure 
Post Reply