amiga-news DEUTSCHE VERSION
.
Links| Forums| Comments| Report news
.
Chat| Polls| Newsticker| Archive
.

amiga-news.de Forum > Programmierung > Shell in Window? [ - Search - New posts - Register - Login - ]

-1- [ - Post reply - ]

2008-11-18, 16:19 h

Der_Wanderer
Posts: 1229
User
Irgendwo hatte ich mal gelesen, dass man eine Shell in ein eigenes Fenster integrieren kann. Ich würde sowas gerne machen, da ich z.B. in einer Entwicklungsumgebung gerne den Output eines CLI Tools anzeigen würde, neben anderen GUI Elementen. (ohne eine eigene Shell aufzumachen). Geht das, und wenn ja, wie?


--
Thilo Köhler, Author von:
HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, TK AB3 Includes und viele mehr...
Homepage: http://www.hd-rec.de


[ - Answer - Quote - Direct link - ]

2008-11-18, 16:47 h

thomas
Posts: 7721
User
Du meinst sicher nicht Shell, sondern Console. Hier ist ein Beispiel:

code:
#include <proto/dos.h>
#include <proto/intuition.h>
#include <stdio.h>

int main (void)

{
struct Screen *scr;
struct Window *win;
BPTR console;
char buffer[80];

if (scr = OpenScreenTags (NULL,SA_LikeWorkbench,TRUE,TAG_END))
	{
	if (win = OpenWindowTags (NULL,WA_CustomScreen,scr,WA_Activate,TRUE,TAG_END))
		{
		sprintf (buffer,"con://///window %08lx",win);
		if (console = Open (buffer,MODE_NEWFILE))
			{
			FPrintf (console,"Please press Return to close the window.n");
			Read (console,buffer,80);
			Close (console);
			}
		else
			CloseWindow (win);
		}
	CloseScreen (scr);
	}

return (0);
}


Falls es doch eine Shell sein soll, hier ein etwas aufwändigeres Beispiel:

code:
#include <proto/dos.h>
#include <proto/intuition.h>
#include <stdio.h>

int main (void)

{
struct Screen *scr;
struct Window *win1,*win2;
BPTR console;
char buffer[80];

if (scr = OpenScreenTags (NULL,
		SA_LikeWorkbench,TRUE,
		SA_Title,"Application Screen",
		TAG_END))
	{
	if (win1 = OpenWindowTags (NULL,
			WA_Height,scr->Height / 2 - scr->BarHeight - 1,
			WA_CustomScreen,scr,
			WA_Title,"Application Window",
			TAG_END))
		{
		if (win2 = OpenWindowTags (NULL,
				WA_Top,scr->Height / 2,
				WA_Height,scr->Height / 2,
				WA_CustomScreen,scr,
				WA_Title,"Console Window",
				WA_Activate,TRUE,
				TAG_END))
			{
			sprintf (buffer,"con://///window %08lx",win2);
			if (console = Open (buffer,MODE_NEWFILE))
				{
				FPrintf (console,"Please enter EndCLI to close the window.n");
				Execute ("",console,(BPTR)0);
				Close (console);
				}
			else
				CloseWindow (win2);
			}
		CloseWindow (win1);
		}
	CloseScreen (scr);
	}

return (0);
}


Gruß Thomas

--
Email: thomas-rapp@web.de
Home: thomas-rapp.homepage.t-online.de/

[ - Answer - Quote - Direct link - ]

2008-11-18, 17:22 h

Der_Wanderer
Posts: 1229
User
Sehr schön, Danke! Kann ich der Console jetzt noch sagen, wo sich ihre Koordinaten befinden, wenn sie nicht das ganze Fenster bedecken soll? Kann man die Koordinaten zur Lebenszeit der Console noch ändern, z.B. wenn das Fenster gesized wird?

Nachtrag:
Warum öffnest du im zweiten Beispiel zwei Fenster?

--
Thilo Köhler, Author von:
HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, TK AB3 Includes und viele mehr...
Homepage: http://www.hd-rec.de



[ Dieser Beitrag wurde von Der_Wanderer am 18.11.2008 um 17:24 Uhr geändert. ]

[ - Answer - Quote - Direct link - ]

2008-11-18, 17:46 h

thomas
Posts: 7721
User
Zitat:
Kann ich der Console jetzt noch sagen, wo sich ihre Koordinaten befinden, wenn sie nicht das ganze Fenster bedecken soll?

Nicht, daß ich wüßte.


Zitat:
Warum öffnest du im zweiten Beispiel zwei Fenster?

Genau aus dem Grund, daß die Konsole das ganze Fenster einnimmt. Das zweite Fenster ist für die GUI.

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: thomas-rapp.homepage.t-online.de/

[ - Answer - Quote - Direct link - ]

2008-11-19, 09:32 h

Holger
Posts: 8116
User
Zitat:
Original von Der_Wanderer:
Sehr schön, Danke! Kann ich der Console jetzt noch sagen, wo sich ihre Koordinaten befinden, wenn sie nicht das ganze Fenster bedecken soll? Kann man die Koordinaten zur Lebenszeit der Console noch ändern, z.B. wenn das Fenster gesized wird?

Ja, Du kannst ANSI-Steuerungssequenzen benutzen, um der Konsole einen Bereich zuzuweisen. Allerdings ist es so, dass die Eingabeverarbeitung durch eine Konsole beeinflusst wird, und die Verwendung eines zweiten Fensters wahrscheinlich einfacher zu programmieren ist.

Wenn es nur darum geht Output anzuzeigen, kann man die Eingabeverarbeitung der Konsole unterdrücken und hat mit der eigenen keine Probleme. Allerdings stellt sich dann die Frage, ob es nicht sinnvoller wäre, die Ausgabe der CLI-Tools in eine Pipe umzuleiten und selbst darzustellen (das geht natürlich auch unter Verwendung des console.device). Das hätte den Vorteil, dass man den Inhalt kennt und somit auch das nachträgliche Abspeichern des Outputs (gerade bei eine IDE und Fehlermeldungen sinnvoll) anbieten kann. Statt eine Pipe zu verwenden könnte man auch einen eigenen DOS-Handler schreiben, das wäre gar nicht mal so viel komplizierter.

Ach ja, die Steuerungssequenzen habe ich natürlich nicht im Kopf. Ich poste sie bei Gelegenheit, wenn Du Interesse hast.

mfg

--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Answer - Quote - Direct link - ]

2008-11-19, 14:19 h

Der_Wanderer
Posts: 1229
User
Ich dachte, wenn es schon eine Console gibt, warum nicht nutzen.
Ich baue gerade eine GUI Toolkit und dachte, ein "Console" Widget wäre cool, wo man alles mögliche ausgeben kann, gerade für eine IDE GUI ist das praktisch, aber auch für Dinge wie eine Encoder GUI für LAME, sodass man den Output des jewieligen CLI Tools sehen kann.
Eine eigene Implementierung hat natürlich Vorteile, z.B. kann man die History bestimmen, Text abspeichern etc., aber man bekommt sie nicht für "lau", so wie in den Source Beispielen oben.

Danke für die Hinweise.



--
Thilo Köhler, Author von:
HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, TK AB3 Includes und viele mehr...
Homepage: http://www.hd-rec.de


[ - Answer - Quote - Direct link - ]

2008-11-19, 20:04 h

Holger
Posts: 8116
User
Das hängt davon ab, wieviel man haben will. Deshalb ja auch die Frage, ob es nur um Ausgabe geht. Die Implementierung einer Ausgabe ist nicht so kompliziert, da man im Prinzip nur die Daten der Anwendungen entgegennimmt und an das console.device weiterreicht (mit optionalem Speichern).

Erst bei der Eingabe wird es kompliziert, aber auch interessant, weil die Standard-Konsole ja gar nicht so komfortabel ist.

mfg

--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Answer - Quote - Direct link - ]

2008-11-19, 22:10 h

Holger
Posts: 8116
User
Der Konsolebereich kann wie folgt gesetzt werden:

<CSI>linksx<CSI>obeny<CSI>breiteu<CSI>höhet

Wobei <CSI> wahlweise durch Zeichen 0x9b (Escape mit gesetztem höchsten Bit) oder durch die Zeichenfolge <ESC>[ (Escape gefolgt von öffnender eckigen Klammer) abgebildet werden kann.

Die Koordinaten für links und oben sind in Pixel, die Breite und Höhe dagegen in Zeichen.

Die vier Eigenschaften können auch unabhängig voneinander gesetzt werden. (Sind vier einzelne Steuerungssequenzen)

mfg

--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Answer - Quote - Direct link - ]

2008-11-20, 09:50 h

Der_Wanderer
Posts: 1229
User
Das ist cool. Vielleicht probiere ich dann doch mal eine echte Shell. Wie kann ich die Shell initial setzen? Mit den Parametern beim öffnen, die normalerweise die Fesnter größe angeben?
--
Thilo Köhler, Author von:
HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, TK AB3 Includes und viele mehr...
Homepage: http://www.hd-rec.de


[ - Answer - Quote - Direct link - ]

2008-11-20, 18:05 h

Holger
Posts: 8116
User
Zitat:
Original von Der_Wanderer:
Das ist cool. Vielleicht probiere ich dann doch mal eine echte Shell. Wie kann ich die Shell initial setzen? Mit den Parametern beim öffnen, die normalerweise die Fesnter größe angeben?

Die Steuerungssequenz wird wie normaler Text in die Konsole geschrieben. Danach startest Du eine Shell unter Verwendung Deiner Konsole.

mfg

--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Answer - Quote - Direct link - ]


-1- [ - Post reply - ]


amiga-news.de Forum > Programmierung > Shell in Window? [ - Search - New posts - Register - Login - ]


.
Masthead | Privacy policy | Netiquette | Advertising | Contact
Copyright © 1998-2025 by amiga-news.de - all rights reserved.
.