GTK

Fórumok

Üdv néktek!
Újra előkerült a GTKzhatnékom, és a most kellő GtkStatusIcon ojjektumot hiányolom nagyon. Megoldható, hogy ez belekerüljön a repóba?
Sajnos nem tudom saját kezűleg belehergelni.

http://library.gnome.org/devel/gtk/unstable/GtkStatusIcon.html

Itt van róla bővebb infó!

Előre is köszi!
M

Hozzászólások

Ez a 2.12-es GTK része, frissíts arra.

A CCC-GTK interfész hiányos, ez igaz. A GTK elég gyorsan mozgó célpont, sok új API kerül bele, és bosszantó módon nagy részeket nyilvánítanak deprecateddé.

Az interfész félig manuálisan, félig programmal készül. Egyszerűbb esetben csak a GTK API-k leírását kell kiegészíteni a defs filékben (manuális/emberi munkával (sajnos ez nagy odafigyelést igényel és képben kell lenni hozzá)), ezekből program készíti a CCC interfész kódját.

Sajnos most nincs időm belemerülni a GTK-ba.

--
CCC3

Teljes siker a defs-el!
Köszönöm a tippet!
Kéred majd az elkészült def-t?

Kisebb gondba keveredtem:

(define-function position_menu
(in-module GtkStatusIcon)
(c-name "gtk_status_icon_position_menu")
(of-object GtkStatusIcon)
(return-type "none")
(parameters
'("GtkMenu*" "menu")
'("gint" "x")
'("gint" "y")
'("gboolean" "push_in")
'("gpointer" "user_data")
)
)

Erre azt köhögi az m, hogy:

----------------------------------------------------------------
../code_generated/gtk_status_icon_api.cpp: In function ‘void _nsp_gtk::_nsp_status_icon::_clp_position_menu(int)’:
../code_generated/gtk_status_icon_api.cpp:339: error: invalid conversion from ‘gint’ to ‘gint*’
../code_generated/gtk_status_icon_api.cpp:339: error: initializing argument 2 of ‘void gtk_status_icon_position_menu(GtkMenu*, gint*, gint*, gboolean*, void*)’
../code_generated/gtk_status_icon_api.cpp:339: error: invalid conversion from ‘gint’ to ‘gint*’
../code_generated/gtk_status_icon_api.cpp:339: error: initializing argument 3 of ‘void gtk_status_icon_position_menu(GtkMenu*, gint*, gint*, gboolean*, void*)’
../code_generated/gtk_status_icon_api.cpp:339: error: invalid conversion from ‘gboolean’ to ‘gboolean*’
../code_generated/gtk_status_icon_api.cpp:339: error: initializing argument 4 of ‘void gtk_status_icon_position_menu(GtkMenu*, gint*, gint*, gboolean*, void*)’

Ha pedig
(define-function position_menu
(in-module GtkStatusIcon)
(c-name "gtk_status_icon_position_menu")
(of-object GtkStatusIcon)
(return-type "none")
(parameters
'("GtkMenu*" "menu")
'("gint*" "x")
'("gint*" "y")
'("gboolean" "push_in")
'("gpointer*" "user_data")
)
)

Akkor a generált kódba tesz bele

ALERT
"gint*"

okat.
Valami ötlet?

Hagyd ki a position_menu függvényt. Ez arra kellene csak, hogy a popup menüt pontosan az ikon alá lehessen pozícionálni (ha jól értem). Ha ki van hagyva, akkor is működik, legfeljebb a menü az egérkurzor helyére kerül. Úgy is elfogadható. Az interfészben gint* parmaméter van, az ilyenekhez nem lehet automatikusan interfészt generálni, mert a CCC nem tud mit kezdeni egy pointerrel. Ha mindenképpen kell, akkor azt külön kézzel kell megírni.

Szerintem csak ezek kellenek:


gtk_status_icon_get_type
gtk_status_icon_new
gtk_status_icon_new_from_pixbuf
gtk_status_icon_new_from_file
gtk_status_icon_new_from_stock
gtk_status_icon_new_from_icon_name
set_visible
get_visible
set_tooltip

Közben én is elkezdtem, ha van türelmed kivárni, este felrakom.

--
CCC3

A menün kívül minden megvan és működik! :)

Viszont használat közben nem jelenik meg a menü, amitől kicsit szomorú vagyok.


function main()
local ico
local menu, menu_item,menu_bar
local  buf, i


    gtk.init ()

        ico:=gtk.status_icon.new_from_file("./1.jpg")
        gtk.status_icon.set_visible(ico,.t.)
        gtk.gobject.signal_connect(ico,"activate",{|*|gtk.status_icon.set_blinking(ico,.t.)})


    menu:=gtkmenuNew()
        for i:=1 to 3
            buf:="Öt szép szűzlány"+str(i)
            menu_item:=gtkmenuitemNew_with_label(buf)
            gtk.gobject.signal_connect(menu_item,"activate",{|*|menu:hide()})
            menu:append(menu_item)
        next


        gtk.gobject.signal_connect (ico, "popup-menu",{|a,but,act,point|gtk.menu.popup(menu,NIL,NIL,NIL,NIL,but,act)})

    gtk.main ()
return NIL

Mit csinálok rosszul?

A gtk.main() elé tedd be, hogy


    menu:show_all() //enélkül nem jelenik meg

Azt is látom, hogy nem generálódott neked objektum interfész. Az attól lesz, hogy a .../codegen/obhi.txt-be beírsz egy ilyen sort:

{GtkStatusIcon,GtkObject,GObject}

Újrafuttatod az mkall.b-t, azután írhatod:


    icon:=gtkstatusiconNew_from_stock("gtk-execute") 
    icon:liststruct
    icon:set_tooltip("Próba szerencse")
    icon:signal_connect("activate",{||qout("activate")}) 
    //stb.

Megkaptam a defs-t, köszi, mindjárt bedolgozom.

--
CCC3

Felraktam a változásokat az svn-be.

A defs filét kicsit javítgatni kellett mert define-function-okat írtál define-method helyett, és úgy nem generálódik metódus az objektum interfészben.

A {GtkStatusIcon,GtkObject,GObject} helyett {GtkStatusIcon,GObject} kell az obhi.txt-be (ez írja le az objektum hierarchiát). Tehát a GtKStatusIcon nem egy GtkObject, ahogy tévesen gondoltam.

A képet így lehet frissíteni:


    icon:set_from_file(jpeg_file)

Azonnal látszik a változás.

--
CCC3

Nem a popupról van szó,hanem a set_from_file-ról.

Van egy művelet ami percenként megismétlődik éseltart 4-5mp-ig.
Azt szeretném, ha a művelet közben más ikon lenne, mint az alap.
Példákat böngésztem, mind azt mondja, hogy csak egymás után kell hívogatni a set_from_file()-t.
Igen ám, de ha meghívom, akkor csak akkor látom a változást, ha megsimogatom az egérrel a képet (elhúzom felette). Ez azt feltételezteti velem, hogy valami nem repainteli, ahogy kéne.

Ezt kipróbálnád?


#include "gtk.ch"
function main()
local icon
local menu, menu_item

    gtk.init ()

        icon:=gtkstatusiconnew()
        icon:liststruct
        icon:set_from_icon_name(GTK_STOCK_HOME)

        gtk.gobject.signal_connect(icon,"activate",{|*|icon:set_blinking(.f.)})


    menu:=gtkmenuNew()

    menu_item:=gtkmenuitemNew_with_label("Quit")
    gtk.gobject.signal_connect(menu_item,"activate",{|*|quit()})
    menu:append(menu_item)


    gtk.gobject.signal_connect (icon, "popup-menu",{|a,but,act,point|gtk.menu.popup(menu,NIL,NIL,NIL,NIL,but,act)})

    menu:show_all()
    icon:set_visible(.t.)

thread_detach(thread_Create({||looping(icon)}))
gtk.main()

function looping(icon)


    while(.t.)

        ?"Timeout for job"
        sleep(6000)
        icon:set_from_icon_name(GTK_STOCK_OK)
        ?"Do something"
            sleep(4000)
        icon:set_from_icon_name(GTK_STOCK_HOME)
    end

return NIL

Kipróbáltam a példádat. Nálam is csak akkor vált a kép, ha egérrel piszkálom az ikont. De ez egy többszálú program. Semmit nem tudok arról, hogyan lehet a GTK-t többszálúan programozni. Én nem bíznék benne, hogy ez egyáltalán lehetséges. A Jáva Swing pl. nem szálbiztos. Itt egy egyszálú program, amiben viszont azonnal vált a kép:



#include "gtk.ch"

function main()

local window, vbox
local menu_bar, root_menu, menu, menu_item
local icon

    gtk.init ()

    icon:=gtkstatusiconnew()
    icon:set_from_icon_name(GTK_STOCK_HOME)

    window:=gtkwindowNew()
    window:set_size_request(200,100)
    window:set_title("GTK Menu Test")
    window:signal_connect("delete_event",{||gtk.main_quit()})
    vbox:=gtkvboxNew(.f.,0)
    window:add(vbox)

    menu_bar:=gtkmenubarNew()
    root_menu:=gtkmenuitemNew_with_label("Menü")
    menu_bar:append(root_menu)

    menu:=gtkmenuNew()
    menu_item:=gtkmenuitemNew_with_label("Home")
    menu:append(menu_item)
    menu_item:signal_connect("activate",{||icon:set_from_icon_name(GTK_STOCK_HOME)})
    menu_item:=gtkmenuitemNew_with_label("Ok")
    menu:append(menu_item)
    menu_item:signal_connect("activate",{||icon:set_from_icon_name(GTK_STOCK_OK)} )

    root_menu:set_submenu(menu)

    vbox:pack_start(menu_bar,.f.,.f.,2)
    window:show_all
    gtk.main ()

--
CCC3

Létezik olyan lehetőség a már meglévő ccc implementációban, hogy egyéni signal-okat regisztrálhatunk egy adott object-hez?
Vagy EZT hegesszem bele?

Arra gondoltam, hogy mi lenne, ha létrejönne egy signal, amit user nem tud meghívni, viszont kódból lehetne élesíteni?

Találtam GTK leírásban thread-eket. Próbáljam azokkal? :)

A történetiség kedvéért: a probléma megoldása a gtk.main_stabilize() függvény lett, akit elvben laza csuklóval meg lehet hívni másik szálból, és voltaképp egyfajta refreshként működik.

w

A több szál és a GUI kérdéskörének megoldására egy asyncExec hívást szoktak csinálni a kontrolokra. Ennek van egy callback (delegate v függvény paraméter v callback interfész) és egy tetszőleges objektum(referencie, pointer) paramétere. Ezt a callbacket garantáltan az ablakkezelő üzenetfeldolgozó szálán fogja visszahívni a rendszer. Ezta megoldást szokták használni másik szálból GUI módosítás kezdeményezésre.

Nem tudom ez hogy működik se GTK-ban, se CCC-ben, de valami ilyesmit illene csinálni szerintem.

A gtkstatusicon-t pl csak elindítja villogni.Eljut addig, hogy nem látszik az ikon, denem villog tova.
Van még más hiba is, de most nincs előttem. Majd bepostolom.