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 API hiányos, nem a gtk :)
De megoldottam, úgy néz ki.
mrev: a repo-ba azért majd beleírod?
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
Akkor megpróbálom kitaposni a dolgot és meglátom mit tehetek a defs-el!
Ha jutok valamire, akkor szólok!
Teljes siker a defs-el!
Köszönöm a tippet!
Kéred majd az elkészült def-t?
Aha, kérem.
--
CCC3
Aha, kérem.
--
CCC3
Hová küldjem?
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:
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.
Mit csinálok rosszul?
A gtk.main() elé tedd be, hogy
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:
Megkaptam a defs-t, köszi, mindjárt bedolgozom.
--
CCC3
Zseniális!
Köszönöm szépen!
Arra van ötleted, hogy miképpen frissíthető a kép?
Ha megadok neki egy másik fájlt, csak akkor frissül fel a tálcán a kép, ha ráviszem az egeret. :S
Kerestem, de mintha nem lenne refresh-szerű metódusa.
Esetleg a GtkObject-nek van?
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:
Azonnal látszik a változás.
--
CCC3
Köszönöm, update-elek.
Nekem nem látszik a változás, de lehet, hogy most a módosítások után fog!
Negatív!
Kubuntu 7.10 Gutsy alatt egerésznem kell, hogy lássam a változást. :(
Ezt nem nekünk kell javítani.
Hozzáraktam egy icon:popup(menu) metódust, ami profi módon pozícionálja a popupmenüt. Így nem kell a gtk_status_icon_position_menu (C) callback függvénnyel Clipper szintén szenvedni.
--
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?
Elkeskenyedett ez az ág, újat kezdek.
--
CCC3
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:
--
CCC3
Igen, felhasználó által gerjesztett eseményre nálam is vált gond nélkül, de nem ez a cél. Valamit kitalálok. :)
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?
Csak ha megírod C-ben.
--
CCC3
Találtam GTK leírásban thread-eket. Próbáljam azokkal? :)
Sajnos nem tudok ebben segíteni. Én inkább megpróbálnám kerülni a szálakat. Azt mindenképpen kerülném, hogy több szál ugyanazon a GUI-n babráljon.
--
CCC3
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
Lazán azért nem, de megoldható. Képes összeveszni a main-nel és kilőni a programot hibával.
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.
És az kizárt, hogy a Te kódodban van a hiba? :P
w
Most kivételesen igen! :D
icon:set_blinking(.t.)
gtk.main_stabilize()