Syntax

Alles rund um das grafische Benutzerinterface Enigma
mechatron
Interessierter
Interessierter
Beiträge: 28
Registriert: Samstag 1. März 2003, 08:08

Syntax

Beitrag von mechatron »

Kann mir vielleicht jemand weiter helfen?
Folgendes Problem:
"path" soll die Summe von char mpoint[1024]; und einem String sein.
mpoint ist "/var/mnt/usb".

eString path;
path=mpoint;
path+="/image";


Wenn ich jetzt "path" kontrolliere mit:
eMessageBox msg(path, "Info", eMessageBox::btOK); msg.show(); msg.exec(); msg.hide();
funktioniert das auch. Die Ausgabe ist "/var/mnt/usb/image".

Will ich aber "path" zum auslesen eines Files einsetzen funktioniert das nicht.
FILE *f=fopen(path.c_str(),"r")
obi
Senior Member
Beiträge: 1282
Registriert: Montag 12. November 2001, 00:00

Beitrag von obi »

Code: Alles auswählen

if (!f) perror(path.c_str());
was gibt das aus?
mechatron
Interessierter
Interessierter
Beiträge: 28
Registriert: Samstag 1. März 2003, 08:08

Beitrag von mechatron »

Hab es geschafft. :)
Dank dir, dein Tipp (perror) hat mir echt weitergeholfen.
mechatron
Interessierter
Interessierter
Beiträge: 28
Registriert: Samstag 1. März 2003, 08:08

Enigma Plugin Schließen

Beitrag von mechatron »

Mit was für einem Befehl kann ich ein laufendes Plugin schließen?
Über einen Button ist es ja kein Problem:
CONNECT(ok->selected, eWidget::reject)
Ruf ich dem Plugin ein weiteres eWindow auf, kann ich das mit close() schließen.
Wenn ich aber close() im eigentlichen Plugin aufrufe, bekomme ich immer die Fehlermeldung:
"attempt to close non-execing widget"
Mit anderen Worten, ich soll das Plugin nicht schließen.
tmbinc
Developer
Beiträge: 821
Registriert: Freitag 20. Juli 2001, 00:00

Beitrag von tmbinc »

das kommt ein wenig auf deinen plugin code an.

was für ein plugin machst du? eins, was nur bei bedarf geladen wird? (mit cfg datei, eintrag im blauen/plugin menü, ..) oder eins, was die ganze zeit geladen ist (durch /var/tuxbox/config/enigma/plugins)?

In ersterem falle wird das Plugin ja aufgerufen durch einen aufruf der Plugin-main-funktion. Wenn diese Funktion aufgerufen wird, erstellst du ein Window.

in letzterem falle connectest du dich ja irgendwo hin, meist z.b. an einen hook. Wenn der Hook aufgerufen wird, erstellst du ein Window.

Dieses erstellte Window - egal in welchem Fall - show()st du, und dann exec()st du es, und dann hide()st du es wieder.. prinzipiell.

Du kannst nur Fenster schliessen die sich gerade im exec() befinden. "attempt to close non-execing widget" heisst also, dass du close() in einem widget aufrufst, was nie mit ->exec() modal gemacht wurde. Bei so einem Widget macht es natürlich keinen Sinn es zu schliessen. "Schliessen" ist halt das austreten aus der modalen loop (in die man mit exec() gerät). Es hat nichts mit einem eventuellen hide() zu tun.


Hmm wenn noch probleme sind, kannst du mir ja mal auszugsweise deinen source schicken (oder hier posten wenns nicht zu viel ist)... dann guck ich mir das gerne mal an.
mechatron
Interessierter
Interessierter
Beiträge: 28
Registriert: Samstag 1. März 2003, 08:08

Beitrag von mechatron »

Mhh…
Dann versteh ich nicht, warum ich kein close() machen kann.
Das Widget "install" wird doch mit show() exec() aufgerufen.
"loaddir" ist dann wieder ein neues eWindow, was ich mit close() schließen kann.
Das Plugin wird übrigens über die blaue Taste gestartet.
Hier mal einen Auszug aus dem Plugin. Denn Rest von dem Plugin will ich mal lieber nicht öffentlich machen, da ich erst vor einer Woche mit Programmieren angefangen habe. :oops:

extern "C" int plugin_exec( PluginParam *par );

class install: public eWindow
{
eButton *ok_bt;
void loaddir();
char mountpoint[1024];
eString mpoint;
public:
install(): eWindow(0)
{
int fd=eSkin::getActive()->queryValue("fontsize", 20);
cmove(ePoint(160, 100));
cresize(eSize(280, 340));
setText("blabla");

ok_bt=new eButton(this);
ok_bt->move(ePoint(10, 20));
ok_bt->resize(eSize(260, fd+15));
ok_bt->setText("Test");
ok_bt->loadDeco();
CONNECT(ok_bt->selected, install::loaddir);

if (FILE *f=fopen(eString().sprintf("/tmp/datei").c_str(),"r"))
{
fgets(mountpoint, 1024, f);
mpoint=mountpoint;
fclose(f);
}
if(mpoint=="")
{
hide();
eMessageBox msg("Dream-Image must be started!", "Info", eMessageBox::btOK);
msg.show(); msg.exec(); msg.hide();
close();//Hier kommt die Fehlermeldung
}
}

};
int plugin_exec( PluginParam *par )
{
install dlg;
dlg.show();
dlg.exec();
dlg.hide();
return 0;
}
tmbinc
Developer
Beiträge: 821
Registriert: Freitag 20. Juli 2001, 00:00

Beitrag von tmbinc »

Wenn ich das richtig sehe, machst du das im Konstruktor vom "install", also vom "eWindow". Zu dem Zeitpunkt ist das Fenster noch nicht im "exec"-state, sondern befindet sich ja sogar noch vor dem "show()".

Das ist generell bei C++-Konstruktoren so, dass man da ja blöderweise keine Returnwerte o.ä. festlegen kann.

Dir bleibt also nichts anderes übrig als entweder:
- eine variable "ok" in der klasse einzuführen, die du vor dem "show, exec, hide" abfragst - und wenn sie halt nicht ok ist, machste das garnicht erst.
- die initialisierung (also ab dem fopen) nicht im konstruktor vornehmen, sondern im "beginExec"-event - das wird als erstes beim exec aufgerufen, und dort kannst du dann ein close() machen.
mechatron
Interessierter
Interessierter
Beiträge: 28
Registriert: Samstag 1. März 2003, 08:08

Beitrag von mechatron »

Dank dir.
Ich hab es vor den Aufruf von "install" eingebaut und gehe mit "return" raus. Ich versteh zwar noch nicht, warum das nicht mit "close()" geht aber dein Vorschlag die Abfrage vor den Aufruf von "install" zu legen funktioniert.
mechatron
Interessierter
Interessierter
Beiträge: 28
Registriert: Samstag 1. März 2003, 08:08

Beitrag von mechatron »

Ich mal wieder.
Gibt es eine Möglichkeit für "eListBoxEntryText" einen Font festzulegen?
Für eLabel oder eButton usw. ist das ja kein Problem (elabel->setFont("blabla")), nur bei "eListBoxEntryText" geht das nicht.
Ich will keinen kompletten Skin laden, sondern nur den Font.

Wer sich das Plugin für die Dream anschaut (auf meiner Homepage /plugins/shell-tool) weiß warum ich das brauche.
Ulli010
Einsteiger
Einsteiger
Beiträge: 140
Registriert: Donnerstag 31. Oktober 2002, 17:59

Beitrag von Ulli010 »

[controld] VIDEO_EVENT_SIZE_CHANGED 720x576 (4:3 -> 4:3)
/var/tuxbox/plugins/shelltool.so: undefined symbol: _ZN7eWidget6acceptEv
Leider passiert hier noch nicht mehr.

CU Ulli01
mechatron
Interessierter
Interessierter
Beiträge: 28
Registriert: Samstag 1. März 2003, 08:08

Beitrag von mechatron »

Läuft auf der Dreambox mit Image 1.06.5 ohne Fehlermeldung.
Wenn du ein Kompiliertes von dir einsetzt, muss ich das Teil erst neu übersetzen, da sich in den Funktionen von Enigma einiges geändert hat.
Sobald ein neues Dream-Image kommt ist natürlich die neu kompilierte Version auf meiner Homepage.