Ü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
- 5126 megtekintés
Hozzászólások
Ez a 2.12-es GTK része, frissíts arra.
- A hozzászóláshoz be kell jelentkezni
A ccc API hiányos, nem a gtk :)
De megoldottam, úgy néz ki.
mrev: a repo-ba azért majd beleírod?
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
Akkor megpróbálom kitaposni a dolgot és meglátom mit tehetek a defs-el!
Ha jutok valamire, akkor szólok!
- A hozzászóláshoz be kell jelentkezni
Teljes siker a defs-el!
Köszönöm a tippet!
Kéred majd az elkészült def-t?
- A hozzászóláshoz be kell jelentkezni
Aha, kérem.
--
CCC3
- A hozzászóláshoz be kell jelentkezni
Aha, kérem.
--
CCC3
- A hozzászóláshoz be kell jelentkezni
Hová küldjem?
- A hozzászóláshoz be kell jelentkezni
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?
- A hozzászóláshoz be kell jelentkezni
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 hozzászóláshoz be kell jelentkezni
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 hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
Zseniális!
Köszönöm szépen!
- A hozzászóláshoz be kell jelentkezni
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?
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
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!
- A hozzászóláshoz be kell jelentkezni
Negatív!
Kubuntu 7.10 Gutsy alatt egerésznem kell, hogy lássam a változást. :(
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
Elkeskenyedett ez az ág, újat kezdek.
--
CCC3
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
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. :)
- A hozzászóláshoz be kell jelentkezni
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?
- A hozzászóláshoz be kell jelentkezni
Csak ha megírod C-ben.
--
CCC3
- A hozzászóláshoz be kell jelentkezni
Találtam GTK leírásban thread-eket. Próbáljam azokkal? :)
- A hozzászóláshoz be kell jelentkezni
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 hozzászóláshoz be kell jelentkezni
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 hozzászóláshoz be kell jelentkezni
Lazán azért nem, de megoldható. Képes összeveszni a main-nel és kilőni a programot hibával.
- A hozzászóláshoz be kell jelentkezni
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 hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
És az kizárt, hogy a Te kódodban van a hiba? :P
w
- A hozzászóláshoz be kell jelentkezni
Most kivételesen igen! :D
icon:set_blinking(.t.)
gtk.main_stabilize()
- A hozzászóláshoz be kell jelentkezni