fix linebraks when copy DBCS text

This commit is contained in:
Wengier
2021-11-16 04:08:27 -05:00
parent be6c103e66
commit 3a018d80cc
3 changed files with 52 additions and 31 deletions

View File

@@ -76,6 +76,8 @@
- Fixed possible crash with printing. (jamesbond3142)
- Fixed possible freeze when shutting down Windows 9x
after changing a CD image from the menu. (Wengier)
- Fixed linebreaks when copying text from a DBCS code
page in the TTF output. (Wengier)
- Fixed TTF color issue with some DOS GUI programs by
initializing the color scheme when with default
COLORS= setting in EGA or VGA mode. (Wengier)

View File

@@ -9309,34 +9309,8 @@ void PasteClipboard(bool bPressed) {
#endif
#endif
#if defined(C_SDL2) || defined(MACOSX)
bool CodePageGuestToHostUTF8(char *d/*CROSS_LEN*/,const char *s/*CROSS_LEN*/);
void CopyClipboard(int all) {
uint16_t len=0;
char* text = (char *)(all==2?Mouse_GetSelected(0,0,currentWindowWidth-1-sdl.clip.x,currentWindowHeight-1-sdl.clip.y,(int)(currentWindowWidth-sdl.clip.x),(int)(currentWindowHeight-sdl.clip.y), &len):(all==1?Mouse_GetSelected(selscol, selsrow, selecol, selerow, -1, -1, &len):Mouse_GetSelected(mouse_start_x-sdl.clip.x,mouse_start_y-sdl.clip.y,mouse_end_x-sdl.clip.x,mouse_end_y-sdl.clip.y,sdl.clip.w,sdl.clip.h, &len)));
unsigned int k=0;
for (unsigned int i=0; i<len; i++)
if (text[i]&&text[i]!=13)
text[k++]=text[i];
text[k]=0;
std::string result="";
std::istringstream iss(text);
char temp[4096];
for (std::string token; std::getline(iss, token); ) {
if (CodePageGuestToHostUTF8(temp,token.c_str()))
result+=temp+std::string(1, 10);
else
result+=token+std::string(1, 10);
}
if (result.size()&&result.back()==10) result.pop_back();
#if defined(C_SDL2)
SDL_SetClipboardText(result.c_str());
#else
SetClipboard(result);
#endif
}
#elif defined (WIN32)
void CopyClipboard(int all) {
#ifdef WIN32
void CopyClipboardW(int all) {
uint16_t len=0;
const char* text = (char *)(all==2?Mouse_GetSelected(0,0,(int)(currentWindowWidth-1-sdl.clip.x),(int)(currentWindowHeight-1-sdl.clip.y),(int)(currentWindowWidth-sdl.clip.x),(int)(currentWindowHeight-sdl.clip.y), &len):(all==1?Mouse_GetSelected(selscol, selsrow, selecol, selerow, -1, -1, &len):Mouse_GetSelected(mouse_start_x-sdl.clip.x,mouse_start_y-sdl.clip.y,mouse_end_x-sdl.clip.x,mouse_end_y-sdl.clip.y,sdl.clip.w,sdl.clip.h, &len)));
if (OpenClipboard(NULL)&&EmptyClipboard()) {
@@ -9352,9 +9326,7 @@ void CopyClipboard(int all) {
CloseClipboard();
}
}
#endif
#ifdef WIN32
static BOOL WINAPI ConsoleEventHandler(DWORD event) {
switch (event) {
case CTRL_SHUTDOWN_EVENT:
@@ -9370,6 +9342,47 @@ static BOOL WINAPI ConsoleEventHandler(DWORD event) {
}
#endif
#if defined(C_SDL2) || defined(MACOSX)
bool CodePageGuestToHostUTF8(char *d/*CROSS_LEN*/,const char *s/*CROSS_LEN*/);
void CopyClipboard(int all) {
#ifdef WIN32
if (dos.loaded_codepage != 950 || !chinasea) {
CopyClipboardW(all);
return;
}
#endif
uint16_t len=0;
char* text = (char *)(all==2?Mouse_GetSelected(0,0,currentWindowWidth-1-sdl.clip.x,currentWindowHeight-1-sdl.clip.y,(int)(currentWindowWidth-sdl.clip.x),(int)(currentWindowHeight-sdl.clip.y), &len):(all==1?Mouse_GetSelected(selscol, selsrow, selecol, selerow, -1, -1, &len):Mouse_GetSelected(mouse_start_x-sdl.clip.x,mouse_start_y-sdl.clip.y,mouse_end_x-sdl.clip.x,mouse_end_y-sdl.clip.y,sdl.clip.w,sdl.clip.h, &len)));
#ifndef WIN32
unsigned int k=0;
for (unsigned int i=0; i<len; i++)
if (text[i]&&text[i]!=13)
text[k++]=text[i];
text[k]=0;
#endif
std::string result="";
std::istringstream iss(text);
char temp[4096];
for (std::string token; std::getline(iss, token); ) {
if (CodePageGuestToHostUTF8(temp,token.c_str()))
result+=temp;
else
result+=token;
result+=std::string(1, 10);
}
if (result.size()&&result.back()==10) result.pop_back();
#if defined(C_SDL2)
SDL_SetClipboardText(result.c_str());
#else
SetClipboard(result);
#endif
}
#elif defined (WIN32)
void CopyClipboard(int all) {
CopyClipboardW(all);
}
#endif
void PasteClipStop(bool bPressed) {
if (!bPressed) return;
strPasteBuffer = "";

View File

@@ -766,7 +766,7 @@ const char* Mouse_GetSelected(int x1, int y1, int x2, int y2, int w, int h, uint
if (ttfuse&&isDBCSCP()&&dbcs_sbcs&&!(c1==0&&c2==(int)(ttf.cols-1)&&r1==0&&r2==(int)(ttf.lins-1))) {
ttf_cell *curAC = curAttrChar;
for (unsigned int y = 0; y < ttf.lins; y++) {
if ((int)y>=r1&&(int)y<=r2)
if ((int)y>=r1&&(int)y<=r2) {
for (unsigned int x = 0; x < ttf.cols; x++)
if ((int)x>=c1&&(int)x<=c2&&curAC[rtl?ttf.cols-x-1:x].selected) {
if ((int)x==c1&&c1>0&&curAC[rtl?ttf.cols-x-1:x].skipped&&!curAC[rtl?ttf.cols-x-2:x-1].selected&&curAC[rtl?ttf.cols-x-2:x-1].doublewide) {
@@ -780,6 +780,12 @@ const char* Mouse_GetSelected(int x1, int y1, int x2, int y2, int w, int h, uint
text[len++]=result;
}
}
while (len>0&&text[len-1]==32) text[--len]=0;
if (y<r2) {
text[len++]='\r';
text[len++]='\n';
}
}
curAC += ttf.cols;
}
} else