Kann man die aktuelle Grafikauflösung des Videomodus herausfinden?
Hintertgrund ist, dass ich beim Starten vom GeoLadder bei zu niedriger Auflösung eine Meldung anzeigen möchte.
Kann man die aktuelle Grafikauflösung des Videomodus herausfinden?
Hintertgrund ist, dass ich beim Starten vom GeoLadder bei zu niedriger Auflösung eine Meldung anzeigen möchte.
Die korrekte Variante wäre wohl, sich vom GenSystem den DefaultScreen oder GSYI_screenComp geben zu lassen und von dem dann den Videotreiber…
Keine Ahnung, ob es auch einfacher geht.
Sehr fein und besten Dank! Lets try it
Den Handle für den Videotreiber sollte man dann zusammen mit dieser Funktion nutzen können:
extern DriverInfoStruct * /*XXX*/
_pascal GeodeInfoDriver(GeodeHandle gh);
In der Datei driver.h gibt es übrigens auch noch eine Funktion namens „GeodeGetDefaultDriver“ samt enum „GeodeDefaultDriverType“ - ggf. liefert die Dir auch einfach den aktuellen Treiber…
typedef enum /* word */ {
GDDT_FILE_SYSTEM=0,
GDDT_KEYBOARD=2,
GDDT_MOUSE=4,
GDDT_VIDEO=6,
GDDT_MEMORY_VIDEO=8,
GDDT_POWER_MANAGEMENT=10,
GDDT_TASK=12
} GeodeDefaultDriverType;
extern GeodeHandle /*XXX*/
_pascal GeodeGetDefaultDriver(GeodeDefaultDriverType type);
Danke auch Dir Jörg! Jetzt habe ich zwei Wege zum verfolgen
I think this method was used by John Howard to set the minimum resolution, width to 800, in the Spider card game. It is then possible to play the game in 800x480 and above. I think John's intention was to use 800x600, as the game works at its best in that resolution. The card game will hint you with a message that it is not possible to play in VGA (640x480).
Could it be that John doesn’t query the driver at all, but is only using a hint?
@object GenViewClass SpiderView = {
…
HINT_MINIMUM_SIZE = {
SST_PIXELS | TABLE_WIDTH,
SST_PIXELS | TABLE_HEIGHT,
0 };
}
No… there’s some more code:
@method SpiderProcessClass, MSG_GEN_PROCESS_OPEN_APPLICATION
{
DisplayScheme displayScheme;
byte displaySize;
Boolean initError;
ColorQuad tableColor;
/* make sure the screen res is at least 800x600 */
@call application::MSG_GEN_APPLICATION_GET_DISPLAY_SCHEME(&displayScheme);
displaySize = (displayScheme.DS_displayType & DT_DISP_SIZE)
>> DT_DISP_SIZE_OFFSET;
if (displaySize <= DS_STANDARD) {
UserStandardDialogOptr(0, 0, 0, 0,
@TooSmallString,
((CDT_NOTIFICATION << CDBF_DIALOG_TYPE_OFFSET) |
(GIT_NOTIFICATION << CDBF_INTERACTION_TYPE_OFFSET)));
return;
}
…
Das ist der "richtige", offizielle Weg.
I can play the Spider game on my Android phone in 848x480, so it seems that the width is mandatory, but not the height? You are right that the screen is optimal at 800x600 and above. In my phone the bottom is chopped off, but the game is still playable.
Schau mal ob du vom GenField oder GenSytem die visBounds lesen kannst. Das sollte dann die richtige Größe sein.
Ansonsten: in R-BASIC hat das jemand mal etwa so gemacht: App Maximieren und dann die Größe des Primary auslesen. Ich hab auch mal soetwas in der Art gemacht (in R-BASIC), muss ich mal Suchen ,wenn Interesse besteht.
Wenn dein GenPrimary "fullScreen" ist sollte das prinzipiell auch gehen (MSG_VIS_GET_BOUNDS <- ja, auch wenn das Primary ein GenObject ist unterstützt es alle VIS_ Messages).
Rainer
Alternativ könntest Du noch das Programm auf Fullscreen und „entirely on screen“ stellen und dann das hier aufrufen:
void WinGetWinScreenBounds(
WindowHandle win,
Rectangle * bounds);
Das machen scheinbar die Bildschirmschoner, um die Bildschirmauflösung zu bestimmen. (Ggf. werden dann noch die „Deko-Elemente“, wie z.B. die Menüleiste oder die Taskbar, abgezogen … aber Du solltest die tatsächlich nutzbare Auflösung bekommen.)
Wow, da kommen ganz viele Ideen zusammen Werde wohl etwas Zeit brauchen, all die Wege anzuschauen
Hallo zusammen
Ich glaube, es ist viel einfacher als gedacht... Ich kann einfach mit MSG_VIS_GET_BOUNDS die Anwendung befragen... Ob das so wohl gedacht ist?
Das ist die komplette Test-Funktion:
void
VideoDraw(GStateHandle gstate)
{
#define L_WORD_LENGTH "%-5u"
#define L_DWORD_LENGTH 10
#define L_TEXT_X_POSITION_1 240
static char s[L_DWORD_LENGTH + 1];
Rectangle bounds;
@call application::MSG_VIS_GET_BOUNDS(&bounds);
GrSetFont(gstate, FID_BISON, MakeWWFixed(12.0));
GrSetTextColor(gstate, CF_INDEX, C_WHITE, 0, 0);
GrDrawText(gstate, 3, 0, "Application Bounds Left [px]:", 0);
sprintf(&s, L_WORD_LENGTH, bounds.R_left);
GrDrawText(gstate, L_TEXT_X_POSITION_1, 0, &s, 0);
GrDrawText(gstate, 3, 25, "Application Bounds Right [px]:", 0);
sprintf(&s, L_WORD_LENGTH, bounds.R_right);
GrDrawText(gstate, L_TEXT_X_POSITION_1, 25, &s, L_DWORD_LENGTH);
GrDrawText(gstate, 3, 50, "Application Bounds Top [px]:", 0);
sprintf(&s, L_WORD_LENGTH, bounds.R_top);
GrDrawText(gstate, L_TEXT_X_POSITION_1, 50, &s, L_DWORD_LENGTH);
GrDrawText(gstate, 3, 75, "Application Bounds Bottom [px]:", 0);
sprintf(&s, L_WORD_LENGTH, bounds.R_bottom);
GrDrawText(gstate, L_TEXT_X_POSITION_1, 75, &s, L_DWORD_LENGTH);
}
Display More
Dass da noch GenField steht ist eher ein Unfall...
Ob das so wohl gedacht ist?
Das ist ja simpel. Cool! Ob es save (dh. vom System so gedacht und nicht nur ein temporärer Nebeneffekt) ist würde ich noch mal frehwagen fragen. Application ist ja an sich nicht sichtbar.
Was mich noch wunder nähme ist, welche Werte man unter dem Anfänger-Modus erhält. Wenn es die gleichen sind, dann sind das Werte vom GenScreen, ansonsten vom GenField. Gibt es den Anfänger-Modus eigentlich im FreeGEOS, analog zur 1.0er oder dem GlobalPC.
Habe hierzu mal ein Test-Progrämmchen anghehängt: videotest.zip
Ich würde sagen, dass man unter FreeGeos immer „advanced“ ist…
aus „gAppC.goh“:
UIInterfaceLevel GAI_appLevel = UIIL_ADVANCED;
Ist das einfach der Default oder wurde das komplett entfernt?