- 论坛徽章:
- 0
|
在X中直接支持中文的输出 不需要特殊的处理
但是
程序中要先使用
setlocale来设置当前locale 然后使用XSupportsLocale检查是不是支持当前locale
如果支持 那么使用
XCreateFontSet创建字体集 包括需要显示的内容的字体
后面就可以使用XmbDrawString或XwcDrawString了
CODE
#include
#include
#include
#include
#include
#include
#define DUMP_ERR printf
static void draw(Display *display,Window win,XFontSet fontset,GC gc);
int main()
{
Display *display;
int screennum;
int width;
int height;
Atom protocols;
int i;
const char *strdraw = “hello world”;
Window win;
GC gc;
XFontSet fontset;
// set the locale
const char *curlocale =setlocale(LC_ALL,”");
if( curlocale == NULL){
DUMP_ERR(”set locale fail\n”);
return 1;
}
DUMP_ERR(”locale is:%s\n”,curlocale);
if(!XSupportsLocale()){
DUMP_ERR(”X don’t support current locale\n”);
return 1;
}
// open display for X
display = XOpenDisplay(NULL);
if( !display ){
DUMP_ERR(”call XOpenDisplay(%s) fail\n”,XDisplayName(NULL));
return 1;
}
// get default screen
screennum = DefaultScreen(display);
width = DisplayWidth(display,screennum)/2;
height = DisplayHeight(display,screennum)/2;
// get the fontset
{
char **missing_charset_list_return;
int missing_charset_count_return;
char *def_string_return;
fontset = XCreateFontSet(display,”8x16,-*-gb2312.1980-0″,
&missing_charset_list_return,
&missing_charset_count_return,
&def_string_return);
if(missing_charset_count_return > 0){
for(i=0;i
补充
XIm开发
XIM(X输入模块)原理
XIM是为了使其它非英语国家在X中输入自己语言的办法 特别是对于双字节语言
XIM是使用一个输入服务器 为几个需要XIM输入的程序提供输入支持 每个程序申请一个XIC(X input context,x输入上下文)
XIM的开发与显示国际化一样
都需要locale被X支持
下面讲讲开发步骤
1 使用setlocale(LC_ALL,”")设置程序使用的locale为当前locale
2 使用XSupportsLocale检查是不是支持当前locale
3 使用XSetLocaleModifiers(”")从locale中读入@IM=…值 如果读入不成功那就不支持xim
4 开始X的正常编程 XOpenDisplay XCreateSimpleWindow XCreateGC 创建自己的窗口
5 使用XCreateFontSet选择程序使用的字体 注意需要的字体必须有 才能在程序中显示 (这点与xi18noutput一样)
6 调用XOpenIM连接xim服务器
7 使用XCreateIC创建输入上下文 创建时必须指定自己需要的风格 一共有四种风格 这里使用的是最简单的root风格
8 使用
XGetICValues(xic,XNFilterEvents,&im_event_mask,NULL);
XSelectInput(display,win,
ExposureMask| KeyPressMask
| StructureNotifyMask | im_event_mask);
来声明自己对XIM的事件也需要处理
9
XSetICFocus(xic); 把输入法窗口显示到最前
// show window
XMapWindow(display,win); 显示窗口
10 在事件循环中
XNextEvent(display,&event); //得到事件
if(XFilterEvent(&event,None)) continue; // 判断这个事件是不是xim会处理 如果xim没有处理 那返回false 程序处理这个事件
11 处理按键事件 使用 XwcLookupString查找刚才输入的内容
case KeyPress:
{
wchar_t buffer[1024];
Status status;
KeySym keysym;
int len = XwcLookupString(xic, &event, buffer, sizeof(buffer)/sizeof(wchar_t)-1,
&keysym, &status);
// use xwc should better,delete will be very easy
Bool redraw = False;
status指示当前状态 一共有四个
XLookupNone 没有状态
XLookupKeySym 查找按键输入状态
XLookupChars 查找字符状态
XLookupBoth 查找XLookupChars 和 XLookupKeySym
对这四个事件分别进行处理
具体看代码
xim就这样简单
下面是例子
CODE
#include
#include
#include
#include
#include
#include
#include
#define DUMP_ERR printf
static void draw(Display *display,Window win,XFontSet fontset,GC gc,const wchar_t*buf);
int main()
{
Display *display;
int screennum;
int width;
int height;
Atom protocols;
int i;
wchar_t strinput[1024]; // keep string in
Window win;
GC gc;
XIM xim;
XIC xic;
XFontSet fontset;
memset(strinput,0,sizeof(strinput));
// set the locale
const char *curlocale =setlocale(LC_ALL,"");
if( curlocale == NULL){
DUMP_ERR("set locale fail\n");
return 1;
}
DUMP_ERR("locale is:%s\n",curlocale);
if(!XSupportsLocale()){
DUMP_ERR("X don't support current locale\n");
return 1;
}
if(XSetLocaleModifiers("") == NULL)
DUMP_ERR("set locale modifiers fail,can't use XIM\n");
// open display for X
display = XOpenDisplay(NULL);
if( !display ){
DUMP_ERR("call XOpenDisplay(%s) fail\n",XDisplayName(NULL));
return 1;
}
// get the fontset
{
char **missing_charset_list_return;
int missing_charset_count_return;
char *def_string_return;
fontset = XCreateFontSet(display,"8x16,-*-gb2312.1980-0",
&missing_charset_list_return,
&missing_charset_count_return,
&def_string_return);
if(missing_charset_count_return > 0){
for(i=0;i
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/53499/showart_438238.html |
|