diff --git a/fcitx.spec b/fcitx.spec index b35c210..3a7bb04 100644 --- a/fcitx.spec +++ b/fcitx.spec @@ -3,14 +3,18 @@ Name: fcitx Summary: Free Chinese Input Toy for X (XIM) Version: 4.0.1 -Release: 2%{?dist} +Release: 3%{?dist} License: GPLv2+ Group: User Interface/Desktops URL: http://code.google.com/p/%{name}/ Source0: http://%{name}.googlecode.com/files/%{name}-%{version}_all.tar.gz Source1: xinput-%{name} +Patch0: gnome3-tray-fix.patch +Patch1: gnome3-mainwindow-pos-walkaround.patch +# These two patches are provide by Weng Xuetian, who is fcitx's author. BuildRequires: pango-devel dbus-devel -BuildRequires: wget intltool chrpath +BuildRequires: wget intltool chrpath sysconftool +BuildRequires: automake, autoconf, libtool Requires: %{name}-libs = %{version}-%{release} Requires: imsettings Requires(post): %{_sbindir}/alternatives @@ -40,8 +44,11 @@ developing programs using FCITX libraries. %prep %setup -q +%patch0 -p1 +%patch1 -p1 %build +./autogen.sh %configure --disable-static \ --enable-dbus \ --enable-tray @@ -117,12 +124,13 @@ fi %{_includedir}/fcitx* %changelog +* Sun Jul 03 2011 Liang Suilong - 4.0.1-3 +- Support GNOME 3 tray icon +- Fix that main window is covered by GNOME Shell + * Tue Feb 08 2011 Fedora Release Engineering - 4.0.1-2 - Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild -* Fri Dec 17 2010 Liang Suilong - 4.0.1-1 -- Update to 4.0.1 - * Fri Nov 19 2010 Chen Lei - 4.0.0-1 - Update to 4.0.0 diff --git a/gnome3-mainwindow-pos-walkaround.patch b/gnome3-mainwindow-pos-walkaround.patch new file mode 100644 index 0000000..b54b779 --- /dev/null +++ b/gnome3-mainwindow-pos-walkaround.patch @@ -0,0 +1,12 @@ +diff -r e9b9346cfabf data/profile.desc +--- a/data/profile.desc Fri Dec 17 14:06:14 2010 +0800 ++++ b/data/profile.desc Sat Jul 02 00:25:48 2011 +0800 +@@ -6,7 +6,7 @@ + [Profile/MainWindowOffsetY] + Description=Main Window Position Y + Type=Integer +-DefaultValue=1 ++DefaultValue=40 + + [Profile/InputWindowOffsetX] + Description=Input Window Position X diff --git a/gnome3-tray-fix.patch b/gnome3-tray-fix.patch new file mode 100644 index 0000000..1d69c29 --- /dev/null +++ b/gnome3-tray-fix.patch @@ -0,0 +1,366 @@ +diff -r e9b9346cfabf -r b8f3463f19b5 ChangeLog +--- a/ChangeLog Fri Dec 17 14:06:14 2010 +0800 ++++ b/ChangeLog Wed Apr 27 13:36:00 2011 +0800 +@@ -1,3 +1,7 @@ ++2011-04-27: CSSlayer ++ * 修复txt2mb在64位系统下的一个bug ++ * 参考Freedesktop.org WM-Spec尝试解决GNOME3窗口显示相关的问题(未验证) ++ + 2010-12-16: CSSlayer + * 增加man + * 移除pdf和odt格式的文档,以后fcitx-handbook将分开发布。 +diff -r e9b9346cfabf -r b8f3463f19b5 configure.in +--- a/configure.in Fri Dec 17 14:06:14 2010 +0800 ++++ b/configure.in Wed Apr 27 13:36:00 2011 +0800 +@@ -29,6 +29,10 @@ + AC_MSG_CHECKING([host platform characteristics]) + + case "$host" in ++ *-*-*kfreebsd*) ++ HOST_LIBS="-ldl -lpthread" ++ md5prog=md5sum ++ ;; + *-*-*freebsd*) + HOST_LIBS="-lexecinfo -pthread" + md5prog=gmd5sum +@@ -37,6 +41,10 @@ + HOST_LIBS="-ldl -lpthread" + md5prog=md5sum + ;; ++ *-*-gnu*) ++ HOST_LIBS="-ldl -lpthread" ++ md5prog=md5sum ++ ;; + esac + + AC_SUBST(HOST_LIBS) +diff -r e9b9346cfabf -r b8f3463f19b5 doc/man/createPYMB.1 +--- a/doc/man/createPYMB.1 Fri Dec 17 14:06:14 2010 +0800 ++++ b/doc/man/createPYMB.1 Wed Apr 27 13:36:00 2011 +0800 +@@ -27,10 +27,10 @@ + display help and exit + .TP + \fBPinyin File\fR +-Pinyin File is a file with pinyin and one character per line, seperated with space. One available file is in the source of fcitx, named \fIgbkpy.org\fR. ++Pinyin File is a file with pinyin and one character per line, separated with space. One available file is in the source of fcitx, named \fIgbkpy.org\fR. + .TP + \fBPhrase File\fR +-Phrase File is a file with full pinyin seperated with ' and the corresponding phrase. The default phrase file of fcitx can be downloaded at http://fcitx.googlecode.com/files/pinyin.tar.gz. ++Phrase File is a file with full pinyin separated with ' and the corresponding phrase. The default phrase file of fcitx can be downloaded at http://fcitx.googlecode.com/files/pinyin.tar.gz. + .TP + \fBPinyin MB File\fR + Pinyin MB File is the binary format of Pinyin File. +diff -r e9b9346cfabf -r b8f3463f19b5 src/im/special/vk.c +--- a/src/im/special/vk.c Fri Dec 17 14:06:14 2010 +0800 ++++ b/src/im/special/vk.c Wed Apr 27 13:36:00 2011 +0800 +@@ -271,7 +271,7 @@ + return True; + } + else if (x >= 99 && x < 270) //空格 +- strcpy (strKey, "\xa1\xa1"); ++ strcpy (strKey, " "); + else if (x >= 312 && x <= 350) { //ESC + SwitchVK (); + pstr = (char *) NULL; +diff -r e9b9346cfabf -r b8f3463f19b5 src/ui/AboutWindow.c +--- a/src/ui/AboutWindow.c Fri Dec 17 14:06:14 2010 +0800 ++++ b/src/ui/AboutWindow.c Wed Apr 27 13:36:00 2011 +0800 +@@ -41,7 +41,7 @@ + char strTitle[100]; + + AboutWindow aboutWindow; +-extern Atom killAtom, windowTypeAtom, typeDialogAtom; ++extern Atom killAtom; + static void InitAboutWindowProperty (void); + + Bool CreateAboutWindow (void) +@@ -74,18 +74,9 @@ + { + XSetTransientForHint (dpy, aboutWindow.window, DefaultRootWindow (dpy)); + +- XChangeProperty (dpy, aboutWindow.window, windowTypeAtom, XA_ATOM, 32, PropModeReplace, (void *) &typeDialogAtom, 1); ++ SetWindowProperty(dpy, aboutWindow.window, FCITX_WINDOW_DIALOG, AboutCaption); + + XSetWMProtocols (dpy, aboutWindow.window, &killAtom, 1); +- +- char *p; +- +- p = AboutCaption; +- +- XTextProperty tp; +- Xutf8TextListToTextProperty(dpy, &p, 1, XUTF8StringStyle, &tp); +- XSetWMName (dpy, aboutWindow.window, &tp); +- XFree(tp.value); + } + + void DisplayAboutWindow (void) +diff -r e9b9346cfabf -r b8f3463f19b5 src/ui/InputWindow.c +--- a/src/ui/InputWindow.c Fri Dec 17 14:06:14 2010 +0800 ++++ b/src/ui/InputWindow.c Wed Apr 27 13:36:00 2011 +0800 +@@ -77,7 +77,6 @@ + { + XSetWindowAttributes attrib; + unsigned long attribmask; +- XTextProperty tp; + char strWindowName[]="Fcitx Input Window"; + int depth; + Colormap cmap; +@@ -127,12 +126,7 @@ + LoadInputMessage(); + XSelectInput (dpy, inputWindow.window, ButtonPressMask | ButtonReleaseMask | PointerMotionMask | ExposureMask); + +- /* Set the name of the window */ +- tp.value = (void *)strWindowName; +- tp.encoding = XA_STRING; +- tp.format = 16; +- tp.nitems = strlen(strWindowName); +- XSetWMName (dpy, inputWindow.window, &tp); ++ SetWindowProperty(dpy, inputWindow.window, FCITX_WINDOW_DOCK, strWindowName); + + return True; + } +diff -r e9b9346cfabf -r b8f3463f19b5 src/ui/MainWindow.c +--- a/src/ui/MainWindow.c Fri Dec 17 14:06:14 2010 +0800 ++++ b/src/ui/MainWindow.c Wed Apr 27 13:36:00 2011 +0800 +@@ -118,13 +118,7 @@ + XSelectInput (dpy, mainWindow.window, ExposureMask | ButtonPressMask | ButtonReleaseMask | PointerMotionMask | LeaveWindowMask); + + +- XTextProperty tp; +- /* Set the name of the window */ +- tp.value = (void *)strWindowName; +- tp.encoding = XA_STRING; +- tp.format = 16; +- tp.nitems = strlen(strWindowName); +- XSetWMName (dpy, mainWindow.window, &tp); ++ SetWindowProperty(dpy, mainWindow.window, FCITX_WINDOW_DOCK, strWindowName); + + return True; + } +diff -r e9b9346cfabf -r b8f3463f19b5 src/ui/MessageWindow.c +--- a/src/ui/MessageWindow.c Fri Dec 17 14:06:14 2010 +0800 ++++ b/src/ui/MessageWindow.c Wed Apr 27 13:36:00 2011 +0800 +@@ -33,7 +33,7 @@ + + extern Display *dpy; + extern int iScreen; +-extern Atom killAtom, windowTypeAtom, typeDialogAtom; ++extern Atom killAtom; + + MessageWindow messageWindow; + +@@ -67,7 +67,7 @@ + { + XSetTransientForHint (dpy, messageWindow.window, DefaultRootWindow (dpy)); + +- XChangeProperty (dpy, messageWindow.window, windowTypeAtom, XA_ATOM, 32, PropModeReplace, (void *) &typeDialogAtom, 1); ++ SetWindowProperty(dpy, messageWindow.window, FCITX_WINDOW_DIALOG, "Fcitx - Message"); + + XSetWMProtocols(dpy, messageWindow.window, &killAtom, 1); + } +diff -r e9b9346cfabf -r b8f3463f19b5 src/ui/TrayWindow.c +--- a/src/ui/TrayWindow.c Fri Dec 17 14:06:14 2010 +0800 ++++ b/src/ui/TrayWindow.c Wed Apr 27 13:36:00 2011 +0800 +@@ -43,7 +43,6 @@ + extern int iScreen; + + Bool CreateTrayWindow() { +- XTextProperty tp; + char strWindowName[]="Fcitx Tray Window"; + if ( !fc.bUseTrayIcon ) + return False; +@@ -80,13 +79,6 @@ + size_hints.base_height = tray.size; + XSetWMNormalHints(dpy, tray.window, &size_hints); + +- //Set the name of the window +- tp.value = (void *)strWindowName; +- tp.encoding = XA_STRING; +- tp.format = 16; +- tp.nitems = strlen(strWindowName); +- XSetWMName (dpy, tray.window, &tp); +- + if (vi && vi->visual) + tray.cs = cairo_xlib_surface_create(dpy, tray.window, tray.visual.visual, 200, 200); + else +@@ -98,6 +90,8 @@ + XSelectInput (dpy, tray.window, ExposureMask | KeyPressMask | \ + ButtonPressMask | ButtonReleaseMask | StructureNotifyMask \ + | EnterWindowMask | PointerMotionMask | LeaveWindowMask | VisibilityChangeMask); ++ ++ SetWindowProperty(dpy, tray.window, FCITX_WINDOW_DOCK, strWindowName); + return True; + } + +diff -r e9b9346cfabf -r b8f3463f19b5 src/ui/skin.c +--- a/src/ui/skin.c Fri Dec 17 14:06:14 2010 +0800 ++++ b/src/ui/skin.c Wed Apr 27 13:36:00 2011 +0800 +@@ -600,9 +600,6 @@ + void LoadInputMessage() + { + int i = 0; +- int fontSize; +- +- fontSize=sc.skinFont.fontSize; + + ConfigColor cursorColor = sc.skinInputBar.cursorColor; + //输入条背景图画笔 +diff -r e9b9346cfabf -r b8f3463f19b5 src/ui/ui.c +--- a/src/ui/ui.c Fri Dec 17 14:06:14 2010 +0800 ++++ b/src/ui/ui.c Wed Apr 27 13:36:00 2011 +0800 +@@ -25,6 +25,7 @@ + + #include + #include ++#include + + #include + #include +@@ -72,7 +73,9 @@ + Atom windowTypeAtom; + Atom typeMenuAtom; + Atom typeDialogAtom; ++Atom typeDockAtom; + Atom compManagerAtom; ++Atom pidAtom; + Window compManager; + + // added by yunfan +@@ -94,9 +97,45 @@ + windowTypeAtom = XInternAtom (dpy, "_NET_WM_WINDOW_TYPE", False); + typeMenuAtom = XInternAtom (dpy, "_NET_WM_WINDOW_TYPE_MENU", False); + typeDialogAtom = XInternAtom (dpy, "_NET_WM_WINDOW_TYPE_DIALOG", False); ++ typeDockAtom = XInternAtom (dpy, "_NET_WM_WINDOW_TYPE_DOCK", False); ++ pidAtom = XInternAtom(dpy, "_NET_WM_PID", False); + return True; + } + ++void SetWindowProperty(Display* dpy, Window window, FcitxXWindowType type, char *windowTitle) ++{ ++ Atom* wintype = NULL; ++ switch(type) ++ { ++ case FCITX_WINDOW_DIALOG: ++ wintype = &typeDialogAtom; ++ break; ++ case FCITX_WINDOW_DOCK: ++ wintype = &typeDockAtom; ++ break; ++ case FCITX_WINDOW_MENU: ++ wintype = &typeMenuAtom; ++ break; ++ default: ++ wintype = NULL; ++ break; ++ } ++ if (wintype) ++ XChangeProperty (dpy, window, windowTypeAtom, XA_ATOM, 32, PropModeReplace, (void *) wintype, 1); ++ ++ pid_t pid = getpid(); ++ XChangeProperty(dpy, window, pidAtom, XA_CARDINAL, 32, ++ PropModeReplace, (unsigned char *)&pid, 1); ++ ++ if (windowTitle) ++ { ++ XTextProperty tp; ++ Xutf8TextListToTextProperty(dpy, &windowTitle, 1, XUTF8StringStyle, &tp); ++ XSetWMName (dpy, window, &tp); ++ XFree(tp.value); ++ } ++} ++ + /* + * 有关界面的消息都在这里处理 + * 有关tray重画的问题,此处的解决方案似乎很dirt +@@ -985,6 +1024,7 @@ + pango_font_description_set_family(desc, font); + return desc; + } ++#endif + + Visual * FindARGBVisual (Display *dpy, int scr) + { +@@ -1018,6 +1058,3 @@ + XFree (xvi); + return visual; + } +- +- +-#endif +diff -r e9b9346cfabf -r b8f3463f19b5 src/ui/ui.h +--- a/src/ui/ui.h Fri Dec 17 14:06:14 2010 +0800 ++++ b/src/ui/ui.h Wed Apr 27 13:36:00 2011 +0800 +@@ -30,7 +30,15 @@ + #include "core/fcitx.h" + #include "fcitx-config/fcitx-config.h" + ++typedef enum FcitxXWindowType { ++ FCITX_WINDOW_UNKNOWN, ++ FCITX_WINDOW_DOCK, ++ FCITX_WINDOW_MENU, ++ FCITX_WINDOW_DIALOG ++} FcitxXWindowType; ++ + Bool InitX (void); ++void SetWindowProperty(Display* dpy, Window window, FcitxXWindowType type, char *windowTitle); + void MyXEventHandler (XEvent * event); + + void OutputString (cairo_t* c, const char *str, const char *font, int fontSize, int x, int y, ConfigColor* color); +diff -r e9b9346cfabf -r b8f3463f19b5 tools/txt2mb.c +--- a/tools/txt2mb.c Fri Dec 17 14:06:14 2010 +0800 ++++ b/tools/txt2mb.c Wed Apr 27 13:36:00 2011 +0800 +@@ -357,20 +357,20 @@ + continue; + } + +- bPY = False; ++ bPY = False; ++ pstr = strCode; + if (strCode[0] == cPinyinKey) { +- size_t length = strlen(strCode); +- memmove (strCode, strCode + 1, length); ++ pstr ++; + bPY = True; + } + + //查找是否重复 + temp = current; + if (temp != head) { +- if (strcmp (temp->strCode, strCode) >= 0) { +- while (temp != head && strcmp (temp->strCode, strCode) >= 0) { +- if (!strcmp (temp->strHZ, strHZ) && !strcmp (temp->strCode, strCode)) { +- printf ("Delete: %s %s\n", strCode, strHZ); ++ if (strcmp (temp->strCode, pstr) >= 0) { ++ while (temp != head && strcmp (temp->strCode, pstr) >= 0) { ++ if (!strcmp (temp->strHZ, strHZ) && !strcmp (temp->strCode, pstr)) { ++ printf ("Delete: %s %s\n", pstr, strHZ); + goto _next; + } + temp = temp->prev; +@@ -379,13 +379,13 @@ + if (temp == head) + temp = temp->next; + +- while (temp != head && strcmp (temp->strCode, strCode) <= 0) ++ while (temp != head && strcmp (temp->strCode, pstr) <= 0) + temp = temp->next; + } + else { +- while (temp != head && strcmp (temp->strCode, strCode) <= 0) { +- if (!strcmp (temp->strHZ, strHZ) && !strcmp (temp->strCode, strCode)) { +- printf ("Delete: %s %s\n", strCode, strHZ); ++ while (temp != head && strcmp (temp->strCode, pstr) <= 0) { ++ if (!strcmp (temp->strHZ, strHZ) && !strcmp (temp->strCode, pstr)) { ++ printf ("Delete: %s %s\n", pstr, strHZ); + goto _next; + } + temp = temp->next; +@@ -397,7 +397,7 @@ + newRec = (RECORD *) malloc (sizeof (RECORD)); + newRec->strCode = (char *) malloc (sizeof (char) * (iPYCodeLength + 1)); + newRec->strHZ = (char *) malloc (sizeof (char) * strlen (strHZ) + 1); +- strcpy (newRec->strCode, strCode); ++ strcpy (newRec->strCode, pstr); + strcpy (newRec->strHZ, strHZ); + newRec->bPinyin = bPY; + newRec->iHit = 0; diff --git a/sources b/sources index 0fe6a9b..d3ca6de 100644 --- a/sources +++ b/sources @@ -1,2 +1 @@ -ce1156b19c719b04bd077f53fc4bd980 fcitx-4.0.0_all.tar.gz 844f6a382ca970d6c3343e12148be641 fcitx-4.0.1_all.tar.gz