/*sublime-imfix.cUse LD_PRELOAD to interpose some function to fix sublime input method support for linux.By Cjacker Huang <jianzhong.huang at i-soft.com.cn>gcc -shared -o libsublime-imfix.so sublime_imfix.c `pkg-config --libs --cflags gtk+-2.0` -fPICLD_PRELOAD=./libsublime-imfix.so sublime_text*/#include <gtk/gtk.h>#include <gdk/gdkx.h>typedefGdkSegmentGdkRegionBox;struct_GdkRegion{longsize;longnumRects;GdkRegionBox*rects;GdkRegionBoxextents;};GtkIMContext*local_context;voidgdk_region_get_clipbox(constGdkRegion*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;GdkRectanglerect;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.staticGdkFilterReturnevent_filter(GdkXEvent*xevent,GdkEvent*event,gpointerim_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);}returnGDK_FILTER_CONTINUE;}voidgtk_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);intwidth=gdk_window_get_width(window);intheight=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);}