红联Linux门户
Linux帮助

Ubuntu14.04下Sublime text2解压版无法启用fcitx中文输入法的问

发布时间:2016-03-05 09:53:26来源:linux网站作者:bellovin

环境:

ubuntu 14.04 x64

fcitx五笔拼音输入法

sublime text 2

sublime text的中文输入法问题网上很多解决办法,用来用去都无法实现,后来发现原来是因为本地用的是解压版,没有创建快捷方式,导致启动时引导不上输入法,记录如下:


1、保存以下代码为“sublime-imfix.c”

/*
sublime-imfix.c
Use LD_PRELOAD to interpose some function to fix sublime input method support for linux.
By Cjacker Huang

gcc -shared -o libsublime-imfix.so sublime-imfix.c `pkg-config --libs --cflags gtk+-2.0` -fPIC
LD_PRELOAD=./libsublime-imfix.so subl
*/ 
#include <gtk/gtk.h> 
#include <gdk/gdkx.h> 
typedef GdkSegment GdkRegionBox; 

struct _GdkRegion 

long size; 
long numRects; 
GdkRegionBox *rects; 
GdkRegionBox extents; 
}; 

GtkIMContext *local_context; 

void 
gdk_region_get_clipbox (const GdkRegion *region, 
GdkRectangle*rectangle) 

g_return_if_fail (region != NULL); 
g_return_if_fail (rectangle != NULL); 
rectangle->x = region->extents.x1; 
rectangle->y = region->extents.y1; 
rectangle->width = region->extents.x2 - region->extents.x1; 
rectangle->height = region->extents.y2 - region->extents.y1; 
GdkRectangle rect; 
rect.x = rectangle->x; 
rect.y = rectangle->y; 
rect.width = 0; 
rect.height = rectangle->height; 
//The caret width is 2; 
//Maybe sometimes we will make a mistake, but for most of the time, it should be the caret. 
if(rectangle->width == 2 && GTK_IS_IM_CONTEXT(local_context)) { 
gtk_im_context_set_cursor_location(local_context, rectangle); 

//this is needed, for example, if you input something in file dialog and return back the edit area 
//context will lost, so here we set it again. 
 
static GdkFilterReturn event_filter (GdkXEvent *xevent, GdkEvent *event, gpointer im_context) 

XEvent *xev = (XEvent *)xevent; 
if(xev->type == KeyRelease && GTK_IS_IM_CONTEXT(im_context)) { 
GdkWindow * win = g_object_get_data(G_OBJECT(im_context),"window"); 
if(GDK_IS_WINDOW(win)) 
gtk_im_context_set_client_window(im_context, win); 

return GDK_FILTER_CONTINUE; 

void gtk_im_context_set_client_window (GtkIMContext *context, 
GdkWindow*window) 

GtkIMContextClass *klass; 
g_return_if_fail (GTK_IS_IM_CONTEXT (context)); 
klass = GTK_IM_CONTEXT_GET_CLASS (context); 
if (klass->set_client_window) 
klass->set_client_window (context, window); 

if(!GDK_IS_WINDOW (window)) 
return; 
g_object_set_data(G_OBJECT(context),"window",window); 
int width = gdk_window_get_width(window); 
int height = gdk_window_get_height(window); 
if(width != 0 && height !=0) { 
gtk_im_context_focus_in(context); 
local_context = context; 

gdk_window_add_filter (window, event_filter, context); 


2、安装 C/C++ 的编译环境和 gtk libgtk2.0-dev

sudo apt-get install build-essential 
sudo apt-get install libgtk2.0-dev 


3、编译共享内库,生成“libsublime-imfix.so”,把生成的so文件放到sublime根目录

gcc -shared -o libsublime-imfix.so sublime-imfix.c `pkg-config --libs --cflags gtk+-2.0` -fPIC 


4、修改 /usr/bin/subl 为

#!/bin/sh 

export LD_PRELOAD=/opt/sublime_text/libsublime-imfix.so 
exec /opt/sublime_text/sublime_text "$@" 


5、新增“/usr/share/applications/sublime_text.desktop”

[Desktop Entry] 
Version=1.0 
Type=Application 
Name=Sublime_Text 
GenericName=Text Editor 
Comment=Sophisticated text editor for code, markup and prose 
Exec=bash -c 'LD_PRELOAD=/opt/sublime_text/libsublime-imfix.so exec /opt/sublime_text/sublime_text %F' 
Terminal=false 
MimeType=text/plain; 
Icon=/opt/sublime_text/Icon/256x256/sublime_text.png 
Categories=TextEditor;Development;Utility; 
StartupNotify=true 
Actions=Window;Document; 
X-Desktop-File-Install-Version=0.22 

[Desktop Action Window] 
Name=New Window 
Exec=bash -c 'LD_PRELOAD=/opt/sublime_text/libsublime-imfix.so exec /opt/sublime_text/sublime_text -n' 
OnlyShowIn=Unity; 

[Desktop Action Document] 
Name=New File 
Exec=bash -c 'LD_PRELOAD=/opt/sublime_text/libsublime-imfix.so exec /opt/sublime_text/sublime_text --command new_file' 
OnlyShowIn=Unity; 


6、重启。


本文永久更新地址:http://www.linuxdiyf.com/linux/18626.html