From 1b0631792479411d34e7ee37e190c4cb2b55bdaa Mon Sep 17 00:00:00 2001 From: Yves Rizoud Date: Wed, 20 May 2009 00:11:32 +0000 Subject: [PATCH] Fix issue 165: MS Windows no longer opens the program window at arbitrary (wrong) position, it restores instead the last position you used. git-svn-id: svn://pulkomandy.tk/GrafX2/trunk@810 416bcca6-2ee7-4201-b75f-2eb2f807beb1 --- gfx2def.ini | 4 ++++ graph.c | 3 ++- main.c | 36 ++++++++++++++++++++++++++++++++++++ readini.c | 41 ++++++++++++++++++++++++++++++----------- saveini.c | 5 +++++ struct.h | 2 ++ 6 files changed, 79 insertions(+), 12 deletions(-) diff --git a/gfx2def.ini b/gfx2def.ini index 7db8a8a3..d10330a9 100644 --- a/gfx2def.ini +++ b/gfx2def.ini @@ -329,4 +329,8 @@ ; Palette_vertical = NO; (Default NO) + ; The program remembers the last window position, if the + ; OS isn't able to do it by itself. (ie: Windows) + Window_position = 9999,9999; (Default 9999,9999 which means: NA) + ; end of configuration diff --git a/graph.c b/graph.c index 5fe97e0b..406eed2a 100644 --- a/graph.c +++ b/graph.c @@ -533,7 +533,8 @@ int Init_mode_video(int width, int height, int fullscreen, int pix_ratio) Mouse_Y=absolute_mouse_y/Pixel_height; if (Mouse_Y>=Screen_height) Mouse_Y=Screen_height-1; - Set_mouse_position(); + if (fullscreen) + Set_mouse_position(); Spare_offset_X=0; // | Il faut penser à éviter les incohérences Spare_offset_Y=0; // |- de décalage du brouillon par rapport à diff --git a/main.c b/main.c index 4af8f310..8410089f 100644 --- a/main.c +++ b/main.c @@ -28,6 +28,7 @@ #include #include #include +#include #include "const.h" #include "struct.h" @@ -577,6 +578,22 @@ int Init_program(int argc,char * argv[]) Video_mode[starting_videomode].Fullscreen, Pixel_ratio); + // Windows only: move back the window to its original position. + #if defined(__WIN32__) + if (!Video_mode[starting_videomode].Fullscreen) + { + if (Config.Window_pos_x != 9999 && Config.Window_pos_y != 9999) + { + //RECT r; + static SDL_SysWMinfo pInfo; + SDL_VERSION(&pInfo.version); + SDL_GetWMInfo(&pInfo); + //GetWindowRect(pInfo.window, &r); + SetWindowPos(pInfo.window, 0, Config.Window_pos_x, Config.Window_pos_y, 0, 0, SWP_NOSIZE); + } + } + #endif + Main_image_width=Screen_width/Pixel_width; Main_image_height=Screen_height/Pixel_height; Spare_image_width=Screen_width/Pixel_width; @@ -635,6 +652,25 @@ void Program_shutdown(void) { int return_code; + // Windows only: Recover the window position. + #if defined(__WIN32__) + { + RECT r; + static SDL_SysWMinfo pInfo; + + SDL_GetWMInfo(&pInfo); + GetWindowRect(pInfo.window, &r); + + Config.Window_pos_x = r.left; + Config.Window_pos_y = r.top; + } + #else + // All other targets: irrelevant dimensions. + // Do not attempt to force them back on next program run. + Config.Window_pos_x = 9999; + Config.Window_pos_y = 9999; + #endif + // On libère le buffer de gestion de lignes free(Horizontal_line_buffer); diff --git a/readini.c b/readini.c index 12e6033b..4220de73 100644 --- a/readini.c +++ b/readini.c @@ -199,6 +199,8 @@ int Load_INI_get_string(FILE * file,char * buffer,char * option_name,char * retu int Load_INI_get_value(char * str,int * index,int * value) { + int negative = 0; + // On teste si la valeur actuelle est YES (ou Y): if (Load_INI_seek_pattern(str+(*index),"yes,")==1) @@ -207,59 +209,51 @@ int Load_INI_get_value(char * str,int * index,int * value) (*index)+=4; return 0; } - else if (strcmp(str+(*index),"yes")==0) { (*value)=1; (*index)+=3; return 0; } - else if (Load_INI_seek_pattern(str+(*index),"y,")==1) { (*value)=1; (*index)+=2; return 0; } - else if (strcmp(str+(*index),"y")==0) { (*value)=1; (*index)+=1; return 0; } - else - + // On teste si la valeur actuelle est NO (ou N): - + if (Load_INI_seek_pattern(str+(*index),"no,")==1) { (*value)=0; (*index)+=3; return 0; } - else if (strcmp(str+(*index),"no")==0) { (*value)=0; (*index)+=2; return 0; } - else if (Load_INI_seek_pattern(str+(*index),"n,")==1) { (*value)=0; (*index)+=2; return 0; } - else if (strcmp(str+(*index),"n")==0) { (*value)=0; (*index)+=1; return 0; } - else if (str[*index]=='$') { (*value)=0; @@ -286,7 +280,13 @@ int Load_INI_get_value(char * str,int * index,int * value) return ERROR_INI_CORRUPTED; } } - else + if (str[*index]=='-') + { + negative = 1; + // next character + (*index)++; + // Fall thru + } if ((str[*index]>='0') && (str[*index]<='9')) { (*value)=0; @@ -294,7 +294,15 @@ int Load_INI_get_value(char * str,int * index,int * value) for (;;) { if ((str[*index]>='0') && (str[*index]<='9')) + { (*value)=((*value)*10)+str[*index]-'0'; + if (negative) + { + (*value)*= -1; + // This is to do it once per number. + negative = 0; + } + } else if (str[*index]==',') { @@ -772,6 +780,17 @@ int Load_INI(T_Config * conf) goto Erreur_ERREUR_INI_CORROMPU; conf->Palette_vertical=values[0]; } + + // Optional, the window position (>98.0%) + conf->Window_pos_x=9999; + conf->Window_pos_y=9999; + if (!Load_INI_get_values (file,buffer,"Window_position",2,values)) + { + conf->Window_pos_x = values[0]; + conf->Window_pos_y = values[1]; + } + + fclose(file); free(filename); diff --git a/saveini.c b/saveini.c index f4833f7e..fb9c928b 100644 --- a/saveini.c +++ b/saveini.c @@ -630,6 +630,11 @@ int Save_INI(T_Config * conf) if ((return_code=Save_INI_set_values (Ancien_fichier,Nouveau_fichier,buffer,"Palette_vertical",1,values,1))) goto Erreur_Retour; + values[0]=conf->Window_pos_x; + values[1]=conf->Window_pos_y; + if ((return_code=Save_INI_set_values (Ancien_fichier,Nouveau_fichier,buffer,"Window_position",2,values,0))) + goto Erreur_Retour; + Save_INI_flush(Ancien_fichier,Nouveau_fichier,buffer); diff --git a/struct.h b/struct.h index cd653f36..81f26b0d 100644 --- a/struct.h +++ b/struct.h @@ -267,6 +267,8 @@ typedef struct byte Default_resolution; ///< Default video mode to use on startup. Index in ::Video_mode. char *Bookmark_directory[NB_BOOKMARKS];///< Bookmarked directories in fileselectors: This is the full dierctory name. char Bookmark_label[NB_BOOKMARKS][8+1];///< Bookmarked directories in fileselectors: This is the displayed name. + int Window_pos_x; ///< Last window x position (9999 if unsupportd/irrelevant for the platform) + int Window_pos_y; ///< Last window y position (9999 if unsupportd/irrelevant for the platform) } T_Config; // Structures utilisées pour les descriptions de pages et de liste de pages.