diff --git a/src/conio/ciolib.c b/src/conio/ciolib.c index 66c1230376a328a2e7ba723f1d6aa0cdc8ed8792..c545477e2f092b6fd8fe36fbb1eebcdc765463e7 100644 --- a/src/conio/ciolib.c +++ b/src/conio/ciolib.c @@ -169,6 +169,7 @@ int try_x_init(int mode) cio_api.settitle=x_settitle; cio_api.copytext=x_copytext; cio_api.getcliptext=x_getcliptext; + cio_api.setfont=x_setfont; return(1); } return(0); diff --git a/src/conio/console.c b/src/conio/console.c index 88e63e43a1f178587fe0b31e41cbf8ad1a807e70..bf3f9ab725d8393008cd6214f5e44ec377520878 100644 --- a/src/conio/console.c +++ b/src/conio/console.c @@ -129,6 +129,10 @@ sem_t console_mode_changed; sem_t copybuf_set; sem_t pastebuf_set; sem_t pastebuf_request; +sem_t font_set; +int new_font; +int font_force; +int setfont_return; pthread_mutex_t copybuf_mutex; pthread_mutex_t lines_mutex; char *copybuf=NULL; @@ -1118,6 +1122,32 @@ video_async_event(void *crap) case 0: if(console_new_mode!=NO_NEW_MODE) init_mode(console_new_mode); + if(x_current_font!=new_font) { + int oldfont=x_current_font; + x_current_font=new_font; + if(load_font(NULL,FW,FH,FontScale)) { + if(font_force) { + init_mode(3); + sem_wait(&console_mode_changed); + if(load_font(NULL,FW,FH,FontScale)) { + setfont_return=-1; + x_current_font=oldfont; + load_font(NULL,FW,FH,FontScale); + } + else + setfont_return=0; + } + else { + setfont_return=-1; + x_current_font=oldfont; + load_font(NULL,FW,FH,FontScale); + } + } + else + setfont_return=0; + resize_window(); + sem_post(&font_set); + } while(!sem_trywait(&x11_beep)) x11.XBell(dpy, 0); if(!sem_trywait(&x11_name)) @@ -1314,6 +1344,7 @@ load_font(char *filename, int width, int height, int scale) } if(conio_fontdata[i].desc==NULL) x_current_font=0; + new_font=x_current_font; } if(conio_fontdata[x_current_font].desc==NULL) return(-1); @@ -1356,12 +1387,11 @@ load_font(char *filename, int width, int height, int scale) | ((fontdata[i*height+j] & 0x01) << 7); } } - if(pfnt!=0) x11.XFreePixmap(dpy,pfnt); - scaledfont=scale_bitmap(font, FW, FH*256, &FontScale); + scaledfont=scale_bitmap(fontdata, FW, FH*256, &FontScale); if(scaledfont==NULL) - pfnt=x11.XCreateBitmapFromData(dpy, win, font, FW, FH*256); + pfnt=x11.XCreateBitmapFromData(dpy, win, fontdata, FW, FH*256); else { FW*=scale; FH*=scale; @@ -1662,6 +1692,7 @@ console_init() sem_init(&x11_beep,0,0); sem_init(&x11_title,0,0); sem_init(&x11_name,0,0); + sem_init(&font_set,0,0); pthread_mutex_init(©buf_mutex, NULL); pthread_mutex_init(&lines_mutex, NULL); diff --git a/src/conio/console.h b/src/conio/console.h index c15a0a73a375212b63ee238112be723ffc076d2d..5d8c475267e021508fa552a414afca5ef515f59c 100644 --- a/src/conio/console.h +++ b/src/conio/console.h @@ -49,6 +49,10 @@ extern sem_t console_mode_changed; extern sem_t copybuf_set; extern sem_t pastebuf_request; extern sem_t pastebuf_set; +extern sem_t font_set; +extern int new_font; +extern int font_force; +extern int setfont_return; extern pthread_mutex_t copybuf_mutex; extern char *copybuf; extern char *pastebuf; diff --git a/src/conio/x_cio.c b/src/conio/x_cio.c index 4188ed56ab624df06db3175f9eef6a51fdd73722..6cec69c533be63222579ac663d836a259d666cd9 100644 --- a/src/conio/x_cio.c +++ b/src/conio/x_cio.c @@ -317,3 +317,11 @@ char *x_getcliptext(void) sem_post(&pastebuf_request); return(ret); } + +int x_setfont(int font, int force) +{ + font_force=force; + new_font=font; + sem_wait(&font_set); + return(setfont_return); +} diff --git a/src/conio/x_cio.h b/src/conio/x_cio.h index 0af06fb9c3c1eddd6c7588e11cafddf1643917e4..e1015604748f8faef5f197449403ec90f3588dc3 100644 --- a/src/conio/x_cio.h +++ b/src/conio/x_cio.h @@ -65,6 +65,7 @@ void x_setname(const char *name); void x_settitle(const char *title); void x_copytext(const char *text, size_t buflen); char *x_getcliptext(void); +int x_setfont(int font, int force); #ifdef __cplusplus } #endif