nabi-1.0.0/0000755000175000017500000000000012100712167007417 500000000000000nabi-1.0.0/test/0000755000175000017500000000000012100712167010376 500000000000000nabi-1.0.0/test/Makefile0000644000175000017500000000133511655153252011770 00000000000000# Makefile CFLAGS = -I/usr/X11R6/include -Wall -g CXXFLAGS = -I/usr/X11R6/include -Wall -g LIBS = -L/usr/X11R6/lib -lX11 QT4_CXXFLAGS = $(shell pkg-config --cflags QtGui) QT4_LIBS = $(shell pkg-config --libs QtGui) all: xlib gtk gtk1 qt xim_filter.so clean: rm -f xlib gtk1 gtk qt xlib: xlib.cpp g++ $(CXXFLAGS) xlib.cpp -o xlib $(LIBS) gtk1: gtk1.c gcc -Wall -g `gtk-config --cflags --libs` gtk1.c -o gtk1 gtk: gtk.c gcc -Wall -g `pkg-config --cflags --libs gtk+-2.0` gtk.c -o gtk qt: qt.cpp g++ -Wall -I$(QTDIR)/include -L$(QTDIR)/lib -lqt-mt qt.cpp -o qt xim_filter.so: xim_filter.c gcc -Wall -g -shared -fPIC xim_filter.c -o xim_filter.so -ldl qt4: qt4.cpp g++ -Wall -g -O0 $(QT4_CXXFLAGS) $< -o $@ $(QT4_LIBS) nabi-1.0.0/test/xlib.cpp0000644000175000017500000005624011655153252011777 00000000000000#include #include #include #include #include #include #include #include #include #include #define NELEMENTS(buf) (sizeof(buf) / sizeof(buf[0])) class TextView { public: TextView(); void create(Display *display, Window parent, int inputStyle); void destroy(); void setTitle(const char *title); bool isDestroyed(); void onExpose(); void onFocusIn(); void onFocusOut(); void onKeyPress(XKeyPressedEvent *event); void onClientMessage(const XClientMessageEvent *event); // for XIM void registerInstantiateCallback(); // IM instantiate callback static void IMInstantiateCallback(Display *display, XPointer client_data, XPointer data); // IM destroy callbacks static void IMDestroyCallback(XIM xim, XPointer client_data, XPointer data); // on the spot callbacks static void preeditStartCallback(XIM xim, XPointer client_data, XPointer data); static void preeditDoneCallback(XIM xim, XPointer client_data, XPointer data); static void preeditDrawCallback(XIM xim, XPointer client_data, XPointer data); static void preeditCaretCallback(XIM xim, XPointer client_data, XPointer data); static void statusStartCallback(XIM xim, XPointer client_data, XPointer data); static void statusDoneCallback(XIM xim, XPointer client_data, XPointer data); static void statusDrawCallback(XIM xim, XPointer client_data, XPointer data); // string conversion callback static void stringConversionCallback(XIM xim, XPointer client_data, XPointer data); private: // for XIM interaction void openIM(); void closeIM(); void createIC(bool useStringConversion); void destroyIC(); void setPreeditString(const wchar_t *str, int pos, int length); void setPreeditCaret(int pos); void getSpotLocation(XPoint &point); void updateSpotLocation(); // keyevent void onKeyReturn(); void onKeyDelete(); void onKeyBackspace(); void onKeyHome(); void onKeyEnd(); void onKeyEscape(); void insert(const wchar_t *str); void moveCaret(int x, int y); void draw(); static std::string fontsetString; Display *m_display; Window m_window; GC m_gc; GC m_preeditGC; XIM m_im; XIC m_ic; Atom m_WMDeleteWindow; int m_width; int m_height; XFontSet m_fontset; XRectangle m_fontsetRect; int m_inputStyle; int m_nrow; int m_ncol; XPoint m_caret; // coord. in row/col std::wstring m_preeditString; int m_preeditCaret; std::vector m_text; }; std::string TextView::fontsetString = "*,*"; TextView::TextView() : m_display(NULL), m_window(0), m_gc(0), m_preeditGC(0), m_ic(0), m_width(300), m_height(200), m_fontset(NULL), m_nrow(10), m_ncol(80), m_preeditCaret(0) { m_fontsetRect.x = 0; m_fontsetRect.y = 0; m_fontsetRect.width = 0; m_fontsetRect.height = 0; m_caret.x = 0; m_caret.y = 0; m_text.push_back(new std::wstring(L"")); } bool TextView::isDestroyed() { return m_window == 0; } void TextView::registerInstantiateCallback() { XRegisterIMInstantiateCallback(m_display, NULL, NULL, NULL, TextView::IMInstantiateCallback, (XPointer)this); } void TextView::openIM() { m_im = XOpenIM(m_display, NULL, NULL, NULL); if (m_im == NULL) { printf("Can't open XIM\n"); return; } printf("XIM is opened\n"); XUnregisterIMInstantiateCallback(m_display, NULL, NULL, NULL, IMInstantiateCallback, (XPointer)this); // register destroy callback XIMCallback destroy; destroy.callback = IMDestroyCallback; destroy.client_data = (XPointer)this; XSetIMValues(m_im, XNDestroyCallback, &destroy, NULL); bool useStringConversion = false; XIMValuesList* ic_values = NULL; XGetIMValues(m_im, XNQueryICValuesList, &ic_values, NULL); if (ic_values != NULL) { for (int i = 0; i < ic_values->count_values; i++) { if (strcmp(ic_values->supported_values[i], XNStringConversionCallback) == 0) { useStringConversion = true; break; } } } createIC(useStringConversion); } void TextView::closeIM(void) { XCloseIM(m_im); m_im = NULL; printf("XIM is closed\n"); } void TextView::createIC(bool useStringConversion) { if (m_im == NULL) return; if ((m_inputStyle & XIMPreeditCallbacks) == XIMPreeditCallbacks) { XIMCallback preedit_start; XIMCallback preedit_done; XIMCallback preedit_draw; XIMCallback preedit_caret; preedit_start.callback = preeditStartCallback; preedit_start.client_data = (XPointer)this; preedit_done.callback = preeditDoneCallback; preedit_done.client_data = (XPointer)this; preedit_draw.callback = preeditDrawCallback; preedit_draw.client_data = (XPointer)this; preedit_caret.callback = preeditCaretCallback; preedit_caret.client_data = (XPointer)this; XVaNestedList p_attr = XVaCreateNestedList(0, XNPreeditStartCallback, &preedit_start, XNPreeditDoneCallback, &preedit_done, XNPreeditDrawCallback, &preedit_draw, XNPreeditCaretCallback, &preedit_caret, NULL); XIMCallback status_start; XIMCallback status_done; XIMCallback status_draw; status_start.callback = statusStartCallback; status_start.client_data = (XPointer)this; status_done.callback = statusDoneCallback; status_done.client_data = (XPointer)this; status_draw.callback = statusDrawCallback; status_draw.client_data = (XPointer)this; XVaNestedList s_attr = XVaCreateNestedList(0, XNStatusStartCallback, &status_start, XNStatusDoneCallback, &status_done, XNStatusDrawCallback, &status_draw, NULL); m_ic = XCreateIC(m_im, XNInputStyle, XIMPreeditCallbacks, XNClientWindow, m_window, XNPreeditAttributes, p_attr, XNStatusAttributes, s_attr, NULL); XFree(p_attr); XFree(s_attr); } else if ((m_inputStyle & XIMPreeditPosition) == XIMPreeditPosition) { XRectangle area; area.x = 0; area.y = 0; area.width = m_width; area.height = m_height; XPoint spotLocation; getSpotLocation(spotLocation); XVaNestedList attr = XVaCreateNestedList(0, XNSpotLocation, &spotLocation, XNArea, &area, XNFontSet, m_fontset, NULL); m_ic = XCreateIC(m_im, XNInputStyle, XIMPreeditPosition, XNClientWindow, m_window, XNPreeditAttributes, attr, NULL); XFree(attr); } else if ((m_inputStyle & XIMPreeditArea) == XIMPreeditArea) { XRectangle area; area.x = 0; area.y = 0; area.width = m_width; area.height = m_height; XVaNestedList attr = XVaCreateNestedList(0, XNArea, &area, XNFontSet, m_fontset, NULL); m_ic = XCreateIC(m_im, XNInputStyle, XIMPreeditArea, XNClientWindow, m_window, XNPreeditAttributes, attr, NULL); XFree(attr); } else if ((m_inputStyle & XIMPreeditNothing) == XIMPreeditNothing) { m_ic = XCreateIC(m_im, XNInputStyle, XIMPreeditNothing, XNClientWindow, m_window, NULL); } else if ((m_inputStyle & XIMPreeditNone) == XIMPreeditNone) { m_ic = XCreateIC(m_im, XNInputStyle, XIMPreeditNone, XNClientWindow, m_window, NULL); } if (m_ic != NULL) { unsigned long fevent = 0; XGetICValues(m_ic, XNFilterEvents, &fevent, NULL); unsigned long mask = ExposureMask | KeyPressMask | FocusChangeMask; XSelectInput(m_display, m_window, mask | fevent); if (useStringConversion) { XIMCallback strconv; strconv.callback = stringConversionCallback; strconv.client_data = (XPointer)this; XSetICValues(m_ic, XNStringConversionCallback, &strconv, NULL); } printf("XIC is created\n"); } else { printf("cannot create XIC\n"); } } void TextView::destroyIC() { if (m_ic != NULL) { XDestroyIC(m_ic); m_ic = NULL; printf("XIC is destroyed\n"); } } void TextView::create(Display *display, Window parent, int inputStyle) { // create window m_display = display; int screen = DefaultScreen(m_display); if (parent == 0) parent = RootWindow(display, screen); m_window = XCreateSimpleWindow(m_display, parent, 0, 0, m_width, m_height, 0, BlackPixel(m_display, screen), WhitePixel(m_display, screen)); // load fontset char **missing_list = NULL; int missing_count = 0; char *default_string = NULL; m_fontset = XCreateFontSet(display, fontsetString.c_str(), &missing_list, &missing_count, &default_string); if (m_fontset == NULL) { printf("Can't create font set: %s\n", fontsetString.c_str()); exit(0); } XFontStruct **font_struct; char **font_names; int n = XFontsOfFontSet(m_fontset, &font_struct, &font_names); if (n > 0) { printf("fonset:"); for (int i = 0; i < n; i++) { printf("\t%s\n", font_names[i]); } } XFontSetExtents *fontset_ext = XExtentsOfFontSet(m_fontset); m_fontsetRect = fontset_ext->max_logical_extent; // create GC XGCValues values; values.foreground = BlackPixel(m_display, screen); values.background = WhitePixel(m_display, screen); m_gc = XCreateGC(display, m_window, GCForeground | GCBackground, &values); values.foreground = WhitePixel(m_display, screen); values.background = BlackPixel(m_display, screen); m_preeditGC = XCreateGC(display, m_window, GCForeground | GCBackground, &values); // set input style m_inputStyle = inputStyle; // register instantiate callback registerInstantiateCallback(); unsigned long mask = ExposureMask | KeyPressMask | KeyReleaseMask | FocusChangeMask; XSelectInput(m_display, m_window, mask); m_WMDeleteWindow = XInternAtom(m_display, "WM_DELETE_WINDOW", False); XSetWMProtocols(m_display, m_window, &m_WMDeleteWindow, 1); XMapWindow(m_display, m_window); } void TextView::setTitle(const char *title) { if (m_window != 0) XStoreName(m_display, m_window, title); } void TextView::destroy() { for (std::vector::iterator iter = m_text.begin(); iter != m_text.end(); ++iter) { delete (*iter); } destroyIC(); closeIM(); XDestroyWindow(m_display, m_window); m_window = 0; m_display = NULL; } void TextView::draw() { XClearWindow(m_display, m_window); int i, x = 0, y = 0; for (i = 0; i < (int)m_text.size(); i++) { if (i == m_caret.y) { int xpos = 0; std::wstring before = m_text[i]->substr(0, m_caret.x); std::wstring after = m_text[i]->substr(m_caret.x, m_text[i]->size() - m_caret.x); XwcDrawImageString(m_display, m_window, m_fontset, m_gc, xpos, y - m_fontsetRect.y, before.c_str(), before.size()); xpos += XwcTextEscapement(m_fontset, before.c_str(), before.size()); XwcDrawImageString(m_display, m_window, m_fontset, m_preeditGC, xpos, y - m_fontsetRect.y, m_preeditString.c_str(), m_preeditString.size()); xpos += XwcTextEscapement(m_fontset, m_preeditString.c_str(), m_preeditString.size()); XwcDrawImageString(m_display, m_window, m_fontset, m_gc, xpos, y - m_fontsetRect.y, after.c_str(), after.size()); } else { XwcDrawImageString(m_display, m_window, m_fontset, m_gc, x, y - m_fontsetRect.y, m_text[i]->c_str(), m_text[i]->size()); } y += m_fontsetRect.height; } // draw caret; std::wstring fullstring = *m_text[m_caret.y]; fullstring.insert(m_caret.x, m_preeditString); std::wstring substring = fullstring.substr(0, m_caret.x + m_preeditCaret); x = XwcTextEscapement(m_fontset, substring.c_str(), substring.size()); y = m_fontsetRect.height * m_caret.y; XDrawLine(m_display, m_window, m_gc, x, y, x, y + m_fontsetRect.height); } void TextView::insert(const wchar_t *str) { m_text[m_caret.y]->insert(m_caret.x, str); m_caret.x += wcslen(str); } void TextView::moveCaret(int x, int y) { if (x > 0) { if (m_caret.x < (int)m_text[m_caret.y]->size()) { m_caret.x++; } else if (m_caret.y < (int)m_text.size() - 1) { m_caret.x = 0; m_caret.y++; } } else if (x < 0) { if (m_caret.x > 0) { m_caret.x--; } else if (m_caret.y > 0) { m_caret.x = (int)m_text[m_caret.y - 1]->size(); m_caret.y--; } } if (y > 0) { if (m_caret.y < (int)m_text.size() - 1) { m_caret.y++; if (m_caret.x > (int)m_text[m_caret.y]->size()) m_caret.x = m_text[m_caret.y]->size(); } } else if (y < 0) { if (m_caret.y > 0) { m_caret.y--; if (m_caret.x > (int)m_text[m_caret.y]->size()) m_caret.x = m_text[m_caret.y]->size(); } } updateSpotLocation(); } void TextView::updateSpotLocation() { if (m_ic == NULL) return; if ((m_inputStyle | XIMPreeditPosition) == XIMPreeditPosition) { XPoint spotLocation = { 0, 0 }; getSpotLocation(spotLocation); XVaNestedList attr = XVaCreateNestedList(0, XNSpotLocation, &spotLocation, NULL); XSetICValues(m_ic, XNPreeditAttributes, attr, NULL); XFree(attr); } } void TextView::setPreeditCaret(int pos) { m_preeditCaret = pos; } void TextView::setPreeditString(const wchar_t *str, int pos, int length) { if (str == NULL) { m_preeditString.erase(pos, length); } else { if (length > 0) { m_preeditString.replace(pos, length, str); } else { m_preeditString.insert(pos, str); } } } void TextView::getSpotLocation(XPoint &point) { std::wstring tmp = m_text[m_caret.y]->substr(0, m_caret.x); int width = XwcTextEscapement(m_fontset, tmp.c_str(), tmp.size()); if (width > 0) point.x = width + 1; else point.x = 0; point.y = m_fontsetRect.height * m_caret.y - m_fontsetRect.y; } void TextView::onExpose() { draw(); } void TextView::onFocusIn() { if (m_ic == NULL) return; XSetICFocus(m_ic); } void TextView::onFocusOut() { if (m_ic == NULL) return; wchar_t *str = XwcResetIC(m_ic); m_preeditString.clear(); if (str != NULL) { insert(str); draw(); } XUnsetICFocus(m_ic); } void TextView::onKeyPress(XKeyPressedEvent *event) { char buf[256] = { '\0', }; wchar_t wbuf[256] = { L'\0', }; KeySym keysym = 0; Status status = XLookupNone; if (m_ic == NULL) { XLookupString(event, buf, sizeof(buf), &keysym, NULL); mbstowcs(wbuf, buf, strlen(buf)); status = XLookupChars; } else { XwcLookupString(m_ic, event, wbuf, NELEMENTS(wbuf), &keysym, &status); } if (status == XLookupChars || status == XLookupKeySym || status == XLookupBoth) { if (keysym == XK_Return) { onKeyReturn(); } else if (keysym == XK_Delete) { onKeyDelete(); } else if (keysym == XK_BackSpace) { onKeyBackspace(); } else if (keysym == XK_Escape) { onKeyEscape(); return; } else if (keysym == XK_Left) { moveCaret(-1, 0); } else if (keysym == XK_Right) { moveCaret(1, 0); } else if (keysym == XK_Up) { moveCaret(0, -1); } else if (keysym == XK_Down) { moveCaret(0, 1); } else if (keysym == XK_Home) { onKeyHome(); } else if (keysym == XK_End) { onKeyEnd(); } else { if ((status == XLookupChars || status == XLookupBoth) && ((event->state & ControlMask) != ControlMask) && ((event->state & Mod1Mask) != Mod1Mask)) insert(wbuf); } updateSpotLocation(); draw(); } } void TextView::onKeyReturn() { if (m_caret.x < (int)m_text[m_caret.y]->size()) { std::wstring last = m_text[m_caret.y]->substr(m_caret.x, m_text[m_caret.y]->size() - m_caret.x); m_text[m_caret.y]->erase(m_caret.x, last.size()); m_text.insert(m_text.begin() + m_caret.y + 1, new std::wstring(last)); } else { m_text.insert(m_text.begin() + m_caret.y + 1, new std::wstring(L"")); } // move the cursor m_caret.x = 0; m_caret.y++; } void TextView::onKeyDelete() { if (m_caret.x < (int)m_text[m_caret.y]->size()) { m_text[m_caret.y]->erase(m_caret.x, 1); } else { if (m_caret.y < (int)m_text.size() - 1) { if (m_text[m_caret.y + 1]->size() > 0) { m_text[m_caret.y]->append(*m_text[m_caret.y + 1]); } delete m_text[m_caret.y + 1]; m_text.erase(m_text.begin() + m_caret.y + 1); } } } void TextView::onKeyBackspace() { if (m_caret.x > 0) { m_caret.x--; m_text[m_caret.y]->erase(m_caret.x, 1); } else { if (m_caret.y > 0) { m_caret.x = m_text[m_caret.y - 1]->size(); m_caret.y--; if (m_text[m_caret.y + 1]->size() > 0) { m_text[m_caret.y]->append(*m_text[m_caret.y + 1]); } delete m_text[m_caret.y + 1]; m_text.erase(m_text.begin() + m_caret.y + 1); } } } void TextView::onKeyHome() { m_caret.x = 0; } void TextView::onKeyEnd() { m_caret.x = m_text[m_caret.y]->size(); } void TextView::onKeyEscape() { destroy(); } void TextView::onClientMessage(const XClientMessageEvent *event) { if(event->data.l[0] == (long)m_WMDeleteWindow){ destroy(); } } void TextView::IMInstantiateCallback(Display *display, XPointer client_data, XPointer data) { if (client_data == NULL) return; printf("XIM is available now\n"); TextView *textview = reinterpret_cast(client_data); textview->openIM(); } void TextView::IMDestroyCallback(XIM im, XPointer client_data, XPointer data) { printf("xim is destroyed\n"); if (client_data == NULL) return; TextView *textview = reinterpret_cast(client_data); textview->m_im = NULL; textview->m_ic = NULL; textview->registerInstantiateCallback(); } void TextView::preeditStartCallback(XIM xim, XPointer user_data, XPointer data) { printf("preedit start\n"); } void TextView::preeditDoneCallback(XIM xim, XPointer user_data, XPointer data) { printf("preedit done\n"); if (user_data == NULL) return; TextView *textview = reinterpret_cast(user_data); textview->setPreeditString(NULL, 0, 0); } void TextView::preeditDrawCallback(XIM xim, XPointer user_data, XPointer data) { if (user_data == NULL || data == NULL) return; TextView *textview = reinterpret_cast(user_data); XIMPreeditDrawCallbackStruct *draw_data = reinterpret_cast(data); textview->setPreeditCaret(draw_data->caret); if (draw_data->text == NULL) { textview->setPreeditString(NULL, draw_data->chg_first, draw_data->chg_length); } else { if (draw_data->text->encoding_is_wchar) { textview->setPreeditString(draw_data->text->string.wide_char, draw_data->chg_first, draw_data->chg_length); } else { wchar_t str[256] = { L'\0', }; mbstowcs(str, draw_data->text->string.multi_byte, sizeof(str)); textview->setPreeditString(str, draw_data->chg_first, draw_data->chg_length); } } textview->draw(); } void TextView::preeditCaretCallback(XIM xim, XPointer user_data, XPointer data) { if (user_data == NULL || data == NULL) return; TextView *textview = reinterpret_cast(user_data); XIMPreeditCaretCallbackStruct *caret_data = reinterpret_cast(data); switch (caret_data->direction) { case XIMForwardChar: textview->moveCaret(1, 0); break; case XIMBackwardChar: textview->moveCaret(-1, 0); break; case XIMDontChange: break; default: printf("preedit caret: %d\n", caret_data->direction); break; } textview->draw(); } void TextView::statusStartCallback(XIM xim, XPointer user_data, XPointer data) { printf("status start\n"); } void TextView::statusDoneCallback(XIM xim, XPointer user_data, XPointer data) { printf("status done\n"); } void TextView::statusDrawCallback(XIM xim, XPointer user_data, XPointer data) { printf("status draw\n"); } void TextView::stringConversionCallback(XIM xim, XPointer client_data, XPointer data) { short position; TextView *textview = reinterpret_cast(client_data); XIMStringConversionCallbackStruct* strconv; strconv = reinterpret_cast(data); position = (short)strconv->position; printf("position: %d\n", position); printf("direction: %d\n", strconv->direction); printf("operation: %d\n", strconv->operation); printf("factor: %d\n", strconv->factor); std::wstring* curline = textview->m_text[textview->m_caret.y]; ssize_t begin = textview->m_caret.x + position; size_t end = begin; if (strconv->direction == XIMBackwardChar) { begin -= strconv->factor; } else if (strconv->direction == XIMForwardChar) { end += strconv->factor; } else if (strconv->direction == XIMBackwardWord) { } else if (strconv->direction == XIMForwardWord) { } if (begin < 0) begin = 0; if ((size_t)begin > curline->length()) begin = curline->length(); if (end > curline->length()) end = curline->length(); if (strconv->operation == XIMStringConversionRetrieval) { std::wstring ret; if (end > (size_t)begin) ret.assign(*curline, begin, end - begin); if (!ret.empty()) { XIMStringConversionText* text; text = (XIMStringConversionText*)malloc(sizeof(*text)); if (text != NULL) { size_t size_in_bytes; text->length = ret.length(); text->feedback = NULL; text->encoding_is_wchar = True; size_in_bytes = sizeof(wchar_t) * (text->length + 1); text->string.wcs = (wchar_t*)malloc(size_in_bytes); if (text->string.wcs != NULL) { memcpy(text->string.wcs, ret.c_str(), size_in_bytes); strconv->text = text; } else { free(text); } } } } else if (strconv->operation == XIMStringConversionSubstitution) { if (end > (size_t)begin) curline->erase(begin, end - begin); textview->m_caret.x = begin; } } int main(int argc, char *argv[]) { Display *display = XOpenDisplay(""); if (display == NULL) { printf("Can't open display\n"); return 0; } char *locale = setlocale(LC_CTYPE, ""); if (locale == NULL) { printf("Can't set locale\n"); XCloseDisplay(display); return 0; } printf("locale: %s\n", locale); if (!XSupportsLocale()) { printf("X does not support locale\n"); XCloseDisplay(display); return 0; } char *modifiers = XSetLocaleModifiers(""); if (modifiers == NULL) { printf("Can't set locale modifiers\n"); XCloseDisplay(display); return 0; } printf("modifiers: %s\n", modifiers); int inputStyle = XIMPreeditCallbacks; const char *title = "XIM client - On the spot"; if (argc >= 2) { if (strcmp(argv[1], "-on") == 0) { inputStyle = XIMPreeditCallbacks | XIMStatusCallbacks; title = "XIM client - On the spot"; } else if (strcmp(argv[1], "-over") == 0) { inputStyle = XIMPreeditPosition; title = "XIM client - over the spot"; } else if (strcmp(argv[1], "-off") == 0) { inputStyle = XIMPreeditArea; title = "XIM client - off the spot"; } else if (strcmp(argv[1], "-root") == 0) { inputStyle = XIMPreeditNothing; title = "XIM client - root window"; } } TextView textview; textview.create(display, 0, inputStyle); textview.setTitle(title); XEvent event; for (;;) { XNextEvent(display, &event); if (XFilterEvent(&event, None)) continue; switch(event.type){ case FocusIn: textview.onFocusIn(); break; case FocusOut: textview.onFocusOut(); break; case Expose: textview.onExpose(); break; case KeyPress: textview.onKeyPress(&event.xkey); break; case ClientMessage: textview.onClientMessage(&event.xclient); break; default: break; } if (textview.isDestroyed()) { break; } } XCloseDisplay(display); return 0; } nabi-1.0.0/test/gtk.c0000644000175000017500000000203611702004637011253 00000000000000#include void on_destroy(GtkWidget *widget, gpointer data) { gtk_main_quit(); } int main(int argc, char *argv[]) { GtkWidget *window; GtkWidget *vbox; GtkWidget *entry; GtkWidget *textview; GtkWidget *scrolled; gtk_init(&argc, &argv); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(on_destroy), NULL); gtk_window_set_default_size(GTK_WINDOW(window), 300, 200); vbox = gtk_vbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER(window), vbox); entry = gtk_entry_new(); gtk_box_pack_start(GTK_BOX(vbox), entry, FALSE, TRUE, 0); textview = gtk_text_view_new(); scrolled = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); gtk_container_add(GTK_CONTAINER(scrolled), textview); gtk_box_pack_start(GTK_BOX(vbox), scrolled, TRUE, TRUE, 0); gtk_widget_show_all(window); gtk_main(); return 0; } nabi-1.0.0/test/gtk1.c0000644000175000017500000000156011655153252011342 00000000000000#include #include void on_destroy(GtkWidget *widget, gpointer data) { gtk_main_quit(); } int main(int argc, char *argv[]) { GtkWidget *window; GtkWidget *vbox; GtkWidget *entry; GtkWidget *text; gtk_set_locale(); gtk_init(&argc, &argv); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_signal_connect(GTK_OBJECT(window), "destroy", GTK_SIGNAL_FUNC(on_destroy), NULL); gtk_widget_set_usize(window, 300, 200); vbox = gtk_vbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER(window), vbox); entry = gtk_entry_new(); gtk_box_pack_start(GTK_BOX(vbox), entry, FALSE, TRUE, 0); text = gtk_text_new(NULL, NULL); gtk_text_set_editable(GTK_TEXT(text), TRUE); gtk_box_pack_start(GTK_BOX(vbox), text, TRUE, TRUE, 0); gtk_widget_show_all(window); gtk_main(); return 0; } nabi-1.0.0/test/qt.cpp0000644000175000017500000000100511655153252011452 00000000000000#include #include #include #include int main(int argc, char *argv[]) { QApplication app(argc, argv); QWidget widget; widget.resize(300, 200); QBoxLayout *layout = new QVBoxLayout(&widget); QLineEdit *lineedit = new QLineEdit(&widget, 0); layout->addWidget(lineedit); QTextEdit *textedit = new QTextEdit(&widget, 0); layout->addWidget(textedit); app.setMainWidget(&widget); widget.show(); return app.exec(); } nabi-1.0.0/README0000644000175000017500000000345711667153422010242 00000000000000Nabi 나비 ========= nabi는 System Tray(Notification Area)를 지원하는 GTK+로 개발된 X Window의 한글 입력기(XIM)입니다. 프로젝트 사이트: http://code.google.com/p/nabi/ 기능과 특징 * 두벌식, 세벌식최종, 세벌식390 자판 지원 * libhangul을 이용하여 한자의 뜻까지 보여줌 * Notification Area에 embed됨 * imhangul의 한영 상태로 같이 나타냄 소스 nabi의 소스는 여기에서 관리하지 않고 GitHub에서 관리하고 있습니다. 다음 명령으로 소스를 받으실 수 있습니다. $ git clone git://github.com/choehwanjin/nabi.git nabi 또는 http://github.com/choehwanjin/nabi 여기서 웹으로 브라우징해 볼 수 있습니다. 빌드 빌드 방법은 보통의 GNU build system을 사용한 오픈 소스 패키지와 동일합니다. $ ./configure --prefix=$PREFIX $ make # make install XIM으로 사용하기 위해서는 XMODIFIERS 환경 변수가 필요합니다. 아래와 같이 설정하면 사용할 수 있습니다. export XMODIFIERS="@im=nabi" 그러나 이런 환경 변수 설정을 유효하게 하는 것은 일반 사용자에게는 상당히 까다로운 일로 배포판에서 제공하는 설정방법을 사용하시길 추천합니다. 최근의 많은 배포판들은 im-switch를 가지고 있으므로 im-switch를 이용하여 설정하는 것이 편리합니다. $ im-switch -s nabi 이 명령을 실행하여 설정하면 됩니다. ------------------------ For non-korean users. You should set XMODIFIERS environment variable before launching any XIM-aware application. export XMODIFIERS="@im=nabi" Put the line above in xinit script file, ie, ~/.xsession. See xinit man page. If you use debian, it is easy to use im-switcher. Install im-switch, and run it like below: $ im-switch -s nabi nabi-1.0.0/configure.ac0000644000175000017500000000571112066005045011632 00000000000000AC_INIT(nabi, 1.0.0, http://code.google.com/p/nabi/) AM_INIT_AUTOMAKE([]) AM_CONFIG_HEADER(config.h) dnl Checks for programs AC_PROG_CC AM_PROG_CC_C_O AC_OBJEXT AC_PROG_RANLIB AC_PROG_INSTALL dnl Checks for header files. AC_PATH_X AC_HEADER_DIRENT AC_HEADER_STDC AC_CHECK_HEADERS([langinfo.h libintl.h locale.h stddef.h stdint.h stdlib.h string.h sys/param.h]) dnl Checks for typedefs, structures, and compiler characteristics. AC_C_CONST AC_C_INLINE AC_TYPE_SIZE_T AC_STRUCT_TM dnl Checks for library functions. AC_FUNC_CLOSEDIR_VOID AC_FUNC_MALLOC AC_FUNC_REALLOC AC_FUNC_VPRINTF AC_FUNC_STRFTIME AC_CHECK_FUNCS([gethostname memmove memset mkdir putenv setlocale strchr strdup strtol localtime_r]) dnl Checks for X window system AC_PATH_XTRA case $X_PRE_LIBS in *"-lSM"*) AC_DEFINE_UNQUOTED(HAVE_LIBSM, 1, Define to 1 if you have the libSM library.) esac dnl Checks for GTK+ libraries. AC_PATH_PROG(PKG_CONFIG, pkg-config, AC_MSG_ERROR([nabi needs pkg-config])) PKG_CHECK_MODULES(GTK, gtk+-2.0 >= 2.4.0,, AC_MSG_ERROR([nabi needs GTK+ 2.4.0 or higher])) # checks for libhangul PKG_CHECK_MODULES(LIBHANGUL, libhangul >= 0.1.0,, AC_MSG_ERROR([nabi needs libhangul 0.1.0 or higher])) dnl gettext stuff ALL_LINGUAS="ko de" AM_GLIB_GNU_GETTEXT GETTEXT_PACKAGE="$PACKAGE" AC_SUBST(GETTEXT_PACKAGE) AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE, "$GETTEXT_PACKAGE", gettext package name) dnl data dir NABI_DATA_DIR="${datadir}/$PACKAGE" NABI_THEMES_DIR="${NABI_DATA_DIR}/themes" AC_SUBST(NABI_DATA_DIR) AC_SUBST(NABI_THEMES_DIR) # configure options AC_ARG_ENABLE(debug, [ --enable-debug include debug code], enable_debug=yes, enable_debug=no) dnl default keyboard AC_ARG_WITH(default-keyboard, [ --with-default-keyboard=2/39/3f default hangul keyboard]) case "$with_default_keyboard" in 2) AC_DEFINE_UNQUOTED(DEFAULT_KEYBOARD, "2", [Define default hangul keyboard]) ;; 39) AC_DEFINE_UNQUOTED(DEFAULT_KEYBOARD, "39", [Define default hangul keyboard]) ;; 3f) AC_DEFINE_UNQUOTED(DEFAULT_KEYBOARD, "3f", [Define default hangul keyboard]) ;; *) AC_DEFINE_UNQUOTED(DEFAULT_KEYBOARD, "2", [Define default hangul keyboard]) ;; esac # default theme AC_MSG_CHECKING([for default theme name]) AC_ARG_WITH(default-theme, [ --with-default-theme=[THEME] default icon theme]) if test -n "$with_default_theme"; then if test ! -d "themes/$with_default_theme"; then AC_MSG_NOTICE([there is no such theme directory: $with_default_theme, use default]) with_default_theme="Jini" fi else with_default_theme="Jini" fi AC_MSG_RESULT([$with_default_theme]) AC_DEFINE_UNQUOTED(DEFAULT_THEME, "$with_default_theme", [Define default icon theme]) if test "$enable_debug" = "yes"; then AC_DEFINE(NABI_DEBUG, 1, [Define to 1 if you want to use debug code]) CFLAGS="$CFLAGS -Wall -g" CXXFLAGS="$CXXFLAGS -Wall -g" fi AC_OUTPUT([ Makefile IMdkit/Makefile src/Makefile tables/Makefile themes/Makefile po/Makefile.in ]) nabi-1.0.0/aclocal.m40000644000175000017500000015457012066005051011211 00000000000000# generated automatically by aclocal 1.11.1 -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, # 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.65],, [m4_warning([this file was generated for autoconf 2.65. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically `autoreconf'.])]) # Copyright (C) 1995-2002 Free Software Foundation, Inc. # Copyright (C) 2001-2003,2004 Red Hat, Inc. # # This file is free software, distributed under the terms of the GNU # General Public License. As a special exception to the GNU General # Public License, this file may be distributed as part of a program # that contains a configuration script generated by Autoconf, under # the same distribution terms as the rest of that program. # # This file can be copied and used freely without restrictions. It can # be used in projects which are not available under the GNU Public License # but which still want to provide support for the GNU gettext functionality. # # Macro to add for using GNU gettext. # Ulrich Drepper , 1995, 1996 # # Modified to never use included libintl. # Owen Taylor , 12/15/1998 # # Major rework to remove unused code # Owen Taylor , 12/11/2002 # # Added better handling of ALL_LINGUAS from GNU gettext version # written by Bruno Haible, Owen Taylor 5/30/3002 # # Modified to require ngettext # Matthias Clasen 08/06/2004 # # We need this here as well, since someone might use autoconf-2.5x # to configure GLib then an older version to configure a package # using AM_GLIB_GNU_GETTEXT AC_PREREQ(2.53) dnl dnl We go to great lengths to make sure that aclocal won't dnl try to pull in the installed version of these macros dnl when running aclocal in the glib directory. dnl m4_copy([AC_DEFUN],[glib_DEFUN]) m4_copy([AC_REQUIRE],[glib_REQUIRE]) dnl dnl At the end, if we're not within glib, we'll define the public dnl definitions in terms of our private definitions. dnl # GLIB_LC_MESSAGES #-------------------- glib_DEFUN([GLIB_LC_MESSAGES], [AC_CHECK_HEADERS([locale.h]) if test $ac_cv_header_locale_h = yes; then AC_CACHE_CHECK([for LC_MESSAGES], am_cv_val_LC_MESSAGES, [AC_TRY_LINK([#include ], [return LC_MESSAGES], am_cv_val_LC_MESSAGES=yes, am_cv_val_LC_MESSAGES=no)]) if test $am_cv_val_LC_MESSAGES = yes; then AC_DEFINE(HAVE_LC_MESSAGES, 1, [Define if your file defines LC_MESSAGES.]) fi fi]) # GLIB_PATH_PROG_WITH_TEST #---------------------------- dnl GLIB_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR, dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]]) glib_DEFUN([GLIB_PATH_PROG_WITH_TEST], [# Extract the first word of "$2", so it can be a program name with args. set dummy $2; ac_word=[$]2 AC_MSG_CHECKING([for $ac_word]) AC_CACHE_VAL(ac_cv_path_$1, [case "[$]$1" in /*) ac_cv_path_$1="[$]$1" # Let the user override the test with a path. ;; *) IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" for ac_dir in ifelse([$5], , $PATH, [$5]); do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then if [$3]; then ac_cv_path_$1="$ac_dir/$ac_word" break fi fi done IFS="$ac_save_ifs" dnl If no 4th arg is given, leave the cache variable unset, dnl so AC_PATH_PROGS will keep looking. ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4" ])dnl ;; esac])dnl $1="$ac_cv_path_$1" if test ifelse([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then AC_MSG_RESULT([$]$1) else AC_MSG_RESULT(no) fi AC_SUBST($1)dnl ]) # GLIB_WITH_NLS #----------------- glib_DEFUN([GLIB_WITH_NLS], dnl NLS is obligatory [USE_NLS=yes AC_SUBST(USE_NLS) gt_cv_have_gettext=no CATOBJEXT=NONE XGETTEXT=: INTLLIBS= AC_CHECK_HEADER(libintl.h, [gt_cv_func_dgettext_libintl="no" libintl_extra_libs="" # # First check in libc # AC_CACHE_CHECK([for ngettext in libc], gt_cv_func_ngettext_libc, [AC_TRY_LINK([ #include ], [return !ngettext ("","", 1)], gt_cv_func_ngettext_libc=yes, gt_cv_func_ngettext_libc=no) ]) if test "$gt_cv_func_ngettext_libc" = "yes" ; then AC_CACHE_CHECK([for dgettext in libc], gt_cv_func_dgettext_libc, [AC_TRY_LINK([ #include ], [return !dgettext ("","")], gt_cv_func_dgettext_libc=yes, gt_cv_func_dgettext_libc=no) ]) fi if test "$gt_cv_func_ngettext_libc" = "yes" ; then AC_CHECK_FUNCS(bind_textdomain_codeset) fi # # If we don't have everything we want, check in libintl # if test "$gt_cv_func_dgettext_libc" != "yes" \ || test "$gt_cv_func_ngettext_libc" != "yes" \ || test "$ac_cv_func_bind_textdomain_codeset" != "yes" ; then AC_CHECK_LIB(intl, bindtextdomain, [AC_CHECK_LIB(intl, ngettext, [AC_CHECK_LIB(intl, dgettext, gt_cv_func_dgettext_libintl=yes)])]) if test "$gt_cv_func_dgettext_libintl" != "yes" ; then AC_MSG_CHECKING([if -liconv is needed to use gettext]) AC_MSG_RESULT([]) AC_CHECK_LIB(intl, ngettext, [AC_CHECK_LIB(intl, dcgettext, [gt_cv_func_dgettext_libintl=yes libintl_extra_libs=-liconv], :,-liconv)], :,-liconv) fi # # If we found libintl, then check in it for bind_textdomain_codeset(); # we'll prefer libc if neither have bind_textdomain_codeset(), # and both have dgettext and ngettext # if test "$gt_cv_func_dgettext_libintl" = "yes" ; then glib_save_LIBS="$LIBS" LIBS="$LIBS -lintl $libintl_extra_libs" unset ac_cv_func_bind_textdomain_codeset AC_CHECK_FUNCS(bind_textdomain_codeset) LIBS="$glib_save_LIBS" if test "$ac_cv_func_bind_textdomain_codeset" = "yes" ; then gt_cv_func_dgettext_libc=no else if test "$gt_cv_func_dgettext_libc" = "yes" \ && test "$gt_cv_func_ngettext_libc" = "yes"; then gt_cv_func_dgettext_libintl=no fi fi fi fi if test "$gt_cv_func_dgettext_libc" = "yes" \ || test "$gt_cv_func_dgettext_libintl" = "yes"; then gt_cv_have_gettext=yes fi if test "$gt_cv_func_dgettext_libintl" = "yes"; then INTLLIBS="-lintl $libintl_extra_libs" fi if test "$gt_cv_have_gettext" = "yes"; then AC_DEFINE(HAVE_GETTEXT,1, [Define if the GNU gettext() function is already present or preinstalled.]) GLIB_PATH_PROG_WITH_TEST(MSGFMT, msgfmt, [test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"], no)dnl if test "$MSGFMT" != "no"; then glib_save_LIBS="$LIBS" LIBS="$LIBS $INTLLIBS" AC_CHECK_FUNCS(dcgettext) MSGFMT_OPTS= AC_MSG_CHECKING([if msgfmt accepts -c]) GLIB_RUN_PROG([$MSGFMT -c -o /dev/null],[ msgid "" msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Project-Id-Version: test 1.0\n" "PO-Revision-Date: 2007-02-15 12:01+0100\n" "Last-Translator: test \n" "Language-Team: C \n" "MIME-Version: 1.0\n" "Content-Transfer-Encoding: 8bit\n" ], [MSGFMT_OPTS=-c; AC_MSG_RESULT([yes])], [AC_MSG_RESULT([no])]) AC_SUBST(MSGFMT_OPTS) AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) GLIB_PATH_PROG_WITH_TEST(XGETTEXT, xgettext, [test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"], :) AC_TRY_LINK(, [extern int _nl_msg_cat_cntr; return _nl_msg_cat_cntr], [CATOBJEXT=.gmo DATADIRNAME=share], [case $host in *-*-solaris*) dnl On Solaris, if bind_textdomain_codeset is in libc, dnl GNU format message catalog is always supported, dnl since both are added to the libc all together. dnl Hence, we'd like to go with DATADIRNAME=share and dnl and CATOBJEXT=.gmo in this case. AC_CHECK_FUNC(bind_textdomain_codeset, [CATOBJEXT=.gmo DATADIRNAME=share], [CATOBJEXT=.mo DATADIRNAME=lib]) ;; *-*-openbsd*) CATOBJEXT=.mo DATADIRNAME=share ;; *) CATOBJEXT=.mo DATADIRNAME=lib ;; esac]) LIBS="$glib_save_LIBS" INSTOBJEXT=.mo else gt_cv_have_gettext=no fi fi ]) if test "$gt_cv_have_gettext" = "yes" ; then AC_DEFINE(ENABLE_NLS, 1, [always defined to indicate that i18n is enabled]) fi dnl Test whether we really found GNU xgettext. if test "$XGETTEXT" != ":"; then dnl If it is not GNU xgettext we define it as : so that the dnl Makefiles still can work. if $XGETTEXT --omit-header /dev/null 2> /dev/null; then : ; else AC_MSG_RESULT( [found xgettext program is not GNU xgettext; ignore it]) XGETTEXT=":" fi fi # We need to process the po/ directory. POSUB=po AC_OUTPUT_COMMANDS( [case "$CONFIG_FILES" in *po/Makefile.in*) sed -e "/POTFILES =/r po/POTFILES" po/Makefile.in > po/Makefile esac]) dnl These rules are solely for the distribution goal. While doing this dnl we only have to keep exactly one list of the available catalogs dnl in configure.ac. for lang in $ALL_LINGUAS; do GMOFILES="$GMOFILES $lang.gmo" POFILES="$POFILES $lang.po" done dnl Make all variables we use known to autoconf. AC_SUBST(CATALOGS) AC_SUBST(CATOBJEXT) AC_SUBST(DATADIRNAME) AC_SUBST(GMOFILES) AC_SUBST(INSTOBJEXT) AC_SUBST(INTLLIBS) AC_SUBST(PO_IN_DATADIR_TRUE) AC_SUBST(PO_IN_DATADIR_FALSE) AC_SUBST(POFILES) AC_SUBST(POSUB) ]) # AM_GLIB_GNU_GETTEXT # ------------------- # Do checks necessary for use of gettext. If a suitable implementation # of gettext is found in either in libintl or in the C library, # it will set INTLLIBS to the libraries needed for use of gettext # and AC_DEFINE() HAVE_GETTEXT and ENABLE_NLS. (The shell variable # gt_cv_have_gettext will be set to "yes".) It will also call AC_SUBST() # on various variables needed by the Makefile.in.in installed by # glib-gettextize. dnl glib_DEFUN([GLIB_GNU_GETTEXT], [AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_HEADER_STDC])dnl GLIB_LC_MESSAGES GLIB_WITH_NLS if test "$gt_cv_have_gettext" = "yes"; then if test "x$ALL_LINGUAS" = "x"; then LINGUAS= else AC_MSG_CHECKING(for catalogs to be installed) NEW_LINGUAS= for presentlang in $ALL_LINGUAS; do useit=no if test "%UNSET%" != "${LINGUAS-%UNSET%}"; then desiredlanguages="$LINGUAS" else desiredlanguages="$ALL_LINGUAS" fi for desiredlang in $desiredlanguages; do # Use the presentlang catalog if desiredlang is # a. equal to presentlang, or # b. a variant of presentlang (because in this case, # presentlang can be used as a fallback for messages # which are not translated in the desiredlang catalog). case "$desiredlang" in "$presentlang"*) useit=yes;; esac done if test $useit = yes; then NEW_LINGUAS="$NEW_LINGUAS $presentlang" fi done LINGUAS=$NEW_LINGUAS AC_MSG_RESULT($LINGUAS) fi dnl Construct list of names of catalog files to be constructed. if test -n "$LINGUAS"; then for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done fi fi dnl If the AC_CONFIG_AUX_DIR macro for autoconf is used we possibly dnl find the mkinstalldirs script in another subdir but ($top_srcdir). dnl Try to locate is. MKINSTALLDIRS= if test -n "$ac_aux_dir"; then MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs" fi if test -z "$MKINSTALLDIRS"; then MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs" fi AC_SUBST(MKINSTALLDIRS) dnl Generate list of files to be processed by xgettext which will dnl be included in po/Makefile. test -d po || mkdir po if test "x$srcdir" != "x."; then if test "x`echo $srcdir | sed 's@/.*@@'`" = "x"; then posrcprefix="$srcdir/" else posrcprefix="../$srcdir/" fi else posrcprefix="../" fi rm -f po/POTFILES sed -e "/^#/d" -e "/^\$/d" -e "s,.*, $posrcprefix& \\\\," -e "\$s/\(.*\) \\\\/\1/" \ < $srcdir/po/POTFILES.in > po/POTFILES ]) # AM_GLIB_DEFINE_LOCALEDIR(VARIABLE) # ------------------------------- # Define VARIABLE to the location where catalog files will # be installed by po/Makefile. glib_DEFUN([GLIB_DEFINE_LOCALEDIR], [glib_REQUIRE([GLIB_GNU_GETTEXT])dnl glib_save_prefix="$prefix" glib_save_exec_prefix="$exec_prefix" glib_save_datarootdir="$datarootdir" test "x$prefix" = xNONE && prefix=$ac_default_prefix test "x$exec_prefix" = xNONE && exec_prefix=$prefix datarootdir=`eval echo "${datarootdir}"` if test "x$CATOBJEXT" = "x.mo" ; then localedir=`eval echo "${libdir}/locale"` else localedir=`eval echo "${datadir}/locale"` fi prefix="$glib_save_prefix" exec_prefix="$glib_save_exec_prefix" datarootdir="$glib_save_datarootdir" AC_DEFINE_UNQUOTED($1, "$localedir", [Define the location where the catalogs will be installed]) ]) dnl dnl Now the definitions that aclocal will find dnl ifdef(glib_configure_ac,[],[ AC_DEFUN([AM_GLIB_GNU_GETTEXT],[GLIB_GNU_GETTEXT($@)]) AC_DEFUN([AM_GLIB_DEFINE_LOCALEDIR],[GLIB_DEFINE_LOCALEDIR($@)]) ])dnl # GLIB_RUN_PROG(PROGRAM, TEST-FILE, [ACTION-IF-PASS], [ACTION-IF-FAIL]) # # Create a temporary file with TEST-FILE as its contents and pass the # file name to PROGRAM. Perform ACTION-IF-PASS if PROGRAM exits with # 0 and perform ACTION-IF-FAIL for any other exit status. AC_DEFUN([GLIB_RUN_PROG], [cat >conftest.foo <<_ACEOF $2 _ACEOF if AC_RUN_LOG([$1 conftest.foo]); then m4_ifval([$3], [$3], [:]) m4_ifvaln([$4], [else $4])dnl echo "$as_me: failed input was:" >&AS_MESSAGE_LOG_FD sed 's/^/| /' conftest.foo >&AS_MESSAGE_LOG_FD fi]) # pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- # serial 1 (pkg-config-0.24) # # Copyright © 2004 Scott James Remnant . # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # PKG_PROG_PKG_CONFIG([MIN-VERSION]) # ---------------------------------- AC_DEFUN([PKG_PROG_PKG_CONFIG], [m4_pattern_forbid([^_?PKG_[A-Z_]+$]) m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$]) m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$]) AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility]) AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path]) AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path]) if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) fi if test -n "$PKG_CONFIG"; then _pkg_min_version=m4_default([$1], [0.9.0]) AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) PKG_CONFIG="" fi fi[]dnl ])# PKG_PROG_PKG_CONFIG # PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) # # Check to see whether a particular set of modules exists. Similar # to PKG_CHECK_MODULES(), but does not set variables or print errors. # # Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) # only at the first occurence in configure.ac, so if the first place # it's called might be skipped (such as if it is within an "if", you # have to call PKG_CHECK_EXISTS manually # -------------------------------------------------------------- AC_DEFUN([PKG_CHECK_EXISTS], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl if test -n "$PKG_CONFIG" && \ AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then m4_default([$2], [:]) m4_ifvaln([$3], [else $3])dnl fi]) # _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) # --------------------------------------------- m4_define([_PKG_CONFIG], [if test -n "$$1"; then pkg_cv_[]$1="$$1" elif test -n "$PKG_CONFIG"; then PKG_CHECK_EXISTS([$3], [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes ], [pkg_failed=yes]) else pkg_failed=untried fi[]dnl ])# _PKG_CONFIG # _PKG_SHORT_ERRORS_SUPPORTED # ----------------------------- AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], [AC_REQUIRE([PKG_PROG_PKG_CONFIG]) if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi[]dnl ])# _PKG_SHORT_ERRORS_SUPPORTED # PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], # [ACTION-IF-NOT-FOUND]) # # # Note that if there is a possibility the first call to # PKG_CHECK_MODULES might not happen, you should be sure to include an # explicit call to PKG_PROG_PKG_CONFIG in your configure.ac # # # -------------------------------------------------------------- AC_DEFUN([PKG_CHECK_MODULES], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl pkg_failed=no AC_MSG_CHECKING([for $1]) _PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) _PKG_CONFIG([$1][_LIBS], [libs], [$2]) m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS and $1[]_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details.]) if test $pkg_failed = yes; then AC_MSG_RESULT([no]) _PKG_SHORT_ERRORS_SUPPORTED if test $_pkg_short_errors_supported = yes; then $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1` else $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD m4_default([$4], [AC_MSG_ERROR( [Package requirements ($2) were not met: $$1_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. _PKG_TEXT])[]dnl ]) elif test $pkg_failed = untried; then AC_MSG_RESULT([no]) m4_default([$4], [AC_MSG_FAILURE( [The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. _PKG_TEXT To get pkg-config, see .])[]dnl ]) else $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS $1[]_LIBS=$pkg_cv_[]$1[]_LIBS AC_MSG_RESULT([yes]) $3 fi[]dnl ])# PKG_CHECK_MODULES # Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.11' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.11.1], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) # _AM_AUTOCONF_VERSION(VERSION) # ----------------------------- # aclocal traces this macro to find the Autoconf version. # This is a private macro too. Using m4_define simplifies # the logic in aclocal, which can simply ignore this definition. m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.11.1])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to # `$srcdir', `$srcdir/..', or `$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is `.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [dnl Rely on autoconf to set up CDPATH properly. AC_PREREQ([2.50])dnl # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 9 # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ(2.52)dnl ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 10 # There are a few dirty hacks below to avoid letting `AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. # NAME is "CC", "CXX", "GCJ", or "OBJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular # dependency, and given that the user is not expected to run this macro, # just rely on AC_PROG_CC. AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl ifelse([$1], CC, [depcc="$CC" am_compiler_list=], [$1], CXX, [depcc="$CXX" am_compiler_list=], [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], UPC, [depcc="$UPC" am_compiler_list=], [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi am__universal=false m4_case([$1], [CC], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac], [CXX], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac]) for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvisualcpp | msvcmsys) # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE(dependency-tracking, [ --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. #serial 5 # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # Autoconf 2.62 quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`AS_DIRNAME("$mf")` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running `make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # When using ansi2knr, U may be empty or an underscore; expand it U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` AS_MKDIR_P([$dirpart/$fdir]) # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ])# _AM_OUTPUT_DEPENDENCY_COMMANDS # AM_OUTPUT_DEPENDENCY_COMMANDS # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking # is enabled. FIXME. This creates each `.P' file that we will # need in order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) # Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 8 # AM_CONFIG_HEADER is obsolete. It has been replaced by AC_CONFIG_HEADERS. AU_DEFUN([AM_CONFIG_HEADER], [AC_CONFIG_HEADERS($@)]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, # 2005, 2006, 2008, 2009 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 16 # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.62])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) AM_MISSING_PROG(AUTOCONF, autoconf) AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) AM_MISSING_PROG(AUTOHEADER, autoheader) AM_MISSING_PROG(MAKEINFO, makeinfo) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AM_PROG_MKDIR_P])dnl # We need awk for the "check" target. The system "awk" is bad on # some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES(CC)], [define([AC_PROG_CC], defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES(CXX)], [define([AC_PROG_CXX], defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES(OBJC)], [define([AC_PROG_OBJC], defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl ]) _AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl dnl The `parallel-tests' driver may need to know about EXEEXT, so add the dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro dnl is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl ]) dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001, 2003, 2005, 2008 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST(install_sh)]) # Copyright (C) 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 2 # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001, 2002, 2003, 2005, 2009 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 4 # AM_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. AC_MSG_CHECKING([for style of include used by $am_make]) am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from `make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi AC_SUBST([am__include]) AC_SUBST([am__quote]) AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) # Copyright (C) 1999, 2000, 2001, 2003, 2004, 2005, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 6 # AM_PROG_CC_C_O # -------------- # Like AC_PROG_CC_C_O, but changed for automake. AC_DEFUN([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC_C_O])dnl AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([compile])dnl # FIXME: we rely on the cache variable name because # there is no other way. set dummy $CC am_cc=`echo $[2] | sed ['s/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/']` eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o if test "$am_t" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi dnl Make sure AC_PROG_CC is never called again, or it will override our dnl setting of CC. m4_define([AC_PROG_CC], [m4_fatal([AC_PROG_CC cannot be called after AM_PROG_CC_C_O])]) ]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 6 # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it supports --run. # If it does, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= AC_MSG_WARN([`missing' script is too old or missing]) fi ]) # Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_MKDIR_P # --------------- # Check for `mkdir -p'. AC_DEFUN([AM_PROG_MKDIR_P], [AC_PREREQ([2.60])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, dnl while keeping a definition of mkdir_p for backward compatibility. dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of dnl Makefile.ins that do not define MKDIR_P, so we do our own dnl adjustment using top_builddir (which is defined more often than dnl MKDIR_P). AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl case $mkdir_p in [[\\/$]]* | ?:[[\\/]]*) ;; */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; esac ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001, 2002, 2003, 2005, 2008 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 4 # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # ------------------------------ # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), 1)]) # _AM_SET_OPTIONS(OPTIONS) # ---------------------------------- # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 5 # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Just in case sleep 1 echo timestamp > conftest.file # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);; esac # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi rm -f conftest.file if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT(yes)]) # Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor `install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in `make install-strip', and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be `maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Copyright (C) 2006, 2008 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 2 # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 2 # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of `v7', `ustar', or `pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. AM_MISSING_PROG([AMTAR], [tar]) m4_if([$1], [v7], [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'], [m4_case([$1], [ustar],, [pax],, [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' _am_tools=${am_cv_prog_tar_$1-$_am_tools} # Do not fold the above two line into one, because Tru64 sh and # Solaris sh will not grok spaces in the rhs of `-'. for _am_tool in $_am_tools do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR nabi-1.0.0/Makefile.am0000644000175000017500000000111611657732374011414 00000000000000SUBDIRS = IMdkit src tables themes po nabilogodir = @NABI_DATA_DIR@ nabilogo_DATA = nabi.png nabi.svg nabi-about.png testclients = \ test/Makefile \ test/xlib.cpp \ test/gtk.c \ test/gtk1.c \ test/qt.cpp EXTRA_DIST = config.rpath $(nabilogo_DATA) $(testclients) ChangeLog.0 .PHONY: log log: unset LC_ALL; \ export LANG=C ; \ export LC_CTYPE=ko_KR.UTF-8 ; \ git log --name-status --date=iso > ChangeLog dist-hook: if test -d .git; then \ unset LC_ALL; \ export LANG=C ; \ export LC_CTYPE=ko_KR.UTF-8 ; \ git log --name-status --date=iso > $(distdir)/ChangeLog ; \ fi nabi-1.0.0/Makefile.in0000644000175000017500000006075712066005053011423 00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = . DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(srcdir)/config.h.in \ $(top_srcdir)/configure ABOUT-NLS AUTHORS COPYING ChangeLog \ INSTALL NEWS TODO compile config.rpath depcomp install-sh \ missing mkinstalldirs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(nabilogodir)" DATA = $(nabilogo_DATA) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir dist dist-all distcheck ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ { test ! -d "$(distdir)" \ || { find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -fr "$(distdir)"; }; } am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best distuninstallcheck_listfiles = find . -type f -print distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ LDFLAGS = @LDFLAGS@ LIBHANGUL_CFLAGS = @LIBHANGUL_CFLAGS@ LIBHANGUL_LIBS = @LIBHANGUL_LIBS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ NABI_DATA_DIR = @NABI_DATA_DIR@ NABI_THEMES_DIR = @NABI_THEMES_DIR@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = IMdkit src tables themes po nabilogodir = @NABI_DATA_DIR@ nabilogo_DATA = nabi.png nabi.svg nabi-about.png testclients = \ test/Makefile \ test/xlib.cpp \ test/gtk.c \ test/gtk1.c \ test/qt.cpp EXTRA_DIST = config.rpath $(nabilogo_DATA) $(testclients) ChangeLog.0 all: config.h $(MAKE) $(AM_MAKEFLAGS) all-recursive .SUFFIXES: am--refresh: @: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --gnu'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: $(am__configure_deps) $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): config.h: stamp-h1 @if test ! -f $@; then \ rm -f stamp-h1; \ $(MAKE) $(AM_MAKEFLAGS) stamp-h1; \ else :; fi stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status @rm -f stamp-h1 cd $(top_builddir) && $(SHELL) ./config.status config.h $(srcdir)/config.h.in: $(am__configure_deps) ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) rm -f stamp-h1 touch $@ distclean-hdr: -rm -f config.h stamp-h1 install-nabilogoDATA: $(nabilogo_DATA) @$(NORMAL_INSTALL) test -z "$(nabilogodir)" || $(MKDIR_P) "$(DESTDIR)$(nabilogodir)" @list='$(nabilogo_DATA)'; test -n "$(nabilogodir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(nabilogodir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(nabilogodir)" || exit $$?; \ done uninstall-nabilogoDATA: @$(NORMAL_UNINSTALL) @list='$(nabilogo_DATA)'; test -n "$(nabilogodir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(nabilogodir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(nabilogodir)" && rm -f $$files # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) $(am__remove_distdir) test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$(top_distdir)" distdir="$(distdir)" \ dist-hook -test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2 $(am__remove_distdir) dist-lzma: distdir tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma $(am__remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | xz -c >$(distdir).tar.xz $(am__remove_distdir) dist-tarZ: distdir tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__remove_distdir) dist-shar: distdir shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__remove_distdir) dist dist-all: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lzma*) \ lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir); chmod a+w $(distdir) mkdir $(distdir)/_build mkdir $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build \ && ../configure --srcdir=.. --prefix="$$dc_install_base" \ $(DISTCHECK_CONFIGURE_FLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 $(am__remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @$(am__cd) '$(distuninstallcheck_dir)' \ && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am check: check-recursive all-am: Makefile $(DATA) config.h installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(nabilogodir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am distclean-generic distclean-hdr distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-nabilogoDATA install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-nabilogoDATA .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all \ ctags-recursive install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am am--refresh check check-am clean clean-generic \ ctags ctags-recursive dist dist-all dist-bzip2 dist-gzip \ dist-hook dist-lzma dist-shar dist-tarZ dist-xz dist-zip \ distcheck distclean distclean-generic distclean-hdr \ distclean-tags distcleancheck distdir distuninstallcheck dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-nabilogoDATA \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic pdf pdf-am ps ps-am tags \ tags-recursive uninstall uninstall-am uninstall-nabilogoDATA .PHONY: log log: unset LC_ALL; \ export LANG=C ; \ export LC_CTYPE=ko_KR.UTF-8 ; \ git log --name-status --date=iso > ChangeLog dist-hook: if test -d .git; then \ unset LC_ALL; \ export LANG=C ; \ export LC_CTYPE=ko_KR.UTF-8 ; \ git log --name-status --date=iso > $(distdir)/ChangeLog ; \ fi # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: nabi-1.0.0/config.h.in0000644000175000017500000001203412066005066011366 00000000000000/* config.h.in. Generated from configure.ac by autoheader. */ /* Define to 1 if the `closedir' function returns void instead of `int'. */ #undef CLOSEDIR_VOID /* Define default hangul keyboard */ #undef DEFAULT_KEYBOARD /* Define default icon theme */ #undef DEFAULT_THEME /* always defined to indicate that i18n is enabled */ #undef ENABLE_NLS /* gettext package name */ #undef GETTEXT_PACKAGE /* Define to 1 if you have the `bind_textdomain_codeset' function. */ #undef HAVE_BIND_TEXTDOMAIN_CODESET /* Define to 1 if you have the `dcgettext' function. */ #undef HAVE_DCGETTEXT /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_DIRENT_H /* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */ #undef HAVE_DOPRNT /* Define to 1 if you have the `gethostname' function. */ #undef HAVE_GETHOSTNAME /* Define if the GNU gettext() function is already present or preinstalled. */ #undef HAVE_GETTEXT /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_LANGINFO_H /* Define if your file defines LC_MESSAGES. */ #undef HAVE_LC_MESSAGES /* Define to 1 if you have the header file. */ #undef HAVE_LIBINTL_H /* Define to 1 if you have the libSM library. */ #undef HAVE_LIBSM /* Define to 1 if you have the header file. */ #undef HAVE_LOCALE_H /* Define to 1 if you have the `localtime_r' function. */ #undef HAVE_LOCALTIME_R /* Define to 1 if your system has a GNU libc compatible `malloc' function, and to 0 otherwise. */ #undef HAVE_MALLOC /* Define to 1 if you have the `memmove' function. */ #undef HAVE_MEMMOVE /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the `memset' function. */ #undef HAVE_MEMSET /* Define to 1 if you have the `mkdir' function. */ #undef HAVE_MKDIR /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_NDIR_H /* Define to 1 if you have the `putenv' function. */ #undef HAVE_PUTENV /* Define to 1 if your system has a GNU libc compatible `realloc' function, and to 0 otherwise. */ #undef HAVE_REALLOC /* Define to 1 if you have the `setlocale' function. */ #undef HAVE_SETLOCALE /* Define to 1 if you have the header file. */ #undef HAVE_STDDEF_H /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the `strchr' function. */ #undef HAVE_STRCHR /* Define to 1 if you have the `strdup' function. */ #undef HAVE_STRDUP /* Define to 1 if you have the `strftime' function. */ #undef HAVE_STRFTIME /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the `strtol' function. */ #undef HAVE_STRTOL /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_SYS_DIR_H /* Define to 1 if you have the header file, and it defines `DIR'. */ #undef HAVE_SYS_NDIR_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_PARAM_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define to 1 if you have the `vprintf' function. */ #undef HAVE_VPRINTF /* Define to 1 if you want to use debug code */ #undef NABI_DEBUG /* Define to 1 if your C compiler doesn't accept -c and -o together. */ #undef NO_MINUS_C_MINUS_O /* Name of package */ #undef PACKAGE /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Define to 1 if your declares `struct tm'. */ #undef TM_IN_SYS_TIME /* Version number of package */ #undef VERSION /* Define to 1 if the X Window System is missing or not being used. */ #undef X_DISPLAY_MISSING /* Define to empty if `const' does not conform to ANSI C. */ #undef const /* Define to `__inline__' or `__inline' if that's what the C compiler calls it, or to nothing if 'inline' is not supported under any name. */ #ifndef __cplusplus #undef inline #endif /* Define to rpl_malloc if the replacement function should be used. */ #undef malloc /* Define to rpl_realloc if the replacement function should be used. */ #undef realloc /* Define to `unsigned int' if does not define. */ #undef size_t nabi-1.0.0/configure0000755000175000017500000071327312066005054011264 00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.65 for nabi 1.0.0. # # Report bugs to . # # # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, # 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV export CONFIG_SHELL exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org and $0: http://code.google.com/p/nabi/ about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error ERROR [LINENO LOG_FD] # --------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with status $?, using 1 if that was 0. as_fn_error () { as_status=$?; test $as_status -eq 0 && as_status=1 if test "$3"; then as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3 fi $as_echo "$as_me: error: $1" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in #( -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='nabi' PACKAGE_TARNAME='nabi' PACKAGE_VERSION='1.0.0' PACKAGE_STRING='nabi 1.0.0' PACKAGE_BUGREPORT='http://code.google.com/p/nabi/' PACKAGE_URL='' # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS NABI_THEMES_DIR NABI_DATA_DIR GETTEXT_PACKAGE MKINSTALLDIRS POSUB POFILES PO_IN_DATADIR_FALSE PO_IN_DATADIR_TRUE INTLLIBS INSTOBJEXT GMOFILES DATADIRNAME CATOBJEXT CATALOGS XGETTEXT GMSGFMT MSGFMT_OPTS MSGFMT USE_NLS LIBHANGUL_LIBS LIBHANGUL_CFLAGS GTK_LIBS GTK_CFLAGS PKG_CONFIG_LIBDIR PKG_CONFIG_PATH PKG_CONFIG X_EXTRA_LIBS X_LIBS X_PRE_LIBS X_CFLAGS LIBOBJS EGREP GREP CPP XMKMF RANLIB am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_dependency_tracking with_x enable_debug with_default_keyboard with_default_theme ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS XMKMF CPP PKG_CONFIG PKG_CONFIG_PATH PKG_CONFIG_LIBDIR GTK_CFLAGS GTK_LIBS LIBHANGUL_CFLAGS LIBHANGUL_LIBS' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error "unrecognized option: \`$ac_option' Try \`$0 --help' for more information." ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. If a cross compiler is detected then cross compile mode will be used." >&2 elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures nabi 1.0.0 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/nabi] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names X features: --x-includes=DIR X include files are in DIR --x-libraries=DIR X library files are in DIR _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of nabi 1.0.0:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors --enable-debug include debug code Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-x use the X Window System --with-default-keyboard=2/39/3f default hangul keyboard --with-default-theme=THEME default icon theme Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory XMKMF Path to xmkmf, Makefile generator for X Window System CPP C preprocessor PKG_CONFIG path to pkg-config utility PKG_CONFIG_PATH directories to add to pkg-config's search path PKG_CONFIG_LIBDIR path overriding pkg-config's built-in search path GTK_CFLAGS C compiler flags for GTK, overriding pkg-config GTK_LIBS linker flags for GTK, overriding pkg-config LIBHANGUL_CFLAGS C compiler flags for LIBHANGUL, overriding pkg-config LIBHANGUL_LIBS linker flags for LIBHANGUL, overriding pkg-config Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF nabi configure 1.0.0 generated by GNU Autoconf 2.65 Copyright (C) 2009 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ( cat <<\_ASBOX ## --------------------------------------------- ## ## Report this to http://code.google.com/p/nabi/ ## ## --------------------------------------------- ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} } # ac_fn_c_check_header_mongrel # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} } # ac_fn_c_check_header_compile # ac_fn_c_check_type LINENO TYPE VAR INCLUDES # ------------------------------------------- # Tests whether TYPE exists after having included INCLUDES, setting cache # variable VAR accordingly. ac_fn_c_check_type () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof ($2)) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof (($2))) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else eval "$3=yes" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} } # ac_fn_c_check_type # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} } # ac_fn_c_check_func cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by nabi $as_me 1.0.0, which was generated by GNU Autoconf 2.65. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo cat <<\_ASBOX ## ---------------- ## ## Cache variables. ## ## ---------------- ## _ASBOX echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo cat <<\_ASBOX ## ----------------- ## ## Output variables. ## ## ----------------- ## _ASBOX echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then cat <<\_ASBOX ## ------------------- ## ## File substitutions. ## ## ------------------- ## _ASBOX echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then cat <<\_ASBOX ## ----------- ## ## confdefs.h. ## ## ----------- ## _ASBOX echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then ac_site_file1=$CONFIG_SITE elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu am__api_version='1.11' ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do for ac_t in install-sh install.sh shtool; do if test -f "$ac_dir/$ac_t"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/$ac_t -c" break 2 fi done done if test -z "$ac_aux_dir"; then as_fn_error "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if test "${ac_cv_path_install+set}" = set; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Just in case sleep 1 echo timestamp > conftest.file # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;; esac # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi rm -f conftest.file if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi test "$2" = conftest.file ) then # Ok. : else as_fn_error "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} fi if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_STRIP+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if test "${ac_cv_path_mkdir+set}" = set; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } mkdir_p="$MKDIR_P" case $mkdir_p in [\\/$]* | ?:[\\/]*) ;; */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; esac for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_AWK+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='nabi' VERSION='1.0.0' cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. AMTAR=${AMTAR-"${am_missing_run}tar"} am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -' ac_config_headers="$ac_config_headers config.h" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error "no acceptable C compiler found in \$PATH See \`config.log' for more details." "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { as_fn_set_status 77 as_fn_error "C compiler cannot create executables See \`config.log' for more details." "$LINENO" 5; }; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details." "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details." "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if test "${ac_cv_objext+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error "cannot compute suffix of object files: cannot compile See \`config.log' for more details." "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if test "${ac_cv_c_compiler_gnu+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if test "${ac_cv_prog_cc_g+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if test "${ac_cv_prog_cc_c89+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from `make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf # Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvisualcpp | msvcmsys) # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi if test "x$CC" != xcc; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC and cc understand -c and -o together" >&5 $as_echo_n "checking whether $CC and cc understand -c and -o together... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cc understands -c and -o together" >&5 $as_echo_n "checking whether cc understands -c and -o together... " >&6; } fi set dummy $CC; ac_cc=`$as_echo "$2" | sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` if { as_var=ac_cv_prog_cc_${ac_cc}_c_o; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF # Make sure it works both with $CC and with simple cc. # We do the test twice because some compilers refuse to overwrite an # existing .o file with -o, though they will create one. ac_try='$CC -c conftest.$ac_ext -o conftest2.$ac_objext >&5' rm -f conftest2.* if { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -f conftest2.$ac_objext && { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then eval ac_cv_prog_cc_${ac_cc}_c_o=yes if test "x$CC" != xcc; then # Test first that cc exists at all. if { ac_try='cc -c conftest.$ac_ext >&5' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then ac_try='cc -c conftest.$ac_ext -o conftest2.$ac_objext >&5' rm -f conftest2.* if { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -f conftest2.$ac_objext && { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # cc works too. : else # cc exists but doesn't like -o. eval ac_cv_prog_cc_${ac_cc}_c_o=no fi fi fi else eval ac_cv_prog_cc_${ac_cc}_c_o=no fi rm -f core conftest* fi if eval test \$ac_cv_prog_cc_${ac_cc}_c_o = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "#define NO_MINUS_C_MINUS_O 1" >>confdefs.h fi # FIXME: we rely on the cache variable name because # there is no other way. set dummy $CC am_cc=`echo $2 | sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o if test "$am_t" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_RANLIB+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if test "${ac_cv_prog_CPP+set}" = set; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details." "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for X" >&5 $as_echo_n "checking for X... " >&6; } # Check whether --with-x was given. if test "${with_x+set}" = set; then : withval=$with_x; fi # $have_x is `yes', `no', `disabled', or empty when we do not yet know. if test "x$with_x" = xno; then # The user explicitly disabled X. have_x=disabled else case $x_includes,$x_libraries in #( *\'*) as_fn_error "cannot use X directory names containing '" "$LINENO" 5;; #( *,NONE | NONE,*) if test "${ac_cv_have_x+set}" = set; then : $as_echo_n "(cached) " >&6 else # One or both of the vars are not set, and there is no cached value. ac_x_includes=no ac_x_libraries=no rm -f -r conftest.dir if mkdir conftest.dir; then cd conftest.dir cat >Imakefile <<'_ACEOF' incroot: @echo incroot='${INCROOT}' usrlibdir: @echo usrlibdir='${USRLIBDIR}' libdir: @echo libdir='${LIBDIR}' _ACEOF if (export CC; ${XMKMF-xmkmf}) >/dev/null 2>/dev/null && test -f Makefile; then # GNU make sometimes prints "make[1]: Entering...", which would confuse us. for ac_var in incroot usrlibdir libdir; do eval "ac_im_$ac_var=\`\${MAKE-make} $ac_var 2>/dev/null | sed -n 's/^$ac_var=//p'\`" done # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR. for ac_extension in a so sl dylib la dll; do if test ! -f "$ac_im_usrlibdir/libX11.$ac_extension" && test -f "$ac_im_libdir/libX11.$ac_extension"; then ac_im_usrlibdir=$ac_im_libdir; break fi done # Screen out bogus values from the imake configuration. They are # bogus both because they are the default anyway, and because # using them would break gcc on systems where it needs fixed includes. case $ac_im_incroot in /usr/include) ac_x_includes= ;; *) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes=$ac_im_incroot;; esac case $ac_im_usrlibdir in /usr/lib | /usr/lib64 | /lib | /lib64) ;; *) test -d "$ac_im_usrlibdir" && ac_x_libraries=$ac_im_usrlibdir ;; esac fi cd .. rm -f -r conftest.dir fi # Standard set of common directories for X headers. # Check X11 before X11Rn because it is often a symlink to the current release. ac_x_header_dirs=' /usr/X11/include /usr/X11R7/include /usr/X11R6/include /usr/X11R5/include /usr/X11R4/include /usr/include/X11 /usr/include/X11R7 /usr/include/X11R6 /usr/include/X11R5 /usr/include/X11R4 /usr/local/X11/include /usr/local/X11R7/include /usr/local/X11R6/include /usr/local/X11R5/include /usr/local/X11R4/include /usr/local/include/X11 /usr/local/include/X11R7 /usr/local/include/X11R6 /usr/local/include/X11R5 /usr/local/include/X11R4 /usr/X386/include /usr/x386/include /usr/XFree86/include/X11 /usr/include /usr/local/include /usr/unsupported/include /usr/athena/include /usr/local/x11r5/include /usr/lpp/Xamples/include /usr/openwin/include /usr/openwin/share/include' if test "$ac_x_includes" = no; then # Guess where to find include files, by looking for Xlib.h. # First, try using that file with no special directory specified. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # We can compile using X headers with no special include directory. ac_x_includes= else for ac_dir in $ac_x_header_dirs; do if test -r "$ac_dir/X11/Xlib.h"; then ac_x_includes=$ac_dir break fi done fi rm -f conftest.err conftest.$ac_ext fi # $ac_x_includes = no if test "$ac_x_libraries" = no; then # Check for the libraries. # See if we find them without any special options. # Don't add to $LIBS permanently. ac_save_LIBS=$LIBS LIBS="-lX11 $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { XrmInitialize () ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : LIBS=$ac_save_LIBS # We can link X programs with no special library path. ac_x_libraries= else LIBS=$ac_save_LIBS for ac_dir in `$as_echo "$ac_x_includes $ac_x_header_dirs" | sed s/include/lib/g` do # Don't even attempt the hair of trying to link an X program! for ac_extension in a so sl dylib la dll; do if test -r "$ac_dir/libX11.$ac_extension"; then ac_x_libraries=$ac_dir break 2 fi done done fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi # $ac_x_libraries = no case $ac_x_includes,$ac_x_libraries in #( no,* | *,no | *\'*) # Didn't find X, or a directory has "'" in its name. ac_cv_have_x="have_x=no";; #( *) # Record where we found X for the cache. ac_cv_have_x="have_x=yes\ ac_x_includes='$ac_x_includes'\ ac_x_libraries='$ac_x_libraries'" esac fi ;; #( *) have_x=yes;; esac eval "$ac_cv_have_x" fi # $with_x != no if test "$have_x" != yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_x" >&5 $as_echo "$have_x" >&6; } no_x=yes else # If each of the values was on the command line, it overrides each guess. test "x$x_includes" = xNONE && x_includes=$ac_x_includes test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries # Update the cache value to reflect the command line values. ac_cv_have_x="have_x=yes\ ac_x_includes='$x_includes'\ ac_x_libraries='$x_libraries'" { $as_echo "$as_me:${as_lineno-$LINENO}: result: libraries $x_libraries, headers $x_includes" >&5 $as_echo "libraries $x_libraries, headers $x_includes" >&6; } fi ac_header_dirent=no for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do as_ac_Header=`$as_echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_hdr that defines DIR" >&5 $as_echo_n "checking for $ac_hdr that defines DIR... " >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include <$ac_hdr> int main () { if ((DIR *) 0) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$as_ac_Header=yes" else eval "$as_ac_Header=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$as_ac_Header { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval as_val=\$$as_ac_Header if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_hdr" | $as_tr_cpp` 1 _ACEOF ac_header_dirent=$ac_hdr; break fi done # Two versions of opendir et al. are in -ldir and -lx on SCO Xenix. if test $ac_header_dirent = dirent.h; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 $as_echo_n "checking for library containing opendir... " >&6; } if test "${ac_cv_search_opendir+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char opendir (); int main () { return opendir (); ; return 0; } _ACEOF for ac_lib in '' dir; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_opendir=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if test "${ac_cv_search_opendir+set}" = set; then : break fi done if test "${ac_cv_search_opendir+set}" = set; then : else ac_cv_search_opendir=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 $as_echo "$ac_cv_search_opendir" >&6; } ac_res=$ac_cv_search_opendir if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 $as_echo_n "checking for library containing opendir... " >&6; } if test "${ac_cv_search_opendir+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char opendir (); int main () { return opendir (); ; return 0; } _ACEOF for ac_lib in '' x; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_opendir=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if test "${ac_cv_search_opendir+set}" = set; then : break fi done if test "${ac_cv_search_opendir+set}" = set; then : else ac_cv_search_opendir=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 $as_echo "$ac_cv_search_opendir" >&6; } ac_res=$ac_cv_search_opendir if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if test "${ac_cv_path_GREP+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if test "${ac_cv_path_EGREP+set}" = set; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if test "${ac_cv_header_stdc+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " eval as_val=\$$as_ac_Header if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in langinfo.h libintl.h locale.h stddef.h stdint.h stdlib.h string.h sys/param.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" eval as_val=\$$as_ac_Header if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 $as_echo_n "checking for an ANSI C-conforming const... " >&6; } if test "${ac_cv_c_const+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { /* FIXME: Include the comments suggested by Paul. */ #ifndef __cplusplus /* Ultrix mips cc rejects this. */ typedef int charset[2]; const charset cs; /* SunOS 4.1.1 cc rejects this. */ char const *const *pcpcc; char **ppc; /* NEC SVR4.0.2 mips cc rejects this. */ struct point {int x, y;}; static struct point const zero = {0,0}; /* AIX XL C 1.02.0.0 rejects this. It does not let you subtract one const X* pointer from another in an arm of an if-expression whose if-part is not a constant expression */ const char *g = "string"; pcpcc = &g + (g ? g-g : 0); /* HPUX 7.0 cc rejects these. */ ++pcpcc; ppc = (char**) pcpcc; pcpcc = (char const *const *) ppc; { /* SCO 3.2v4 cc rejects this. */ char *t; char const *s = 0 ? (char *) 0 : (char const *) 0; *t++ = 0; if (s) return 0; } { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ int x[] = {25, 17}; const int *foo = &x[0]; ++foo; } { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ typedef const int *iptr; iptr p = 0; ++p; } { /* AIX XL C 1.02.0.0 rejects this saying "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ struct s { int j; const int *ap[3]; }; struct s *b; b->j = 5; } { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ const int foo = 10; if (!foo) return 0; } return !cs[0] && !zero.x; #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_const=yes else ac_cv_c_const=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 $as_echo "$ac_cv_c_const" >&6; } if test $ac_cv_c_const = no; then $as_echo "#define const /**/" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 $as_echo_n "checking for inline... " >&6; } if test "${ac_cv_c_inline+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_cv_c_inline=no for ac_kw in inline __inline__ __inline; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __cplusplus typedef int foo_t; static $ac_kw foo_t static_foo () {return 0; } $ac_kw foo_t foo () {return 0; } #endif _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_inline=$ac_kw fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext test "$ac_cv_c_inline" != no && break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 $as_echo "$ac_cv_c_inline" >&6; } case $ac_cv_c_inline in inline | yes) ;; *) case $ac_cv_c_inline in no) ac_val=;; *) ac_val=$ac_cv_c_inline;; esac cat >>confdefs.h <<_ACEOF #ifndef __cplusplus #define inline $ac_val #endif _ACEOF ;; esac ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" if test "x$ac_cv_type_size_t" = x""yes; then : else cat >>confdefs.h <<_ACEOF #define size_t unsigned int _ACEOF fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether struct tm is in sys/time.h or time.h" >&5 $as_echo_n "checking whether struct tm is in sys/time.h or time.h... " >&6; } if test "${ac_cv_struct_tm+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { struct tm tm; int *p = &tm.tm_sec; return !p; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_struct_tm=time.h else ac_cv_struct_tm=sys/time.h fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_struct_tm" >&5 $as_echo "$ac_cv_struct_tm" >&6; } if test $ac_cv_struct_tm = sys/time.h; then $as_echo "#define TM_IN_SYS_TIME 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether closedir returns void" >&5 $as_echo_n "checking whether closedir returns void... " >&6; } if test "${ac_cv_func_closedir_void+set}" = set; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_closedir_void=yes else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default #include <$ac_header_dirent> #ifndef __cplusplus int closedir (); #endif int main () { return closedir (opendir (".")) != 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_closedir_void=no else ac_cv_func_closedir_void=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_closedir_void" >&5 $as_echo "$ac_cv_func_closedir_void" >&6; } if test $ac_cv_func_closedir_void = yes; then $as_echo "#define CLOSEDIR_VOID 1" >>confdefs.h fi for ac_header in stdlib.h do : ac_fn_c_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default" if test "x$ac_cv_header_stdlib_h" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STDLIB_H 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU libc compatible malloc" >&5 $as_echo_n "checking for GNU libc compatible malloc... " >&6; } if test "${ac_cv_func_malloc_0_nonnull+set}" = set; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_malloc_0_nonnull=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined STDC_HEADERS || defined HAVE_STDLIB_H # include #else char *malloc (); #endif int main () { return ! malloc (0); ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_malloc_0_nonnull=yes else ac_cv_func_malloc_0_nonnull=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_malloc_0_nonnull" >&5 $as_echo "$ac_cv_func_malloc_0_nonnull" >&6; } if test $ac_cv_func_malloc_0_nonnull = yes; then : $as_echo "#define HAVE_MALLOC 1" >>confdefs.h else $as_echo "#define HAVE_MALLOC 0" >>confdefs.h case " $LIBOBJS " in *" malloc.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS malloc.$ac_objext" ;; esac $as_echo "#define malloc rpl_malloc" >>confdefs.h fi for ac_header in stdlib.h do : ac_fn_c_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default" if test "x$ac_cv_header_stdlib_h" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STDLIB_H 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU libc compatible realloc" >&5 $as_echo_n "checking for GNU libc compatible realloc... " >&6; } if test "${ac_cv_func_realloc_0_nonnull+set}" = set; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_realloc_0_nonnull=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined STDC_HEADERS || defined HAVE_STDLIB_H # include #else char *realloc (); #endif int main () { return ! realloc (0, 0); ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_realloc_0_nonnull=yes else ac_cv_func_realloc_0_nonnull=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_realloc_0_nonnull" >&5 $as_echo "$ac_cv_func_realloc_0_nonnull" >&6; } if test $ac_cv_func_realloc_0_nonnull = yes; then : $as_echo "#define HAVE_REALLOC 1" >>confdefs.h else $as_echo "#define HAVE_REALLOC 0" >>confdefs.h case " $LIBOBJS " in *" realloc.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS realloc.$ac_objext" ;; esac $as_echo "#define realloc rpl_realloc" >>confdefs.h fi for ac_func in vprintf do : ac_fn_c_check_func "$LINENO" "vprintf" "ac_cv_func_vprintf" if test "x$ac_cv_func_vprintf" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_VPRINTF 1 _ACEOF ac_fn_c_check_func "$LINENO" "_doprnt" "ac_cv_func__doprnt" if test "x$ac_cv_func__doprnt" = x""yes; then : $as_echo "#define HAVE_DOPRNT 1" >>confdefs.h fi fi done for ac_func in strftime do : ac_fn_c_check_func "$LINENO" "strftime" "ac_cv_func_strftime" if test "x$ac_cv_func_strftime" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRFTIME 1 _ACEOF else # strftime is in -lintl on SCO UNIX. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for strftime in -lintl" >&5 $as_echo_n "checking for strftime in -lintl... " >&6; } if test "${ac_cv_lib_intl_strftime+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char strftime (); int main () { return strftime (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_intl_strftime=yes else ac_cv_lib_intl_strftime=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_strftime" >&5 $as_echo "$ac_cv_lib_intl_strftime" >&6; } if test "x$ac_cv_lib_intl_strftime" = x""yes; then : $as_echo "#define HAVE_STRFTIME 1" >>confdefs.h LIBS="-lintl $LIBS" fi fi done for ac_func in gethostname memmove memset mkdir putenv setlocale strchr strdup strtol localtime_r do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" eval as_val=\$$as_ac_var if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done if test "$no_x" = yes; then # Not all programs may use this symbol, but it does not hurt to define it. $as_echo "#define X_DISPLAY_MISSING 1" >>confdefs.h X_CFLAGS= X_PRE_LIBS= X_LIBS= X_EXTRA_LIBS= else if test -n "$x_includes"; then X_CFLAGS="$X_CFLAGS -I$x_includes" fi # It would also be nice to do this for all -L options, not just this one. if test -n "$x_libraries"; then X_LIBS="$X_LIBS -L$x_libraries" # For Solaris; some versions of Sun CC require a space after -R and # others require no space. Words are not sufficient . . . . { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -R must be followed by a space" >&5 $as_echo_n "checking whether -R must be followed by a space... " >&6; } ac_xsave_LIBS=$LIBS; LIBS="$LIBS -R$x_libraries" ac_xsave_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } X_LIBS="$X_LIBS -R$x_libraries" else LIBS="$ac_xsave_LIBS -R $x_libraries" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } X_LIBS="$X_LIBS -R $x_libraries" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: neither works" >&5 $as_echo "neither works" >&6; } fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ac_c_werror_flag=$ac_xsave_c_werror_flag LIBS=$ac_xsave_LIBS fi # Check for system-dependent libraries X programs must link with. # Do this before checking for the system-independent R6 libraries # (-lICE), since we may need -lsocket or whatever for X linking. if test "$ISC" = yes; then X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl_s -linet" else # Martyn Johnson says this is needed for Ultrix, if the X # libraries were built with DECnet support. And Karl Berry says # the Alpha needs dnet_stub (dnet does not exist). ac_xsave_LIBS="$LIBS"; LIBS="$LIBS $X_LIBS -lX11" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char XOpenDisplay (); int main () { return XOpenDisplay (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dnet_ntoa in -ldnet" >&5 $as_echo_n "checking for dnet_ntoa in -ldnet... " >&6; } if test "${ac_cv_lib_dnet_dnet_ntoa+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldnet $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dnet_ntoa (); int main () { return dnet_ntoa (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dnet_dnet_ntoa=yes else ac_cv_lib_dnet_dnet_ntoa=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dnet_dnet_ntoa" >&5 $as_echo "$ac_cv_lib_dnet_dnet_ntoa" >&6; } if test "x$ac_cv_lib_dnet_dnet_ntoa" = x""yes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet" fi if test $ac_cv_lib_dnet_dnet_ntoa = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dnet_ntoa in -ldnet_stub" >&5 $as_echo_n "checking for dnet_ntoa in -ldnet_stub... " >&6; } if test "${ac_cv_lib_dnet_stub_dnet_ntoa+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldnet_stub $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dnet_ntoa (); int main () { return dnet_ntoa (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dnet_stub_dnet_ntoa=yes else ac_cv_lib_dnet_stub_dnet_ntoa=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dnet_stub_dnet_ntoa" >&5 $as_echo "$ac_cv_lib_dnet_stub_dnet_ntoa" >&6; } if test "x$ac_cv_lib_dnet_stub_dnet_ntoa" = x""yes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub" fi fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$ac_xsave_LIBS" # msh@cis.ufl.edu says -lnsl (and -lsocket) are needed for his 386/AT, # to get the SysV transport functions. # Chad R. Larson says the Pyramis MIS-ES running DC/OSx (SVR4) # needs -lnsl. # The nsl library prevents programs from opening the X display # on Irix 5.2, according to T.E. Dickey. # The functions gethostbyname, getservbyname, and inet_addr are # in -lbsd on LynxOS 3.0.1/i386, according to Lars Hecking. ac_fn_c_check_func "$LINENO" "gethostbyname" "ac_cv_func_gethostbyname" if test "x$ac_cv_func_gethostbyname" = x""yes; then : fi if test $ac_cv_func_gethostbyname = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lnsl" >&5 $as_echo_n "checking for gethostbyname in -lnsl... " >&6; } if test "${ac_cv_lib_nsl_gethostbyname+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lnsl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gethostbyname (); int main () { return gethostbyname (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_nsl_gethostbyname=yes else ac_cv_lib_nsl_gethostbyname=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_gethostbyname" >&5 $as_echo "$ac_cv_lib_nsl_gethostbyname" >&6; } if test "x$ac_cv_lib_nsl_gethostbyname" = x""yes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl" fi if test $ac_cv_lib_nsl_gethostbyname = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lbsd" >&5 $as_echo_n "checking for gethostbyname in -lbsd... " >&6; } if test "${ac_cv_lib_bsd_gethostbyname+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lbsd $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gethostbyname (); int main () { return gethostbyname (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_bsd_gethostbyname=yes else ac_cv_lib_bsd_gethostbyname=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bsd_gethostbyname" >&5 $as_echo "$ac_cv_lib_bsd_gethostbyname" >&6; } if test "x$ac_cv_lib_bsd_gethostbyname" = x""yes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -lbsd" fi fi fi # lieder@skyler.mavd.honeywell.com says without -lsocket, # socket/setsockopt and other routines are undefined under SCO ODT # 2.0. But -lsocket is broken on IRIX 5.2 (and is not necessary # on later versions), says Simon Leinen: it contains gethostby* # variants that don't use the name server (or something). -lsocket # must be given before -lnsl if both are needed. We assume that # if connect needs -lnsl, so does gethostbyname. ac_fn_c_check_func "$LINENO" "connect" "ac_cv_func_connect" if test "x$ac_cv_func_connect" = x""yes; then : fi if test $ac_cv_func_connect = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for connect in -lsocket" >&5 $as_echo_n "checking for connect in -lsocket... " >&6; } if test "${ac_cv_lib_socket_connect+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsocket $X_EXTRA_LIBS $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char connect (); int main () { return connect (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_socket_connect=yes else ac_cv_lib_socket_connect=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_connect" >&5 $as_echo "$ac_cv_lib_socket_connect" >&6; } if test "x$ac_cv_lib_socket_connect" = x""yes; then : X_EXTRA_LIBS="-lsocket $X_EXTRA_LIBS" fi fi # Guillermo Gomez says -lposix is necessary on A/UX. ac_fn_c_check_func "$LINENO" "remove" "ac_cv_func_remove" if test "x$ac_cv_func_remove" = x""yes; then : fi if test $ac_cv_func_remove = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for remove in -lposix" >&5 $as_echo_n "checking for remove in -lposix... " >&6; } if test "${ac_cv_lib_posix_remove+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lposix $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char remove (); int main () { return remove (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_posix_remove=yes else ac_cv_lib_posix_remove=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_posix_remove" >&5 $as_echo "$ac_cv_lib_posix_remove" >&6; } if test "x$ac_cv_lib_posix_remove" = x""yes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix" fi fi # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay. ac_fn_c_check_func "$LINENO" "shmat" "ac_cv_func_shmat" if test "x$ac_cv_func_shmat" = x""yes; then : fi if test $ac_cv_func_shmat = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shmat in -lipc" >&5 $as_echo_n "checking for shmat in -lipc... " >&6; } if test "${ac_cv_lib_ipc_shmat+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lipc $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char shmat (); int main () { return shmat (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_ipc_shmat=yes else ac_cv_lib_ipc_shmat=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ipc_shmat" >&5 $as_echo "$ac_cv_lib_ipc_shmat" >&6; } if test "x$ac_cv_lib_ipc_shmat" = x""yes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -lipc" fi fi fi # Check for libraries that X11R6 Xt/Xaw programs need. ac_save_LDFLAGS=$LDFLAGS test -n "$x_libraries" && LDFLAGS="$LDFLAGS -L$x_libraries" # SM needs ICE to (dynamically) link under SunOS 4.x (so we have to # check for ICE first), but we must link in the order -lSM -lICE or # we get undefined symbols. So assume we have SM if we have ICE. # These have to be linked with before -lX11, unlike the other # libraries we check for below, so use a different variable. # John Interrante, Karl Berry { $as_echo "$as_me:${as_lineno-$LINENO}: checking for IceConnectionNumber in -lICE" >&5 $as_echo_n "checking for IceConnectionNumber in -lICE... " >&6; } if test "${ac_cv_lib_ICE_IceConnectionNumber+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lICE $X_EXTRA_LIBS $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char IceConnectionNumber (); int main () { return IceConnectionNumber (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_ICE_IceConnectionNumber=yes else ac_cv_lib_ICE_IceConnectionNumber=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ICE_IceConnectionNumber" >&5 $as_echo "$ac_cv_lib_ICE_IceConnectionNumber" >&6; } if test "x$ac_cv_lib_ICE_IceConnectionNumber" = x""yes; then : X_PRE_LIBS="$X_PRE_LIBS -lSM -lICE" fi LDFLAGS=$ac_save_LDFLAGS fi case $X_PRE_LIBS in *"-lSM"*) cat >>confdefs.h <<_ACEOF #define HAVE_LIBSM 1 _ACEOF esac # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_path_PKG_CONFIG+set}" = set; then : $as_echo_n "(cached) " >&6 else case $PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_PKG_CONFIG" && ac_cv_path_PKG_CONFIG="as_fn_error "nabi needs pkg-config" "$LINENO" 5" ;; esac fi PKG_CONFIG=$ac_cv_path_PKG_CONFIG if test -n "$PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 $as_echo "$PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_path_PKG_CONFIG+set}" = set; then : $as_echo_n "(cached) " >&6 else case $PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PKG_CONFIG=$ac_cv_path_PKG_CONFIG if test -n "$PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 $as_echo "$PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_path_PKG_CONFIG"; then ac_pt_PKG_CONFIG=$PKG_CONFIG # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_path_ac_pt_PKG_CONFIG+set}" = set; then : $as_echo_n "(cached) " >&6 else case $ac_pt_PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG if test -n "$ac_pt_PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 $as_echo "$ac_pt_PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_pt_PKG_CONFIG" = x; then PKG_CONFIG="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac PKG_CONFIG=$ac_pt_PKG_CONFIG fi else PKG_CONFIG="$ac_cv_path_PKG_CONFIG" fi fi if test -n "$PKG_CONFIG"; then _pkg_min_version=0.9.0 { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 $as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } PKG_CONFIG="" fi fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GTK" >&5 $as_echo_n "checking for GTK... " >&6; } if test -n "$GTK_CFLAGS"; then pkg_cv_GTK_CFLAGS="$GTK_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk+-2.0 >= 2.4.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "gtk+-2.0 >= 2.4.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GTK_CFLAGS=`$PKG_CONFIG --cflags "gtk+-2.0 >= 2.4.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$GTK_LIBS"; then pkg_cv_GTK_LIBS="$GTK_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk+-2.0 >= 2.4.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "gtk+-2.0 >= 2.4.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GTK_LIBS=`$PKG_CONFIG --libs "gtk+-2.0 >= 2.4.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then GTK_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "gtk+-2.0 >= 2.4.0" 2>&1` else GTK_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "gtk+-2.0 >= 2.4.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$GTK_PKG_ERRORS" >&5 as_fn_error "nabi needs GTK+ 2.4.0 or higher" "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } as_fn_error "nabi needs GTK+ 2.4.0 or higher" "$LINENO" 5 else GTK_CFLAGS=$pkg_cv_GTK_CFLAGS GTK_LIBS=$pkg_cv_GTK_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi # checks for libhangul pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBHANGUL" >&5 $as_echo_n "checking for LIBHANGUL... " >&6; } if test -n "$LIBHANGUL_CFLAGS"; then pkg_cv_LIBHANGUL_CFLAGS="$LIBHANGUL_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libhangul >= 0.1.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "libhangul >= 0.1.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LIBHANGUL_CFLAGS=`$PKG_CONFIG --cflags "libhangul >= 0.1.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$LIBHANGUL_LIBS"; then pkg_cv_LIBHANGUL_LIBS="$LIBHANGUL_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libhangul >= 0.1.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "libhangul >= 0.1.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LIBHANGUL_LIBS=`$PKG_CONFIG --libs "libhangul >= 0.1.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then LIBHANGUL_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libhangul >= 0.1.0" 2>&1` else LIBHANGUL_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libhangul >= 0.1.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$LIBHANGUL_PKG_ERRORS" >&5 as_fn_error "nabi needs libhangul 0.1.0 or higher" "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } as_fn_error "nabi needs libhangul 0.1.0 or higher" "$LINENO" 5 else LIBHANGUL_CFLAGS=$pkg_cv_LIBHANGUL_CFLAGS LIBHANGUL_LIBS=$pkg_cv_LIBHANGUL_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi ALL_LINGUAS="ko de" for ac_header in locale.h do : ac_fn_c_check_header_mongrel "$LINENO" "locale.h" "ac_cv_header_locale_h" "$ac_includes_default" if test "x$ac_cv_header_locale_h" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LOCALE_H 1 _ACEOF fi done if test $ac_cv_header_locale_h = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LC_MESSAGES" >&5 $as_echo_n "checking for LC_MESSAGES... " >&6; } if test "${am_cv_val_LC_MESSAGES+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { return LC_MESSAGES ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : am_cv_val_LC_MESSAGES=yes else am_cv_val_LC_MESSAGES=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_val_LC_MESSAGES" >&5 $as_echo "$am_cv_val_LC_MESSAGES" >&6; } if test $am_cv_val_LC_MESSAGES = yes; then $as_echo "#define HAVE_LC_MESSAGES 1" >>confdefs.h fi fi USE_NLS=yes gt_cv_have_gettext=no CATOBJEXT=NONE XGETTEXT=: INTLLIBS= ac_fn_c_check_header_mongrel "$LINENO" "libintl.h" "ac_cv_header_libintl_h" "$ac_includes_default" if test "x$ac_cv_header_libintl_h" = x""yes; then : gt_cv_func_dgettext_libintl="no" libintl_extra_libs="" # # First check in libc # { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ngettext in libc" >&5 $as_echo_n "checking for ngettext in libc... " >&6; } if test "${gt_cv_func_ngettext_libc+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { return !ngettext ("","", 1) ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gt_cv_func_ngettext_libc=yes else gt_cv_func_ngettext_libc=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_ngettext_libc" >&5 $as_echo "$gt_cv_func_ngettext_libc" >&6; } if test "$gt_cv_func_ngettext_libc" = "yes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dgettext in libc" >&5 $as_echo_n "checking for dgettext in libc... " >&6; } if test "${gt_cv_func_dgettext_libc+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { return !dgettext ("","") ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gt_cv_func_dgettext_libc=yes else gt_cv_func_dgettext_libc=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_dgettext_libc" >&5 $as_echo "$gt_cv_func_dgettext_libc" >&6; } fi if test "$gt_cv_func_ngettext_libc" = "yes" ; then for ac_func in bind_textdomain_codeset do : ac_fn_c_check_func "$LINENO" "bind_textdomain_codeset" "ac_cv_func_bind_textdomain_codeset" if test "x$ac_cv_func_bind_textdomain_codeset" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_BIND_TEXTDOMAIN_CODESET 1 _ACEOF fi done fi # # If we don't have everything we want, check in libintl # if test "$gt_cv_func_dgettext_libc" != "yes" \ || test "$gt_cv_func_ngettext_libc" != "yes" \ || test "$ac_cv_func_bind_textdomain_codeset" != "yes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for bindtextdomain in -lintl" >&5 $as_echo_n "checking for bindtextdomain in -lintl... " >&6; } if test "${ac_cv_lib_intl_bindtextdomain+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char bindtextdomain (); int main () { return bindtextdomain (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_intl_bindtextdomain=yes else ac_cv_lib_intl_bindtextdomain=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_bindtextdomain" >&5 $as_echo "$ac_cv_lib_intl_bindtextdomain" >&6; } if test "x$ac_cv_lib_intl_bindtextdomain" = x""yes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ngettext in -lintl" >&5 $as_echo_n "checking for ngettext in -lintl... " >&6; } if test "${ac_cv_lib_intl_ngettext+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char ngettext (); int main () { return ngettext (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_intl_ngettext=yes else ac_cv_lib_intl_ngettext=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_ngettext" >&5 $as_echo "$ac_cv_lib_intl_ngettext" >&6; } if test "x$ac_cv_lib_intl_ngettext" = x""yes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dgettext in -lintl" >&5 $as_echo_n "checking for dgettext in -lintl... " >&6; } if test "${ac_cv_lib_intl_dgettext+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dgettext (); int main () { return dgettext (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_intl_dgettext=yes else ac_cv_lib_intl_dgettext=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_dgettext" >&5 $as_echo "$ac_cv_lib_intl_dgettext" >&6; } if test "x$ac_cv_lib_intl_dgettext" = x""yes; then : gt_cv_func_dgettext_libintl=yes fi fi fi if test "$gt_cv_func_dgettext_libintl" != "yes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if -liconv is needed to use gettext" >&5 $as_echo_n "checking if -liconv is needed to use gettext... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 $as_echo "" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ngettext in -lintl" >&5 $as_echo_n "checking for ngettext in -lintl... " >&6; } if test "${ac_cv_lib_intl_ngettext+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl -liconv $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char ngettext (); int main () { return ngettext (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_intl_ngettext=yes else ac_cv_lib_intl_ngettext=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_ngettext" >&5 $as_echo "$ac_cv_lib_intl_ngettext" >&6; } if test "x$ac_cv_lib_intl_ngettext" = x""yes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dcgettext in -lintl" >&5 $as_echo_n "checking for dcgettext in -lintl... " >&6; } if test "${ac_cv_lib_intl_dcgettext+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl -liconv $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dcgettext (); int main () { return dcgettext (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_intl_dcgettext=yes else ac_cv_lib_intl_dcgettext=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_dcgettext" >&5 $as_echo "$ac_cv_lib_intl_dcgettext" >&6; } if test "x$ac_cv_lib_intl_dcgettext" = x""yes; then : gt_cv_func_dgettext_libintl=yes libintl_extra_libs=-liconv else : fi else : fi fi # # If we found libintl, then check in it for bind_textdomain_codeset(); # we'll prefer libc if neither have bind_textdomain_codeset(), # and both have dgettext and ngettext # if test "$gt_cv_func_dgettext_libintl" = "yes" ; then glib_save_LIBS="$LIBS" LIBS="$LIBS -lintl $libintl_extra_libs" unset ac_cv_func_bind_textdomain_codeset for ac_func in bind_textdomain_codeset do : ac_fn_c_check_func "$LINENO" "bind_textdomain_codeset" "ac_cv_func_bind_textdomain_codeset" if test "x$ac_cv_func_bind_textdomain_codeset" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_BIND_TEXTDOMAIN_CODESET 1 _ACEOF fi done LIBS="$glib_save_LIBS" if test "$ac_cv_func_bind_textdomain_codeset" = "yes" ; then gt_cv_func_dgettext_libc=no else if test "$gt_cv_func_dgettext_libc" = "yes" \ && test "$gt_cv_func_ngettext_libc" = "yes"; then gt_cv_func_dgettext_libintl=no fi fi fi fi if test "$gt_cv_func_dgettext_libc" = "yes" \ || test "$gt_cv_func_dgettext_libintl" = "yes"; then gt_cv_have_gettext=yes fi if test "$gt_cv_func_dgettext_libintl" = "yes"; then INTLLIBS="-lintl $libintl_extra_libs" fi if test "$gt_cv_have_gettext" = "yes"; then $as_echo "#define HAVE_GETTEXT 1" >>confdefs.h # Extract the first word of "msgfmt", so it can be a program name with args. set dummy msgfmt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_path_MSGFMT+set}" = set; then : $as_echo_n "(cached) " >&6 else case "$MSGFMT" in /*) ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path. ;; *) IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then if test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"; then ac_cv_path_MSGFMT="$ac_dir/$ac_word" break fi fi done IFS="$ac_save_ifs" test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT="no" ;; esac fi MSGFMT="$ac_cv_path_MSGFMT" if test "$MSGFMT" != "no"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGFMT" >&5 $as_echo "$MSGFMT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "$MSGFMT" != "no"; then glib_save_LIBS="$LIBS" LIBS="$LIBS $INTLLIBS" for ac_func in dcgettext do : ac_fn_c_check_func "$LINENO" "dcgettext" "ac_cv_func_dcgettext" if test "x$ac_cv_func_dcgettext" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_DCGETTEXT 1 _ACEOF fi done MSGFMT_OPTS= { $as_echo "$as_me:${as_lineno-$LINENO}: checking if msgfmt accepts -c" >&5 $as_echo_n "checking if msgfmt accepts -c... " >&6; } cat >conftest.foo <<_ACEOF msgid "" msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Project-Id-Version: test 1.0\n" "PO-Revision-Date: 2007-02-15 12:01+0100\n" "Last-Translator: test \n" "Language-Team: C \n" "MIME-Version: 1.0\n" "Content-Transfer-Encoding: 8bit\n" _ACEOF if { { $as_echo "$as_me:${as_lineno-$LINENO}: \$MSGFMT -c -o /dev/null conftest.foo"; } >&5 ($MSGFMT -c -o /dev/null conftest.foo) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then MSGFMT_OPTS=-c; { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } echo "$as_me: failed input was:" >&5 sed 's/^/| /' conftest.foo >&5 fi # Extract the first word of "gmsgfmt", so it can be a program name with args. set dummy gmsgfmt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_path_GMSGFMT+set}" = set; then : $as_echo_n "(cached) " >&6 else case $GMSGFMT in [\\/]* | ?:[\\/]*) ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_GMSGFMT="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT" ;; esac fi GMSGFMT=$ac_cv_path_GMSGFMT if test -n "$GMSGFMT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GMSGFMT" >&5 $as_echo "$GMSGFMT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "xgettext", so it can be a program name with args. set dummy xgettext; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_path_XGETTEXT+set}" = set; then : $as_echo_n "(cached) " >&6 else case "$XGETTEXT" in /*) ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path. ;; *) IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then if test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"; then ac_cv_path_XGETTEXT="$ac_dir/$ac_word" break fi fi done IFS="$ac_save_ifs" test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":" ;; esac fi XGETTEXT="$ac_cv_path_XGETTEXT" if test "$XGETTEXT" != ":"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XGETTEXT" >&5 $as_echo "$XGETTEXT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { extern int _nl_msg_cat_cntr; return _nl_msg_cat_cntr ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : CATOBJEXT=.gmo DATADIRNAME=share else case $host in *-*-solaris*) ac_fn_c_check_func "$LINENO" "bind_textdomain_codeset" "ac_cv_func_bind_textdomain_codeset" if test "x$ac_cv_func_bind_textdomain_codeset" = x""yes; then : CATOBJEXT=.gmo DATADIRNAME=share else CATOBJEXT=.mo DATADIRNAME=lib fi ;; *-*-openbsd*) CATOBJEXT=.mo DATADIRNAME=share ;; *) CATOBJEXT=.mo DATADIRNAME=lib ;; esac fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$glib_save_LIBS" INSTOBJEXT=.mo else gt_cv_have_gettext=no fi fi fi if test "$gt_cv_have_gettext" = "yes" ; then $as_echo "#define ENABLE_NLS 1" >>confdefs.h fi if test "$XGETTEXT" != ":"; then if $XGETTEXT --omit-header /dev/null 2> /dev/null; then : ; else { $as_echo "$as_me:${as_lineno-$LINENO}: result: found xgettext program is not GNU xgettext; ignore it" >&5 $as_echo "found xgettext program is not GNU xgettext; ignore it" >&6; } XGETTEXT=":" fi fi # We need to process the po/ directory. POSUB=po ac_config_commands="$ac_config_commands default-1" for lang in $ALL_LINGUAS; do GMOFILES="$GMOFILES $lang.gmo" POFILES="$POFILES $lang.po" done if test "$gt_cv_have_gettext" = "yes"; then if test "x$ALL_LINGUAS" = "x"; then LINGUAS= else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for catalogs to be installed" >&5 $as_echo_n "checking for catalogs to be installed... " >&6; } NEW_LINGUAS= for presentlang in $ALL_LINGUAS; do useit=no if test "%UNSET%" != "${LINGUAS-%UNSET%}"; then desiredlanguages="$LINGUAS" else desiredlanguages="$ALL_LINGUAS" fi for desiredlang in $desiredlanguages; do # Use the presentlang catalog if desiredlang is # a. equal to presentlang, or # b. a variant of presentlang (because in this case, # presentlang can be used as a fallback for messages # which are not translated in the desiredlang catalog). case "$desiredlang" in "$presentlang"*) useit=yes;; esac done if test $useit = yes; then NEW_LINGUAS="$NEW_LINGUAS $presentlang" fi done LINGUAS=$NEW_LINGUAS { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LINGUAS" >&5 $as_echo "$LINGUAS" >&6; } fi if test -n "$LINGUAS"; then for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done fi fi MKINSTALLDIRS= if test -n "$ac_aux_dir"; then MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs" fi if test -z "$MKINSTALLDIRS"; then MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs" fi test -d po || mkdir po if test "x$srcdir" != "x."; then if test "x`echo $srcdir | sed 's@/.*@@'`" = "x"; then posrcprefix="$srcdir/" else posrcprefix="../$srcdir/" fi else posrcprefix="../" fi rm -f po/POTFILES sed -e "/^#/d" -e "/^\$/d" -e "s,.*, $posrcprefix& \\\\," -e "\$s/\(.*\) \\\\/\1/" \ < $srcdir/po/POTFILES.in > po/POTFILES GETTEXT_PACKAGE="$PACKAGE" cat >>confdefs.h <<_ACEOF #define GETTEXT_PACKAGE "$GETTEXT_PACKAGE" _ACEOF NABI_DATA_DIR="${datadir}/$PACKAGE" NABI_THEMES_DIR="${NABI_DATA_DIR}/themes" # configure options # Check whether --enable-debug was given. if test "${enable_debug+set}" = set; then : enableval=$enable_debug; enable_debug=yes else enable_debug=no fi # Check whether --with-default-keyboard was given. if test "${with_default_keyboard+set}" = set; then : withval=$with_default_keyboard; fi case "$with_default_keyboard" in 2) cat >>confdefs.h <<_ACEOF #define DEFAULT_KEYBOARD "2" _ACEOF ;; 39) cat >>confdefs.h <<_ACEOF #define DEFAULT_KEYBOARD "39" _ACEOF ;; 3f) cat >>confdefs.h <<_ACEOF #define DEFAULT_KEYBOARD "3f" _ACEOF ;; *) cat >>confdefs.h <<_ACEOF #define DEFAULT_KEYBOARD "2" _ACEOF ;; esac # default theme { $as_echo "$as_me:${as_lineno-$LINENO}: checking for default theme name" >&5 $as_echo_n "checking for default theme name... " >&6; } # Check whether --with-default-theme was given. if test "${with_default_theme+set}" = set; then : withval=$with_default_theme; fi if test -n "$with_default_theme"; then if test ! -d "themes/$with_default_theme"; then { $as_echo "$as_me:${as_lineno-$LINENO}: there is no such theme directory: $with_default_theme, use default" >&5 $as_echo "$as_me: there is no such theme directory: $with_default_theme, use default" >&6;} with_default_theme="Jini" fi else with_default_theme="Jini" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_default_theme" >&5 $as_echo "$with_default_theme" >&6; } cat >>confdefs.h <<_ACEOF #define DEFAULT_THEME "$with_default_theme" _ACEOF if test "$enable_debug" = "yes"; then $as_echo "#define NABI_DEBUG 1" >>confdefs.h CFLAGS="$CFLAGS -Wall -g" CXXFLAGS="$CXXFLAGS -Wall -g" fi ac_config_files="$ac_config_files Makefile IMdkit/Makefile src/Makefile tables/Makefile themes/Makefile po/Makefile.in" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then test "x$cache_file" != "x/dev/null" && { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} cat confcache >$cache_file else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : ${CONFIG_STATUS=./config.status} ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error ERROR [LINENO LOG_FD] # --------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with status $?, using 1 if that was 0. as_fn_error () { as_status=$?; test $as_status -eq 0 && as_status=1 if test "$3"; then as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3 fi $as_echo "$as_me: error: $1" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in #( -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by nabi $as_me 1.0.0, which was generated by GNU Autoconf 2.65. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration commands: $config_commands Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ nabi config.status 1.0.0 configured by $0, generated by GNU Autoconf 2.65, with options \\"\$ac_cs_config\\" Copyright (C) 2009 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "default-1") CONFIG_COMMANDS="$CONFIG_COMMANDS default-1" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "IMdkit/Makefile") CONFIG_FILES="$CONFIG_FILES IMdkit/Makefile" ;; "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; "tables/Makefile") CONFIG_FILES="$CONFIG_FILES tables/Makefile" ;; "themes/Makefile") CONFIG_FILES="$CONFIG_FILES themes/Makefile" ;; "po/Makefile.in") CONFIG_FILES="$CONFIG_FILES po/Makefile.in" ;; *) as_fn_error "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= trap 'exit_status=$? { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error "cannot create a temporary directory in ." "$LINENO" 5 # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '$'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \ || as_fn_error "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove $(srcdir), # ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=/{ s/:*\$(srcdir):*/:/ s/:*\${srcdir}:*/:/ s/:*@srcdir@:*/:/ s/^\([^=]*=[ ]*\):*/\1/ s/:*$// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_t=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_t"; then break elif $ac_last_try; then as_fn_error "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$tmp/stdin" \ || as_fn_error "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \ || as_fn_error "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined." >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined." >&2;} rm -f "$tmp/stdin" case $ac_file in -) cat "$tmp/out" && rm -f "$tmp/out";; *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; esac \ || as_fn_error "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" } >"$tmp/config.h" \ || as_fn_error "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$tmp/config.h" "$ac_file" \ || as_fn_error "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error "could not create -" "$LINENO" 5 fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$_am_arg" : 'X\(//\)[^/]' \| \ X"$_am_arg" : 'X\(//\)$' \| \ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'`/stamp-h$_am_stamp_count ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Autoconf 2.62 quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running `make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # When using ansi2knr, U may be empty or an underscore; expand it U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir=$dirpart/$fdir; as_fn_mkdir_p # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ;; "default-1":C) case "$CONFIG_FILES" in *po/Makefile.in*) sed -e "/POTFILES =/r po/POTFILES" po/Makefile.in > po/Makefile esac ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit $? fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi nabi-1.0.0/ABOUT-NLS0000644000175000017500000011311311655153252010576 00000000000000Notes on the Free Translation Project ************************************* Free software is going international! The Free Translation Project is a way to get maintainers of free software, translators, and users all together, so that will gradually become able to speak many languages. A few packages already provide translations for their messages. If you found this `ABOUT-NLS' file inside a distribution, you may assume that the distributed package does use GNU `gettext' internally, itself available at your nearest GNU archive site. But you do _not_ need to install GNU `gettext' prior to configuring, installing or using this package with messages translated. Installers will find here some useful hints. These notes also explain how users should proceed for getting the programs to use the available translations. They tell how people wanting to contribute and work at translations should contact the appropriate team. When reporting bugs in the `intl/' directory or bugs which may be related to internationalization, you should tell about the version of `gettext' which is used. The information can be found in the `intl/VERSION' file, in internationalized packages. Quick configuration advice ========================== If you want to exploit the full power of internationalization, you should configure it using ./configure --with-included-gettext to force usage of internationalizing routines provided within this package, despite the existence of internationalizing capabilities in the operating system where this package is being installed. So far, only the `gettext' implementation in the GNU C library version 2 provides as many features (such as locale alias, message inheritance, automatic charset conversion or plural form handling) as the implementation here. It is also not possible to offer this additional functionality on top of a `catgets' implementation. Future versions of GNU `gettext' will very likely convey even more functionality. So it might be a good idea to change to GNU `gettext' as soon as possible. So you need _not_ provide this option if you are using GNU libc 2 or you have installed a recent copy of the GNU gettext package with the included `libintl'. INSTALL Matters =============== Some packages are "localizable" when properly installed; the programs they contain can be made to speak your own native language. Most such packages use GNU `gettext'. Other packages have their own ways to internationalization, predating GNU `gettext'. By default, this package will be installed to allow translation of messages. It will automatically detect whether the system already provides the GNU `gettext' functions. If not, the GNU `gettext' own library will be used. This library is wholly contained within this package, usually in the `intl/' subdirectory, so prior installation of the GNU `gettext' package is _not_ required. Installers may use special options at configuration time for changing the default behaviour. The commands: ./configure --with-included-gettext ./configure --disable-nls will respectively bypass any pre-existing `gettext' to use the internationalizing routines provided within this package, or else, _totally_ disable translation of messages. When you already have GNU `gettext' installed on your system and run configure without an option for your new package, `configure' will probably detect the previously built and installed `libintl.a' file and will decide to use this. This might be not what is desirable. You should use the more recent version of the GNU `gettext' library. I.e. if the file `intl/VERSION' shows that the library which comes with this package is more recent, you should use ./configure --with-included-gettext to prevent auto-detection. The configuration process will not test for the `catgets' function and therefore it will not be used. The reason is that even an emulation of `gettext' on top of `catgets' could not provide all the extensions of the GNU `gettext' library. Internationalized packages have usually many `po/LL.po' files, where LL gives an ISO 639 two-letter code identifying the language. Unless translations have been forbidden at `configure' time by using the `--disable-nls' switch, all available translations are installed together with the package. However, the environment variable `LINGUAS' may be set, prior to configuration, to limit the installed set. `LINGUAS' should then contain a space separated list of two-letter codes, stating which languages are allowed. Using This Package ================== As a user, if your language has been installed for this package, you only have to set the `LANG' environment variable to the appropriate `LL_CC' combination. Here `LL' is an ISO 639 two-letter language code, and `CC' is an ISO 3166 two-letter country code. For example, let's suppose that you speak German and live in Germany. At the shell prompt, merely execute `setenv LANG de_DE' (in `csh'), `export LANG; LANG=de_DE' (in `sh') or `export LANG=de_DE' (in `bash'). This can be done from your `.login' or `.profile' file, once and for all. You might think that the country code specification is redundant. But in fact, some languages have dialects in different countries. For example, `de_AT' is used for Austria, and `pt_BR' for Brazil. The country code serves to distinguish the dialects. The locale naming convention of `LL_CC', with `LL' denoting the language and `CC' denoting the country, is the one use on systems based on GNU libc. On other systems, some variations of this scheme are used, such as `LL' or `LL_CC.ENCODING'. You can get the list of locales supported by your system for your country by running the command `locale -a | grep '^LL''. Not all programs have translations for all languages. By default, an English message is shown in place of a nonexistent translation. If you understand other languages, you can set up a priority list of languages. This is done through a different environment variable, called `LANGUAGE'. GNU `gettext' gives preference to `LANGUAGE' over `LANG' for the purpose of message handling, but you still need to have `LANG' set to the primary language; this is required by other parts of the system libraries. For example, some Swedish users who would rather read translations in German than English for when Swedish is not available, set `LANGUAGE' to `sv:de' while leaving `LANG' to `sv_SE'. In the `LANGUAGE' environment variable, but not in the `LANG' environment variable, `LL_CC' combinations can be abbreviated as `LL' to denote the language's main dialect. For example, `de' is equivalent to `de_DE' (German as spoken in Germany), and `pt' to `pt_PT' (Portuguese as spoken in Portugal) in this context. Translating Teams ================= For the Free Translation Project to be a success, we need interested people who like their own language and write it well, and who are also able to synergize with other translators speaking the same language. Each translation team has its own mailing list. The up-to-date list of teams can be found at the Free Translation Project's homepage, `http://www.iro.umontreal.ca/contrib/po/HTML/', in the "National teams" area. If you'd like to volunteer to _work_ at translating messages, you should become a member of the translating team for your own language. The subscribing address is _not_ the same as the list itself, it has `-request' appended. For example, speakers of Swedish can send a message to `sv-request@li.org', having this message body: subscribe Keep in mind that team members are expected to participate _actively_ in translations, or at solving translational difficulties, rather than merely lurking around. If your team does not exist yet and you want to start one, or if you are unsure about what to do or how to get started, please write to `translation@iro.umontreal.ca' to reach the coordinator for all translator teams. The English team is special. It works at improving and uniformizing the terminology in use. Proven linguistic skill are praised more than programming skill, here. Available Packages ================== Languages are not equally supported in all packages. The following matrix shows the current state of internationalization, as of May 2003. The matrix shows, in regard of each package, for which languages PO files have been submitted to translation coordination, with a translation percentage of at least 50%. Ready PO files am az be bg ca cs da de el en en_GB eo es +-------------------------------------------+ a2ps | [] [] [] [] | aegis | () | anubis | | ap-utils | | bash | [] [] [] | batchelor | | bfd | [] [] | binutils | [] [] | bison | [] [] [] | bluez-pin | [] [] | clisp | | clisp | [] [] [] | coreutils | [] [] [] [] | cpio | [] [] [] | darkstat | () [] | diffutils | [] [] [] [] [] [] [] | e2fsprogs | [] [] | enscript | [] [] [] [] | error | [] [] [] [] [] | fetchmail | [] () [] [] [] [] | fileutils | [] [] [] | findutils | [] [] [] [] [] [] | flex | [] [] [] [] | gas | [] | gawk | [] [] [] [] | gcal | [] | gcc | [] [] | gettext | [] [] [] [] [] | gettext-runtime | [] [] [] [] [] | gettext-tools | [] [] | gimp-print | [] [] [] [] [] | gliv | | glunarclock | [] [] [] | gnucash | () [] | gnucash-glossary | [] () [] | gnupg | [] () [] [] [] [] | gpe-calendar | [] | gpe-conf | [] | gpe-contacts | [] | gpe-edit | | gpe-login | [] | gpe-ownerinfo | [] | gpe-sketchbook | [] | gpe-timesheet | | gpe-today | [] | gpe-todo | [] | gphoto2 | [] [] [] [] | gprof | [] [] | gpsdrive | () () () | grep | [] [] [] [] [] | gretl | [] | hello | [] [] [] [] [] [] | id-utils | [] [] | indent | [] [] [] [] | jpilot | [] [] [] [] | jwhois | [] | kbd | [] [] [] [] [] | ld | [] [] | libc | [] [] [] [] [] [] | libgpewidget | [] | libiconv | [] [] [] [] [] | lifelines | [] () | lilypond | [] | lingoteach | | lingoteach_lessons | () () | lynx | [] [] [] [] | m4 | [] [] [] [] | mailutils | [] [] | make | [] [] [] | man-db | [] () [] [] () | mysecretdiary | [] [] [] | nano | [] () [] [] [] | nano_1_0 | [] () [] [] [] | opcodes | [] [] | parted | [] [] [] [] [] | ptx | [] [] [] [] [] | python | | radius | | recode | [] [] [] [] [] [] | screem | | sed | [] [] [] [] [] | sh-utils | [] [] [] | sharutils | [] [] [] [] [] [] | sketch | [] () [] | soundtracker | [] [] [] | sp | [] | tar | [] [] [] [] | texinfo | [] [] [] [] | textutils | [] [] [] [] | tin | () () | util-linux | [] [] [] [] [] | vorbis-tools | [] [] [] | wastesedge | () | wdiff | [] [] [] [] | wget | [] [] [] [] [] [] [] | xchat | [] [] [] | xpad | | +-------------------------------------------+ am az be bg ca cs da de el en en_GB eo es 0 1 4 2 31 17 54 60 14 1 4 12 56 et fa fi fr ga gl he hr hu id it ja ko +----------------------------------------+ a2ps | [] [] [] () () | aegis | | anubis | [] | ap-utils | [] | bash | [] [] | batchelor | [] | bfd | [] [] | binutils | [] [] | bison | [] [] [] [] | bluez-pin | [] [] [] [] | clisp | | clisp | [] | coreutils | [] [] [] [] | cpio | [] [] [] [] | darkstat | () [] [] [] | diffutils | [] [] [] [] [] [] [] | e2fsprogs | | enscript | [] [] | error | [] [] [] [] | fetchmail | [] | fileutils | [] [] [] [] [] | findutils | [] [] [] [] [] [] [] [] [] [] [] | flex | [] [] | gas | [] | gawk | [] [] | gcal | [] | gcc | [] | gettext | [] [] [] | gettext-runtime | [] [] [] [] | gettext-tools | [] | gimp-print | [] [] | gliv | () | glunarclock | [] [] [] [] | gnucash | [] | gnucash-glossary | [] | gnupg | [] [] [] [] [] [] [] | gpe-calendar | [] | gpe-conf | | gpe-contacts | [] | gpe-edit | [] [] | gpe-login | [] | gpe-ownerinfo | [] [] [] | gpe-sketchbook | [] | gpe-timesheet | [] [] [] | gpe-today | [] [] | gpe-todo | [] [] | gphoto2 | [] [] [] | gprof | [] [] | gpsdrive | () [] () () | grep | [] [] [] [] [] [] [] [] [] [] [] | gretl | [] | hello | [] [] [] [] [] [] [] [] [] [] [] [] [] | id-utils | [] [] [] | indent | [] [] [] [] [] [] [] [] | jpilot | [] () | jwhois | [] [] [] [] | kbd | [] | ld | [] | libc | [] [] [] [] [] [] | libgpewidget | [] [] [] | libiconv | [] [] [] [] [] [] [] [] | lifelines | () | lilypond | [] | lingoteach | [] [] | lingoteach_lessons | | lynx | [] [] [] [] | m4 | [] [] [] [] | mailutils | | make | [] [] [] [] [] [] | man-db | [] () () | mysecretdiary | [] [] | nano | [] [] [] [] | nano_1_0 | [] [] [] [] | opcodes | [] [] | parted | [] [] [] | ptx | [] [] [] [] [] [] [] | python | | radius | | recode | [] [] [] [] [] [] | screem | | sed | [] [] [] [] [] [] [] [] | sh-utils | [] [] [] [] [] [] | sharutils | [] [] [] [] [] | sketch | [] | soundtracker | [] [] [] | sp | [] () | tar | [] [] [] [] [] [] [] [] [] | texinfo | [] [] [] [] | textutils | [] [] [] [] [] | tin | [] () | util-linux | [] [] [] [] () [] | vorbis-tools | [] | wastesedge | () | wdiff | [] [] [] [] [] | wget | [] [] [] [] [] [] [] [] | xchat | [] [] [] | xpad | | +----------------------------------------+ et fa fi fr ga gl he hr hu id it ja ko 20 1 15 73 14 24 8 10 30 31 19 31 9 lg lt lv ms nb nl nn no pl pt pt_BR ro +----------------------------------------+ a2ps | [] [] () () () [] [] | aegis | () | anubis | [] [] | ap-utils | () | bash | [] | batchelor | | bfd | | binutils | | bison | [] [] [] [] | bluez-pin | [] | clisp | | clisp | [] | coreutils | [] | cpio | [] [] [] | darkstat | [] [] [] [] | diffutils | [] [] [] | e2fsprogs | | enscript | [] [] | error | [] [] | fetchmail | () () | fileutils | [] | findutils | [] [] [] [] | flex | [] | gas | | gawk | [] | gcal | | gcc | | gettext | [] | gettext-runtime | [] | gettext-tools | | gimp-print | [] | gliv | [] | glunarclock | [] | gnucash | | gnucash-glossary | [] [] | gnupg | | gpe-calendar | [] [] | gpe-conf | [] [] | gpe-contacts | [] | gpe-edit | [] [] | gpe-login | [] [] | gpe-ownerinfo | [] [] | gpe-sketchbook | [] [] | gpe-timesheet | [] [] | gpe-today | [] [] | gpe-todo | [] [] | gphoto2 | | gprof | [] | gpsdrive | () () () | grep | [] [] [] [] | gretl | | hello | [] [] [] [] [] [] [] [] [] | id-utils | [] [] [] | indent | [] [] [] | jpilot | () () | jwhois | [] [] [] | kbd | | ld | | libc | [] [] [] [] | libgpewidget | [] [] | libiconv | [] [] | lifelines | | lilypond | [] | lingoteach | | lingoteach_lessons | | lynx | [] [] | m4 | [] [] [] [] | mailutils | | make | [] [] | man-db | [] | mysecretdiary | [] | nano | [] [] [] [] | nano_1_0 | [] [] [] [] | opcodes | [] [] [] | parted | [] [] [] | ptx | [] [] [] [] [] [] [] | python | | radius | | recode | [] [] [] | screem | | sed | [] [] | sh-utils | [] | sharutils | [] | sketch | [] | soundtracker | | sp | | tar | [] [] [] [] [] [] | texinfo | [] | textutils | [] | tin | | util-linux | [] [] | vorbis-tools | [] [] | wastesedge | | wdiff | [] [] [] [] | wget | [] [] [] | xchat | [] [] | xpad | [] | +----------------------------------------+ lg lt lv ms nb nl nn no pl pt pt_BR ro 0 0 2 11 7 26 3 4 18 15 34 34 ru sk sl sr sv ta tr uk vi wa zh_CN zh_TW +-------------------------------------------+ a2ps | [] [] [] [] [] | 16 aegis | () | 0 anubis | [] [] | 5 ap-utils | () | 1 bash | [] | 7 batchelor | | 1 bfd | [] [] [] | 7 binutils | [] [] [] | 7 bison | [] [] | 13 bluez-pin | | 7 clisp | | 0 clisp | | 5 coreutils | [] [] [] [] [] | 14 cpio | [] [] [] | 13 darkstat | [] () () | 9 diffutils | [] [] [] [] | 21 e2fsprogs | [] | 3 enscript | [] [] [] | 11 error | [] [] [] | 14 fetchmail | [] | 7 fileutils | [] [] [] [] [] [] | 15 findutils | [] [] [] [] [] [] | 27 flex | [] [] [] | 10 gas | [] | 3 gawk | [] [] | 9 gcal | [] [] | 4 gcc | [] | 4 gettext | [] [] [] [] [] [] | 15 gettext-runtime | [] [] [] [] [] [] | 16 gettext-tools | [] [] | 5 gimp-print | [] [] | 10 gliv | | 1 glunarclock | [] [] [] | 11 gnucash | [] [] | 4 gnucash-glossary | [] [] [] | 8 gnupg | [] [] [] [] | 16 gpe-calendar | [] | 5 gpe-conf | | 3 gpe-contacts | [] | 4 gpe-edit | [] | 5 gpe-login | [] | 5 gpe-ownerinfo | [] | 7 gpe-sketchbook | [] | 5 gpe-timesheet | [] | 6 gpe-today | [] | 6 gpe-todo | [] | 6 gphoto2 | [] [] | 9 gprof | [] [] | 7 gpsdrive | [] [] | 3 grep | [] [] [] [] | 24 gretl | | 2 hello | [] [] [] [] [] | 33 id-utils | [] [] [] | 11 indent | [] [] [] [] | 19 jpilot | [] [] [] [] [] | 10 jwhois | () () [] [] | 10 kbd | [] [] | 8 ld | [] [] | 5 libc | [] [] [] [] | 20 libgpewidget | | 6 libiconv | [] [] [] [] [] [] | 21 lifelines | [] | 2 lilypond | [] | 4 lingoteach | | 2 lingoteach_lessons | () | 0 lynx | [] [] [] [] | 14 m4 | [] [] [] | 15 mailutils | | 2 make | [] [] [] [] | 15 man-db | [] | 6 mysecretdiary | [] [] | 8 nano | [] [] [] | 15 nano_1_0 | [] [] [] | 15 opcodes | [] [] | 9 parted | [] [] | 13 ptx | [] [] [] | 22 python | | 0 radius | | 0 recode | [] [] [] [] | 19 screem | [] | 1 sed | [] [] [] [] [] | 20 sh-utils | [] [] [] | 13 sharutils | [] [] [] [] | 16 sketch | [] | 5 soundtracker | [] | 7 sp | [] | 3 tar | [] [] [] [] [] | 24 texinfo | [] [] [] [] | 13 textutils | [] [] [] [] [] | 15 tin | | 1 util-linux | [] [] | 14 vorbis-tools | [] | 7 wastesedge | | 0 wdiff | [] [] [] [] | 17 wget | [] [] [] [] [] [] [] | 25 xchat | [] [] [] | 11 xpad | | 1 +-------------------------------------------+ 50 teams ru sk sl sr sv ta tr uk vi wa zh_CN zh_TW 97 domains 32 19 16 0 56 0 48 10 1 1 12 23 913 Some counters in the preceding matrix are higher than the number of visible blocks let us expect. This is because a few extra PO files are used for implementing regional variants of languages, or language dialects. For a PO file in the matrix above to be effective, the package to which it applies should also have been internationalized and distributed as such by its maintainer. There might be an observable lag between the mere existence a PO file and its wide availability in a distribution. If May 2003 seems to be old, you may fetch a more recent copy of this `ABOUT-NLS' file on most GNU archive sites. The most up-to-date matrix with full percentage details can be found at `http://www.iro.umontreal.ca/contrib/po/HTML/matrix.html'. Using `gettext' in new packages =============================== If you are writing a freely available program and want to internationalize it you are welcome to use GNU `gettext' in your package. Of course you have to respect the GNU Library General Public License which covers the use of the GNU `gettext' library. This means in particular that even non-free programs can use `libintl' as a shared library, whereas only free software can use `libintl' as a static library or use modified versions of `libintl'. Once the sources are changed appropriately and the setup can handle the use of `gettext' the only thing missing are the translations. The Free Translation Project is also available for packages which are not developed inside the GNU project. Therefore the information given above applies also for every other Free Software Project. Contact `translation@iro.umontreal.ca' to make the `.pot' files available to the translation teams. nabi-1.0.0/AUTHORS0000644000175000017500000000005311655153252010415 00000000000000Choe Hwanjin nabi-1.0.0/COPYING0000644000175000017500000004311011655153252010401 00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. nabi-1.0.0/ChangeLog0000644000175000017500000105263412100712172011120 00000000000000commit 5b1a58fdd0d10a464fa580d7f58beb74903a7f57 Author: Choe Hwanjin Date: 2013-01-26 17:31:28 +0900 Update po files M po/de.po M po/ko.po commit 70b123228405e913bb8e08eb2cb2970b36402869 Author: Choe Hwanjin Date: 2012-12-26 01:08:53 +0900 한자 선택 창의 폭을 250px 이하로 제한 한자 선택 창의 comment의 길이가 긴 경우 string을 wrap하여 창의 폭이 더 이상 커지지 않도록 한다. 스크롤 할 때 comment의 크기에 맞춰서 한자 선택 창의 크기가 변하는 것이 별로 보기 좋지 않다. 특히 화면의 가장자리에 있을 때에는 화면 안에 들어가기 위해서 왼쪽 위 지점이 안쪽으로 밀려 들어가므로 창의 위치가 달라지는 문제까지 있다. 단 이 기능은 gtk 2.8 이상을 사용할 때에만 적용된다. M src/candidate.c commit 0fc1a86ba5da1e06e22961e1657fd97f0594e30e Author: Choe Hwanjin Date: 2012-06-16 22:39:36 +0900 시스템 키맵 옵션을 꺼도 영어 자판 설정값이 적용되는 문제 해결 시스템 키맵 옵션을 끄면 엉어 자판 설정값이 적용되지 않아야 하는데 계속 적용되어, 영어 자판을 None으로 바꾸기 전까지는 잘못된 자판 normalize 코드가 작동되므로 한글입력에 문제가 생긴다. 시스템 키맵 옵션을 끄면 영어 자판 설정이 적용되지 않게 수정했다. 또 저장된 시스템 키맵 옵션이 종료하고 재시작하면 적용되지 않던 문제도 수정했다. http://code.google.com/p/nabi/issues/detail?id=3 M src/ic.c M src/ui.c commit 1ba6dbe2adb54f9bc93812aec474a6a16f0ee161 Author: Choe Hwanjin Date: 2012-06-09 15:09:53 +0900 malys 아이콘 테마 설치 스크립트 추가 M themes/Makefile.am commit ab195debe0ae22a647e9402da1fd4dc83e118af4 Author: Choe Hwanjin Date: 2012-06-09 00:16:42 +0900 malys 아이콘 테마 추가 from: peter yoo A themes/malys/README A themes/malys/english.png A themes/malys/hangul.png A themes/malys/none.png commit 7d2766f7fae05b24549ac4204854bcef9319a279 Author: Choe Hwanjin Date: 2012-01-07 18:00:45 +0900 GTK 테스트코드 업데이트 GtkTextView를 GtkScrolledWindows에 추가한다. 많은 양의 텍스트를 붙여넣고 테스트할때에는 아무래도 scrolled window가 없으면 불편하다. M test/gtk.c commit 61ab55f45d40b62bb04b0b71702e636a8d726f64 Author: Choe Hwanjin Date: 2012-01-07 17:58:32 +0900 MS IME 호환 symbol table 업데이트 Jeong YunWon님이 작성한 mssymbol.txt 파일의 내용을 일부 적용하여 잘못된 곳을 수정하였다. 참조: http://github.com/youknowone/libhangul/commit/ee69d48885437c68731374d32352a5f3a011809f M tables/symbol.txt commit ed12e422497ac3fece609d07fbb79920f1f1f34a Author: Choe Hwanjin Date: 2011-12-26 20:17:10 +0900 0.99.11 release M configure.ac commit fb68390971f6ce69b36990c7ed0bb6cb3e544b10 Author: Choe Hwanjin Date: 2011-12-26 18:55:23 +0900 Update document M NEWS commit 9eb9508ad18b70e5f076aefaa28d6ce3b71ca8c1 Author: Choe Hwanjin Date: 2011-12-26 18:37:30 +0900 Update po files M po/de.po M po/ko.po commit 3008aa9c349c2a11f18c0e4ad3031ec6af766e89 Author: Choe Hwanjin Date: 2011-12-17 16:23:06 +0900 About 창에 project url 추가 M src/ui.c commit f0a429ad1b99b30cba2007fda24890526bc8a58b Author: Choe Hwanjin Date: 2011-12-06 00:12:59 +0900 문서 업데이트 프로젝트 설명을 업데이트 프로젝트 주소를 kldp.net에서 http://code.google.com/p/nabi/ 로 바꿈 M README M configure.ac commit 60915650869d15a8cd82b016abfbfbe012101d50 Author: Choe Hwanjin Date: 2011-11-20 23:58:28 +0900 ignore list 업데이트 M .gitignore commit c2a66366281d4e6fbca092f61e7ef0cb199a6e92 Author: Choe Hwanjin Date: 2011-11-20 23:55:39 +0900 use system keymap 옵션이 켜진 경우에만 영문자판 선택 가능하게 함 system keymap을 사용하지 않는 경우에는 영문자판 설정값이 사용되지 않는다. 따라서 두 설정값은 연관관계에 있으므로 advanced 탭에서 keyboard 탭으로 옮겨서 use system keymap 옵션이 켜진 경우에만 영문 자판 값을 선택할 수 있도록 한다. 이 설정값에 대한 오해가 많으므로 좀더 좋은 방법을 찾는 것이 좋겠다. M src/preference.c commit 5c66f94fc5b5ed2ad38cce91496d99cb71f04088 Author: Choe Hwanjin Date: 2011-11-20 13:04:57 +0900 드보락와 세벌식을 같이 쓸때 '/'가 'ㅁ'으로 나오는 문제 해결 내장 키맵에서 '/'만 빼고 처리하도록 되어 있었다. 아마도 코드 작성중에 실수한 듯 하다. 수정했다. M src/ic.c commit c56d0e796de1e626789d13d32abb140578619557 Author: Choe Hwanjin Date: 2011-11-13 21:17:31 +0900 문서 업데이트 M NEWS commit 6047b2aef5e2551c61a94fa91f344b44c6b361dc Author: Choe Hwanjin Date: 2011-11-13 21:17:07 +0900 make dist할때 자동으로 ChangeLog를 생성하는 룰 추가 M Makefile.am commit 916ed2580c1475e652153c4f1ec4f03636cc4d62 Author: Choe Hwanjin Date: 2011-11-13 21:12:51 +0900 update po M po/de.po M po/ko.po commit d8b583ab891f8b029a23a18e9d7eb2386d94181d Author: Choe Hwanjin Date: 2011-11-13 21:12:00 +0900 0.99.10 릴리스 준비 M configure.ac commit 572e5ef4f567ad8dccb14ee9ec5791208ef913cf Author: Choe Hwanjin Date: 2011-11-13 20:25:09 +0900 gdk_property_get() 함수가 실패할 경우 처리 M src/ui.c commit ceef090d3ecf285a21e50e69326cead831ada1b3 Author: Choe Hwanjin Date: 2011-11-13 20:10:46 +0900 필요한 libhangul버젼을 0.1.0으로 올림 hangul_ic_is_transliteration() 함수를 사용하기 위해서는 0.1.0이상이 필요하다. M configure.ac commit 1018203fbceed5e9a734335e3ecc0b8e28df6495 Author: Choe Hwanjin Date: 2011-11-13 15:28:16 +0900 gitignore 추가 A .gitignore commit d818dbce76429a27a08d9cffa7821cccbd1d2773 Author: Choe Hwanjin Date: 2011-11-13 15:18:44 +0900 status icon이 embed되지 않은 상태에서는 hide palette 메뉴를 비활성화 status icon이 embed되지 않은 때에 palette를 hide 시키면 더이상 nabi를 컨트롤할 수 없게 된다. 따라서 status icons이 화면에 나오지 않은 경우에는 항상 hide palette 메뉴를 비활성화 시키도록 한다. Issue: http://kldp.net/projects/nabi/issue/316638 M src/ui.c commit 178448a9be8b66d4f5d25e5fac67e8997b41b8bc Author: Choe Hwanjin Date: 2011-09-07 23:54:55 +0900 update ignore list git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@824 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 commit 17315620ecc714004b0b65f0f4be868e4569864e Author: Choe Hwanjin Date: 2011-09-07 23:46:37 +0900 로마자 자판의 경우 keysym normalize를 하지 않음 로마자 자판의 경우에는 사용자가 입력한 키 값을 그대로 사용하여 한글로 만들어야 하는데, 다른 한글 자판이 하듯이 위치에 따른 값으로 바꿔 버리면 로마자 입력이 제대로 되지 않는다. 따라서 자판에 따라서 normalize를 하거나 하지 않도록 수정한다. 이를 위해서는 keyboard layout 관련 코드가 NabiServer에서 NabiIC 쪽으로 옮겨와야 하므로 server.c에 있는 NabiKeyboardLayout 관련 코드를 새로운 파일로 소스를 분리하고 ic.c에서 참조하도록 변경한다. git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@823 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/Makefile.am M src/handler.c M src/ic.c A src/keyboard-layout.c A src/keyboard-layout.h M src/server.c M src/server.h commit adc8c36e6222775d990855c6df60dd6cfcd329d1 Author: Choe Hwanjin Date: 2011-09-05 00:46:56 +0900 KLDP.net #316453 GTK+-2.16 이하에서 컴파일 안됨 툴팁 갱신 코드를 r808에서 수정하면서 이하 버젼에서 컴파일되는 지 제대로 테스트되지 않았던 것 같다. 아마도 if defined() 구문을 사용했기 때문에 잘못 처리한 것 같다. 그래서 defined()를 사용하지 않도록 수정하여 앞으로 오류가 발생할 가능성을 낮춘다. git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@822 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ui.c commit 2d4000cfd247e46869a408dcbcefa1274f186a21 Author: Choe Hwanjin Date: 2011-09-05 00:22:57 +0900 사용하지 않는 변수 제거 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@821 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/handlebox.c commit eed5b446d10e2c8ef04146de35892ff01ea91e2d Author: Choe Hwanjin Date: 2011-08-28 21:57:38 +0900 nabi_ic_preedit_draw(): 사용하지 않는 코드 제거 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@820 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ic.c commit 9460b50a65696274de59b2607da783fa2456f0e6 Author: Choe Hwanjin Date: 2011-05-27 22:04:44 +0900 #316115 오페라에서 "한글"를 치면 "한글"이 두번 입력되는 문제 #315977을 고치는 과정에서 nabi_ic_flush() 함수에서 nabi_ic_preedit_done()을 부르면서 발생하는 문제다. opera에서 XIM_PREEDIT_DONE이 왔을때 preedit string을 임의로 commit하는 것 같다. 이것은 올바른 동작이 아니다. 그러나 nabi에서 XIM_PREEDIT_DONE을 보내기 전에 preedit string을 clear하는 것이 더 좋은 방식임은 분명하다. 따라서 nabi_ic_flush()에서 nabi_ic_preedit_clear()를 불러준다. git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@818 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ic.c commit 76ae68338100dff66c8ee5045f99770de1b304bc Author: Choe Hwanjin Date: 2011-05-25 22:48:16 +0900 디버그 메시지 출력 변경 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@817 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/handler.c commit e7584e5a69d9f24b2eab0d0ccddaf985aff745f2 Author: Choe Hwanjin Date: 2011-05-24 00:04:04 +0900 release 0.99.9 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@816 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M configure.ac commit 46b8e1286006dffdcacd606579c06469ca3bf2da Author: Choe Hwanjin Date: 2011-05-23 23:09:32 +0900 update documents git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@815 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M NEWS commit 41cce23bc21ebb1fa5ef4ab7c989750c4995f592 Author: Choe Hwanjin Date: 2011-05-23 23:09:13 +0900 update po files git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@814 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M po/de.po M po/ko.po commit e4282940a3c487a3abafecaece177cea902951e0 Author: Choe Hwanjin Date: 2011-05-23 23:07:05 +0900 glib-gettextize도 --copy 옵션 사용 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@813 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M autogen.sh commit 4bb2f07d41328b2b67738bfca0c905db6b9a450b Author: Choe Hwanjin Date: 2011-05-23 22:26:31 +0900 warning 처리 warning: ISO C90 forbids mixed declarations and code git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@812 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ic.c commit 2cbbfe64bff778fd66bef3ca0d3a0173c188fa6d Author: Choe Hwanjin Date: 2011-05-21 19:49:44 +0900 gdk의 X11 지원 헤더 gdkx.h를 인클루드 언제부터인지는 모르겠지만, gdkx.h를 인클루드하지 않으면 gdk의 x11 함수들의 선언이 없다고 워닝이 나므로 명시적으로 gdkx.h를 인클루드 한다. git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@811 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ui.c commit b7442f99ad4317432a697b28a3ae7a1dd2288fd2 Author: Choe Hwanjin Date: 2011-05-21 19:45:48 +0900 설정창에서 트레이 아이콘을 바꿨을때 바로 적용되지 않는 문제 GtkStatusIcon을 사용하면서 설정창에서 트레이 아이콘을 바꿨을때 바로 적용되지 않는다. nabi_app_set_theme()에서 아이콘을 업데이트 하는 코드가 없었기 때문이다. 아이콘을 업데이트하는 코드를 추가한다. git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@810 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ui.c commit bd5f6d3566f622f7e0b5057545f18d5fdf248bcc Author: Choe Hwanjin Date: 2011-05-21 15:28:53 +0900 #315977 firefox4 에서 backspace로 글자가 안지워지는 문제 firefox4에서 preedit 상태에서 backspace를 연속해서 누르면 preedit string은 지워지지만 그 이후에는 글자가 지워지지 않는다. firefox4의 버그 https://bugzilla.mozilla.org/show_bug.cgi?id=640884 에 따르면 preedit start, preedit end signal이 없어서 라고 한다. preedit string이 다 지워지고 나면 nabi는 backspace키를 어플리케이션에게 forwarding을 해준다. 따라서 어플리케이션이 im이 forwarding하는 키를 무시하지 않는다면 모두 받을 수 있다. 그런데 firefox는 그렇게 처리하지 않는 것 같다. preedit end가 오기 전까지는 im이 키를 forwarding 해주어도 키를 처리하지 않는 것 같다. 엄밀히 말하면, xim 클라이언트는 입력기가 forwarding해주는 키를 처리하면 그만이지, preedit string의 유무에 따라서 전달된 키 이벤트를 사용하고 말고를 판단할 필요가 없다. 그런데 몇몇 구현에서 저런 방식을 사용하는 것 같다. 따라서 preedit start, preedit done callback을 실제로 preedit string이 나타나고 사라질때 같이 불러 주기로 한다. 그전에는 IMPreeditStart()와 XIM_PREEDIT_START, IMPreeditEnd()와 XIM_PREEDIT_DONE을 한 함수에서 처리했기 때문에 preedit done을 호출하면 입력이 종료되는 문제가 있었다. 그래서 IMPreeditStart(), IMPreeditEnd() 함수는 입력이 시작되는 시점에(한영 전환시)호출해주고, preedit string이 새로 나오거나 없어질때 XIM_PREEDIT_START, XIM_PREEDIT_DONE 콜백을 불러준다. 이렇게 하면 firefox4에서 글자가 잘 지워진다. git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@809 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/handler.c M src/ic.c M src/ic.h commit f06860e46397ba5eff6f0666fdc1ff2a06885a46 Author: Choe Hwanjin Date: 2011-05-15 21:04:34 +0900 tooltip을 NabiApplication에서 NabiTrayIcon으로 옮김 이제는 tooltip을 NabiTrayIcon에서 밖에 사용하지 않으므로 tooltip을 NabiTrayIcon의 멤버로 만들고 tooltip 업데이트함수를 NabiTrayIcon의 함수로 만드는 편이 관리에 좋을 것 같다. git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@808 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/nabi.h M src/ui.c commit 808316d73de55d023ce44a0868e12f3ef0e9caf0 Author: Choe Hwanjin Date: 2011-05-15 20:59:40 +0900 806에서 잘못 수정된 부분 nabi_tray_load_icons() 함수는 GtkStatusIcon을 사용하지 않을때 필요한 함수다 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@807 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ui.c commit aabb1b67a5e00e4049f822fac6fc53ba970f7717 Author: Choe Hwanjin Date: 2011-05-15 20:52:32 +0900 GtkStatusIcon 사용 코드 추가 Gtk 2.10 부터 추가된 GtkStatusIcon을 사용하면 이후에 업그레이드에 유리할 것으로 보인다. 또한 tray icon 관련한 변경에 더 유연하게 대처할 수 있을 것이다. 그러나 오래전 버젼의 Gtk를 사용하는 배포판들이 있으므로 이를 지원하기 위해서 GTK 2.16 이상 버전을 사용하는 경우에만 GtkStatusIcon을 사용하도록 조건부 컴파일 구문을 사용한다. git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@806 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ui.c commit 37fa517fa6a5105b2743596d4ef50175c681322b Author: Choe Hwanjin Date: 2011-01-23 14:40:44 +0900 0.99.8 release git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@804 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M configure.ac commit 4ab0b67f4ed54b3b4d5608a3b561caa97cbdb980 Author: Choe Hwanjin Date: 2011-01-23 14:40:09 +0900 사용하지 않는 링크 제거 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@803 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M README commit ef8002d397158aa19dcc0cf0fd0579571bbd86ee Author: Choe Hwanjin Date: 2011-01-23 14:22:53 +0900 copyright 연도를 2011로 수정 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@802 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M po/de.po M po/ko.po M src/ui.c commit bdf58696f667c8000843fe5ad1feb9fb3da70e25 Author: Choe Hwanjin Date: 2011-01-23 14:18:17 +0900 문서 업데이트 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@801 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M NEWS commit 5ef905a56ad2043103150d312a62da0a06a8ab17 Author: Choe Hwanjin Date: 2011-01-23 14:05:25 +0900 번역 업데이트 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@800 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M po/de.po M po/ko.po commit 98b7575c0408d9423cc0ff800817cf5a553041ed Author: Choe Hwanjin Date: 2011-01-23 13:24:39 +0900 체크 버튼을 한쪽으로 모음 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@799 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/preference.c commit b389823137de575eb79d27776cad39bb1e0fb166 Author: Choe Hwanjin Date: 2011-01-22 21:59:23 +0900 use_system_keymap 옵션 추가 use_system_keymap 옵션이 FALSE(기본값)면 내장 keymap을 이용하여 keysym을 구하고 TRUE면 X 서버의 keymap을 사용한다. 내장 keymap을 사용하면 사용자의 자판 설정에 관계없이 같은 키값을 리턴하므로, 유럽어 자판을 기본 자판으로 설정해도 별다른 변환 설정 없이 한글을 입력 가능해진다. git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@798 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/conf.c M src/conf.h M src/handler.c M src/preference.c M src/server.c M src/server.h commit ad141cb951359dd543179568977b848485f61e6a Author: Choe Hwanjin Date: 2011-01-02 23:32:43 +0900 libhangul의 keyboard list 관련 api를 사용하기 위해서는 0.0.12 이상이 필요함 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@797 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M configure.ac commit 368edc62d6bc99900f385ad4a3074ec3281cc32b Author: Choe Hwanjin Date: 2011-01-02 22:23:36 +0900 libhangul의 keyboard list를 가져오는 api를 사용하도록 수정 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@796 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/server.c M src/server.h commit 4f1b3b3f46139cd5877176d7801fe35bd6019dde Author: Choe Hwanjin Date: 2010-12-28 13:52:09 +0900 기본 아이콘 테마를 선택할 수 있는 configure 옵션(--with-default-theme) 추가 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@795 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M configure.ac M src/conf.c M src/preference.c M src/ui.c commit fb6e14f0df14323602ae1a167f8beca134ec3ccd Author: Choe Hwanjin Date: 2010-08-04 00:33:35 +0900 Makefile에서 변수를 사용하는 것으로 바꿈 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@794 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M IMdkit/Makefile.am M src/Makefile.am commit b902163273c58d86f5e7ca34aad74f30aeddd4be Author: Choe Hwanjin Date: 2010-08-03 23:48:14 +0900 mixed declaration 없앰 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@793 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ic.c M src/server.c commit fb037a81aaae05d0b49c58cffaeac2a07906ce35 Author: Choe Hwanjin Date: 2010-08-03 01:28:07 +0900 ignore_app_fontset 옵션 추가 일부 Over the spot을 지원하는 클라이언트들이 제대로 된 XFontSet 정보를 주지 않는 경우가 있다. 이런 경우에 클라이언트의 XFontSet에 의존해서 텍스트를 그리게 되면 품질이 현저하게 떨어지게 된다. X Window System에 필요한 폰트가 다 설치되지 않아서 저 품질의 폰트를 사용하는 경우에도 글자의 품질이 좋지 않다. 또는 Xft등을 이용하여 truetype폰트를 사용하여 그리면서도 XIM에는 XFontSet 정보를 주는 경우에는 클라이언트가 텍스트를 그리는 폰트와 XIM이 그리는 폰트가 다르게 된다. 이런 경우에 사용자가 지정한 폰트로 preedit string을 그리는 옵션을 강제하여 preedit string에서 truetype font를 사용할 수 있게 한다. git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@792 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M po/de.po M po/ko.po M src/conf.c M src/conf.h M src/ic.c M src/preference.c M src/server.c M src/server.h M src/ui.c commit 0ead28d1bfa6f1a95d836786983bac82b1f7230b Author: Choe Hwanjin Date: 2010-07-31 22:36:03 +0900 configure.ac 파일 업데이트 AM_INIT_AUTOMAKE 매크로를 새로운 사용법에 맞게 업데이트 AM_PROG_CC_C_O 추가: IMdkit 쪽에서 필요하다고 메시지 나옴 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@791 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M configure.ac commit 6da2ae9ea8fd067418163c92491533ffc73f6841 Author: Choe Hwanjin Date: 2010-07-31 22:32:15 +0900 더이상 사용하지 않는 wchar.h 는 제거한다. 관련하여 함수 선언만 남은 것도 제거한다. git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@790 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ic.h M src/server.h commit 8049a77db67c928277e2c2c0bf713f44c8dd3940 Author: Choe Hwanjin Date: 2010-04-19 22:45:43 +0900 Makefile.am 파일 정리 @매크로로 미리 대입시켜놓는 것보다 변수를 사용하는 것이 Makefile을 직접 고칠때 편리한 것 같다. git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@789 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M themes/Makefile.am commit 1ea40d2dfb4a46c4eed68ff411e2129c3d495c87 Author: Choe Hwanjin Date: 2010-04-19 22:40:06 +0900 ubuntu-mono-dark, ubuntu-mono-light 테마 추가 이준희 님이 보내주심 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@788 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M themes/Makefile.am A themes/ubuntu-mono-dark/README A themes/ubuntu-mono-dark/english.png A themes/ubuntu-mono-dark/hangul.png A themes/ubuntu-mono-dark/none.png A themes/ubuntu-mono-light/README A themes/ubuntu-mono-light/english.png A themes/ubuntu-mono-light/hangul.png A themes/ubuntu-mono-light/none.png commit 0729b7dd6c05572ce8e79ffc04f76998dbb6a88a Author: Choe Hwanjin Date: 2010-01-05 23:16:59 +0900 Colemak 매핑 버그 수정 * Colemak의 매핑 테이블을 반대로 만든것을 다시 수정 * 콜론/세미콜론 대소문자 처리 수정 * 잘못 추가된 매핑 삭제 * #315056, #315058 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@787 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/keyboard_layouts commit 78129b6687d3b5c6afaf34069954969caf69e085 Author: Choe Hwanjin Date: 2010-01-02 21:32:25 +0900 0.99.7 release git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@785 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M configure.ac commit 4a7fe58ccf27499ed88c92de089961d5f893487a Author: Choe Hwanjin Date: 2010-01-02 21:28:48 +0900 copyright 년도 업데이트 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@784 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M po/de.po M po/ko.po M src/ui.c commit 19f1ad3d953f02ccd62e1cd4d71e425765e9a3ed Author: Choe Hwanjin Date: 2010-01-02 21:21:36 +0900 문서 업데이트 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@783 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M NEWS commit 0c71a65df09c3bf44ad0f137edecec8203f9c534 Author: Choe Hwanjin Date: 2010-01-01 16:57:21 +0900 Colemak 매핑 지원 참조: http://kldp.net/projects/nabi/forum/309771 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@782 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/keyboard_layouts commit d6bfdd650d6fae02123042a51c2174319ecf89f5 Author: Choe Hwanjin Date: 2009-12-27 16:25:19 +0900 update po files git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@781 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M po/de.po M po/ko.po commit 404fc26fd4373e709339c17b918960d9703e9bbf Author: Choe Hwanjin Date: 2009-12-27 16:24:24 +0900 Hanja mode를 Hanja Lock으로 ui 스트링을 바꿈 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@780 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ui.c commit dd1019e8ca8e14fa2936bc245e775827c90fbb6d Author: Choe Hwanjin Date: 2009-12-20 20:09:15 +0900 버그수정: #315002 FreeBSD, ko_KR.UTF-8 locale에서 OverTheSpot 안 그려짐. * X FontSet을 로드하지 못할 경우 Pango로 preedit 텍스트를 그린다. * X11 xim client가 요청하는 fontset를 로딩하지 못할 경우 에러에 대처하기 위해서 pango로 그리는 루틴이 동작하도록 한다. * xterm의 경우 xim에 요청하는 FontSet을 실제로 텍스트를 렌더링할때 사용하지 않는다. xterm의 코드를 확인해본 결과 텍스트를 그릴때 XFontSet을 사용하는 것이 아니라 font의 인코딩에 맞춰서 XDrawString16() 함수를 사용하고 있다. 따라서 xterm에서는 fontset 생성에 실패하더라도 한글로된 텍스트를 렌더링 할 수 있게 된다. 또한 xterm에서는 over the spot 모드에서 xim에 요청한 폰트와 실제 텍스트 렌더링에 사용하는 폰트가 다르므로, xim에서 그리는 preedit string이 입력된 텍스트와 다르게 보이는 것이다. * 참조: http://kldp.net/projects/nabi/315002 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@779 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ic.c commit 2c5dff2bc395971ea03f4b7912db97dd632d12d8 Author: Choe Hwanjin Date: 2009-12-16 23:56:20 +0900 사용자의 키 입력을 받는 다이얼로그에서 grab하지 않음 * 그 전에는 사용자의 키 입력을 받는 다이얼로그에서 grab을 해서 다른 동작을 하지 못했는데, 이는 좀 불편한 것 같아서 기본 동작을 바꾼다. 다이얼로그에 포커스가 있을 때에만 키 입력을 받고, 그 외에는 일반 다이얼로그와 마찬가지로 grab하지 않도록 한다. git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@778 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/keycapturedialog.c M src/preference.c commit c326847d341cd7a09170aba56b7b5688e173b755 Author: Choe Hwanjin Date: 2009-12-06 23:21:52 +0900 번역 업데이트 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@777 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M po/de.po M po/ko.po commit 42d5b8fae2a15ea518e40498bdf51ece626bb6ec Author: Choe Hwanjin Date: 2009-12-06 22:26:11 +0900 linux에서 사용 가능한 UTF-8 locale을 모두 등록함 * 현재 구현은 nabi와 xim client 가 모두 같은 locale을 사용할때에만 한국어가 아닌 UTF-8 로캘로 사용이 가능하다. 그러나 nabi와 xim client의 locale이 다른 경우에는 작동하지 않는다. 예를 들어 nabi는 ko_KR.UTF-8로 작동하고 있지만, xim client는 en_US.UTF-8로 접속을 시도한다면 nabi에 연결되지 않게 된다. 이 문제를 해결하는 적절한 방법은 현재 시스템에서 사용 가능한 UTF-8 로캘을 nabi에서 모두 사용가능한 것으로 등록하는 것이겠지만, 현재 시스템에서 유효한 locale 목록을 가져오는 것은 간단한 작업이 아닌데다가, 포터블한 방법도 없는 것 같다. 따라서 무식하고 단순하게, 있을 법한 모든 UTF-8 locale을 다 지원하는 것으로 구현해 버리도록 한다. git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@776 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/server.c commit 6526579d2205e0ec2c9005d49d82a740385f3506 Author: Choe Hwanjin Date: 2009-12-06 22:21:18 +0900 buffer overflow 문제 처리 locale string 처리하는 코드의 버퍼 크기를 충분히 늘림 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@775 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M IMdkit/i18nMethod.c M IMdkit/i18nX.c commit 0a2afc12e8c4438e453b0f8bbae142b239a084f2 Author: Choe Hwanjin Date: 2009-12-06 20:56:31 +0900 한자 전용 모드 구현 * scim-hangul의 한자 전용 모드와 같은 기능을 nabi에도 구현 * 따로 한자 버튼을 누르지 않아도 계속해서 한자 후보 창을 보여주는 방식 * 팔레트와 트레이 아이콘 메뉴에 한자 전용 버튼 추가 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@774 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/candidate.c M src/candidate.h M src/conf.c M src/conf.h M src/ic.c M src/nabi.h M src/server.c M src/server.h M src/ui.c commit fc50f22519d00462cb4e322b7bdd7457afbd7f7b Author: Choe Hwanjin Date: 2009-11-07 14:08:10 +0900 0.99.6 release git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@772 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M configure.ac commit acb46a18f25895cee5a7f926ed198f83416bd069 Author: Choe Hwanjin Date: 2009-11-07 14:07:07 +0900 문서 업데이트 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@771 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M NEWS commit 09ff2646ab6356fb5ccfb70092356520cd85b742 Author: Choe Hwanjin Date: 2009-11-07 14:06:55 +0900 update copyright years git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@770 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ic.c M src/preference.c M src/server.c M src/ui.c commit 02bf6776de2972aac67d556c4e3c32ddb27889a7 Author: Choe Hwanjin Date: 2009-11-07 14:03:15 +0900 po 파일 업데이트 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@769 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M po/de.po M po/ko.po commit c9e5cb245aa424178b8bcdd5b9b423978dabbb6b Author: Choe Hwanjin Date: 2009-11-06 23:42:59 +0900 버그수정: [#305368] nabi is not visible in notification area * notification area에 들어가지 못하는 문제 root window에 GdkEventMask를 설정하는 과정에서 StructureNotifyMask가 사라져서 ReparentNotify를 받지 못하게 되었다. 그래서 GtkPlug에서 embedded 시그널이 발생하지 않았던 것이다. * 참조: kldp.net: http://kldp.net/tracker/index.php?func=detail&aid=305368&group_id=275&atid=100275 launchpad: https://bugs.launchpad.net/ubuntu/+source/nabi/+bug/444167 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@768 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ui.c commit 05e593489afe61072000bb7076db289b5f7be7f3 Author: Choe Hwanjin Date: 2009-10-31 15:23:26 +0900 0.99.5 release git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@767 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M configure.ac commit 0a7ee18fb43e3e6845bd9863e7354acead23fbdd Author: Choe Hwanjin Date: 2009-10-31 15:22:49 +0900 오타 수정 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@766 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M NEWS commit 95975f2c7e0f855c65044605a191191a92cb236f Author: Choe Hwanjin Date: 2009-10-31 15:19:56 +0900 문서 업데이트 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@765 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M NEWS commit 422b78ad923f137f292d302fffc3fda6df5b4f5e Author: Choe Hwanjin Date: 2009-10-31 15:17:37 +0900 libhangul 0.0.10 사용: 로마자 자판 지원 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@764 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M configure.ac commit d0108ddce68a4f271f0840fece033fdafd3cf22c Author: Choe Hwanjin Date: 2009-10-17 10:06:44 +0900 libhangul의 로마자 지원 기능을 이용한 로마자 자판 지원 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@763 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M po/de.po M po/ko.po M src/server.c commit 2f3b11ed60c084ebec085e011f97b44c8d96ef96 Author: Choe Hwanjin Date: 2009-09-03 00:01:12 +0900 pango_language_get_default()함수는 pango 1.16에서 지원하는 함수다. 다른 함수로 비슷한 기능을 구현할 수 있으므로 다른 함수 pango_language_from_string()로 대체한다. 그래야 nabi를 1.16 이하 버젼의 pango에서 빌드할 수 있게 된다. 이 함수는 off the spot 이하의 구현에서 preedit string을 그릴때 사용하는 함수다. 별로 중요도가 높지 않다. 다음의 스레드 참조: http://kldp.net/forum/forum.php?thread_id=53556&forum_id=897 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@762 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ic.c commit c962a127f1cac36df047cfa53ac84f6b0b396c49 Author: Choe Hwanjin Date: 2009-07-11 18:42:08 +0900 버그 수정: [#305339] 나비 입력상태 설정 저장 리셋 버그 입력 상태 관리 옵션 중 "입력 창 마다 따로" 옵션이 저장되지 않는 문제 수정 config와 preference 다이얼로그의 키워드가 달라서 발생된 문제임 수정함 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@760 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/preference.c commit 93b8b095c3d236bd344545bfe2c700f7a8034802 Author: Choe Hwanjin Date: 2009-07-05 14:07:58 +0900 0.99.4 release git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@759 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M configure.ac A po/LINGUAS commit d5f1699bdc4e7d9721cb2f5bdb9e2935a5148ac7 Author: Choe Hwanjin Date: 2009-07-05 14:04:52 +0900 문서 업데이트 (0.99.4) git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@758 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M NEWS commit 5ae270d10a320ce2feaebf37c3757910651eb2b7 Author: Choe Hwanjin Date: 2009-07-05 14:01:22 +0900 po 파일 업데이트 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@757 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M po/de.po M po/ko.po commit e0f1ca0d978208c8919af2be36415ba7272b387f Author: Choe Hwanjin Date: 2009-07-05 13:49:08 +0900 qt4 test 코드 작성 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@756 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M test/Makefile A test/qt4.cpp commit 695b2a5883630288419326a1680a1cb036da579a Author: Choe Hwanjin Date: 2009-07-05 13:47:26 +0900 컴파일러 워닝 처리 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@755 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M test/xlib.cpp commit 30b90bbcf0725ac56d97678be1cffe05e89ba4ca Author: Choe Hwanjin Date: 2009-07-05 13:42:59 +0900 xim client에 Status callback 구현 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@754 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M test/xlib.cpp commit ba766246db9b747418a386e5c5b12638e42bf2be Author: Choe Hwanjin Date: 2009-07-04 20:21:20 +0900 #305259 gvim 커맨드라인 모드에서 발생하는 문제 gvim에서 한글 모드에서 /나 :를 치고 커맨드를 입력한후 엔터를 치면 gvim이 블락된다. 원인은 하나의 이벤트를 처리하면서 XCreaetIC()와 XSetICFocus() 를 부른후 바로 XCreateIC를 또 하기 때문인데 이렇게 되면 nabi에서 XSetICFocus() 안에서 PreeditStartCallback을 호출하고 그 응답이 두번째 XCreateIC()를 처리하는 과정에서 처리가 된다. 그런데 gvim의 PreeditStartCallback 함수에서는 gtk_im_context_set_cursor_location()을 호출하는데 gtk2의 im-xim 구현에서는 그 순간에 필요한 XIC를 생성하는 방식이다. 따라서 PreeditStartCallback에서 XCreateIC()를 부른다. 그러므로 XCreateIC 안에서 XCreateIC가 또 불리게 된다. 이러면 XIM 프로토콜을 처리하는 필터에서 첫번째 XCreateIC에 대한 응답을 기다리느라고 블락되는 현상이 발생한다. 이를 해결하기 위해서 nabi에서 PreeditStartCallback을 focus 받았을 때 부르지 않고 키보드 이벤트가 전달되기 시작했을 때 하기로 변경한다. git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@753 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ic.c commit 3abd4660f0686e8e713df7c94ce8a566f62d985a Author: Choe Hwanjin Date: 2009-06-14 22:32:35 +0900 IMdkit 루틴에서 nabi_log()를 사용해 디버그 로그를 남기도록 처리 XIM_ERROR도 메시지 출력하도록 함 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@752 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M IMdkit/i18nPtHdr.c commit e32a38339524349527702df0bac604c39bf35942 Author: Choe Hwanjin Date: 2009-06-03 00:21:03 +0900 LDFLAGS 대신 LDADD 를 사용함 젠투에서 --as-needed 옵션을 사용하려면 이렇게 수정해야 한다고 함 수정하면서 라이브러리 링크 순서도 제대로 고침 참고: http://www.gentoo.org/proj/en/qa/asneeded.xml git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@751 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/Makefile.am commit ba0cbf74c8c1721857c2a12b6aac7bd73cd9bea6 Author: Choe Hwanjin Date: 2009-02-07 18:26:35 +0900 status 데이터를 참조해야 하는 곳에서 preedit 데이터를 참조하고 있음 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@750 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ic.c commit 6c5d0d2742d9bf807d2a2ad068ef57a605064d17 Author: Choe Hwanjin Date: 2008-12-29 20:09:55 +0900 status_attr -> status: * 변수 이름을 짧게, preedit과도 통일 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@749 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ic.c M src/ic.h commit 897d4fd9bd5ad0e68ed1ad121bbd6d2bc03ecb68 Author: Choe Hwanjin Date: 2008-12-29 19:22:31 +0900 XIMStringConversionSubstitution에는 candidate 창을 띄우지 않도록 함: * gtk2 xim module에서는 XIMStringConversionSubstitution 에서도 string을 보내오므로, string conversion reply에서 항상 candidate 창을 띄우게 되면 candidate를 commit하고 client text를 지우는 때에도 candidate창이 뜨게 된다. nabi_ic_process_string_conversion_reply() 선언: * 컴파일러 워닝 처리 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@748 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ic.c M src/ic.h commit 30a6d40dce3f2ede72d5b4f83005e31ff382c11d Author: Choe Hwanjin Date: 2008-12-29 18:06:48 +0900 callback 함수 호출 방식 개선: * nabi_ic_set_ic_values()함수로 callback 함수가 등록된 것을 알리는 경우에만 callback 함수를 부른다. 콜백함수는 sync함수이기 때문에 잘못하는 경우에는 xim 서버가 블락될 수가 있다. client가 callback함수가 준비된 경우에만 호출 하는 편이 더 안전하다. (이것이 큰 차이가 있을지는 모르겠다:) * XNPreeditStartCallback, XNPreeditDrawCallback, XNPreeditDoneCallback XNStringConversionCallback 에 대해서만 처리 status callback 관련해서는 나중에 고칠 기회가 있을 것이다. git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@747 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ic.c M src/ic.h commit 1995f97f710e60aea7930e69ef147141bcd7b674 Author: Choe Hwanjin Date: 2008-12-29 16:48:18 +0900 nabi_ic_get_values/nabi_ic_set_values() 개선: * 포인터 사용을 간소화 * 메모리 할당 크기를 CARD32 사용(프로토콜의 스펙에 따름) git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@746 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ic.c commit 4d30d32146585faf9696772d70df18c291cba969 Author: Choe Hwanjin Date: 2008-12-28 17:47:00 +0900 memory leak 수정: * 대부분의 xim 클라이언트들이 접속을 종료할때 XCloseIM() 처리를 잘 하지 않는다. 그러다보니, connection을 위해서 할당해 놓았던 clients 데이터들이 남아있게 된다. 이 데이터는 XIM 종료시에 해제하도록 한다. git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@745 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M IMdkit/i18nMethod.c M IMdkit/i18nX.c commit 801be74f7ec58b0ec9a8dc2f42e84f88d5ef1f6c Author: Choe Hwanjin Date: 2008-12-27 16:47:55 +0900 memory leak 수정 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@744 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M IMdkit/i18nPtHdr.c commit 728dc13603521f4581d6e8c04f0ccb1134024dfb Author: Choe Hwanjin Date: 2008-12-27 15:57:39 +0900 Input mode option -> Input mode scope git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@743 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/preference.c commit 2af64d9abe1ab7371ca6af5e9e1f41abce6709d2 Author: Choe Hwanjin Date: 2008-12-27 15:43:27 +0900 tray icon이 있는 상태에서만 "hide palette" 메뉴를 사용 가능하게 함 * tray icon이 없는 상태에서 "hide palette" 메뉴를 작동시키면 tray icon도 없고 palette도 없게 되므로 nabi를 컨트롤 할수 없게 된다 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@742 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ui.c commit a562d76d8d7b2445d030b3e7b6965ee59367f887 Author: Choe Hwanjin Date: 2008-12-27 15:30:57 +0900 tray_icon이 NULL일 경우 처리 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@741 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ui.c commit a961109247adc33cbaceee50931d579d1a8a1a9e Author: Choe Hwanjin Date: 2008-12-27 15:21:55 +0900 use_tray_icon 옵션 추가: * tray icon을 사용을 설정할 수 있는 옵션 추가 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@740 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/conf.c M src/conf.h M src/nabi.h M src/preference.c M src/ui.c commit 68461115559aa8c338cb049daaeb66dc320a3331 Author: Choe Hwanjin Date: 2008-12-27 14:32:42 +0900 NabiConfig의 char* 멤버들을 GString으로 바꿈 * g_free()하고 g_strdup()하는 것보다 g_string_assign()이 편함 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@739 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/candidate.c M src/conf.c M src/conf.h M src/ic.c M src/main.c M src/preference.c M src/ui.c commit c991b4f7c0444df38ea737be3d449639a07ed49e Author: Choe Hwanjin Date: 2008-12-27 13:49:12 +0900 default input mode 옵션 구현: * config->default_input_mode 옵션 추가 * 나비가 시작할때 기본 입력 모드를 한글또는 영문 상태로 설정할 수 있음 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@738 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/conf.c M src/conf.h M src/ic.c M src/preference.c M src/server.c M src/server.h M src/ui.c commit 0fef50c86d9693daf456ecf4511234e362c240e9 Author: Choe Hwanjin Date: 2008-12-27 13:17:02 +0900 input_mode_option을 input_mode_scope로 이름 바꿈 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@737 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/conf.c M src/conf.h M src/ic.c M src/preference.c M src/server.c M src/server.h M src/ui.c commit e095c4e5f831d02e1d583f3122f0327a11eff8f9 Author: Choe Hwanjin Date: 2008-12-27 11:54:17 +0900 preference.h Makefile.am에 추가 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@736 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/Makefile.am commit 9dd70392e851d8e617fdb7ce60d0e342ad2dfc1c Author: Choe Hwanjin Date: 2008-12-27 00:54:28 +0900 palette가 focus를 받지 않게 함 * palette 메뉴를 사용하면서 포커스가 나가는 것은 불필요함 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@735 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ui.c commit c57b9bac052dd585274eabab14094bff9640a7e9 Author: Choe Hwanjin Date: 2008-12-27 00:43:21 +0900 설정창이 뜨면서 불필요하게 테마 설정값이 갱신되는 문제 수정 * callback 함수를 먼저 설정하여 on_icon_list_selection_changed()함수가 초기화 과정에서 불리게 된다. git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@734 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/preference.c commit 6872b746de2f57b163b0fe42b68430039bf76f81 Author: Choe Hwanjin Date: 2008-12-27 00:38:56 +0900 자판 변경 관련 기능 개선: * 설정창에서 자판을 바꾸면 palette 메뉴에서 자판값이 바뀌지 않는 문제 수정 * nabi_app_set_hangul_keyboard() 함수에서 자판 설정이 바뀌면 관련 UI를 모두 갱신하도록 구현 이렇게 nabi_app_ 계열 함수는 하나만 호출하면 필요한 기능이 모두 수행되는 형태로 구현한다. git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@733 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ui.c commit eadb5c5927cf882c5919b19d6c8ab614d52911bb Author: Choe Hwanjin Date: 2008-12-27 00:29:48 +0900 preference.h include (r731 참조) git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@732 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/preference.c commit 29621ea0876b2e8181a5600a877da5a0fca6925c Author: Choe Hwanjin Date: 2008-12-27 00:26:29 +0900 preference_window_update() 함수 제거: * preferece window가 팝업된 상태에서 tray icon 메뉴에서 자판 설정을 바꿀수 있게 하는 것보다, preference window가 있으면 tray icon메뉴가 나오지 않도록 하는 것이 더 간결한 작동 방법이다. 따라서 이제는 preference window의 자판 콤보박스를 업데이트할 필요가 없다. preference.h 추가: * preference_window_create() 함수 선언을 ui.c에서 직접 해두면 preference_window_create() 함수의 인자를 바꿨을 때 ui.c 컴파일하면서 에러가 나지 않지만 preference.h를 만들어 두면 컴파일 에러가 나기때문에 에러를 잡기가 더 쉽다. git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@731 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/preference.c A src/preference.h M src/ui.c commit ae276b4181b787654625b7ed6c6ff800defa425c Author: Choe Hwanjin Date: 2008-12-27 00:10:19 +0900 설정창의 reset 버튼 구현 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@730 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/preference.c commit ef71ce428770473762338e34f3649c49cdc65534 Author: Choe Hwanjin Date: 2008-12-26 18:29:01 +0900 qt3, qt4 어플리케이션에서 XIC를 생성하지 못하던 문제 수정 * XIM_STR_CONVERSION 기능을 구현하는 과정에서 추가된 코드에서 발생한 문제 * Default_ICattr 어레이에 XNPreditCaretCallback이 등록되어 있으면 문제가 된다. 무슨 이유에서 인지 XNPreeditCaretCallback이 등록되어 있으면 xim client에서 preedit caret callback을 등록하지 않으면 XIC를 생성하지 못한다. 따라서 Qt3, Qt4 프로그램처럼 preedit caret callback을 등록하지 않는 client들은 한글 입력이 안된다. * r716에서 발생한 문제의 원인은 이것인 것 같다. -이 줄 이하는 자동으로 제거됩니다-- M IMdkit/i18nAttr.c git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@729 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M IMdkit/i18nAttr.c commit 6e0d2105ff8b2daa79799cb0c939bae4211c9184 Author: Choe Hwanjin Date: 2008-12-20 21:03:47 +0900 ChangeLog 파일을 svn에서 없애고 패키징할때 svn으로 부터 생성함 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@728 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 D ChangeLog M autogen.sh commit 54e973209e5a6b14e6af1aa6fc1037ef9eaaddb2 Author: Choe Hwanjin Date: 2008-12-14 23:54:42 +0900 ucschar 스트링 처리 함수 개선: * nabi_u4str 함수들을 모두 ustring_ 함수로 변경 * ustring 내부 구현을 gunichar대신 ucschar로 변경 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@727 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/Makefile.am M src/ic.c M src/ic.h A src/ustring.c A src/ustring.h commit 125f422afe72ea2a495cfeefd09ed240d5a34057 Author: Choe Hwanjin Date: 2008-12-14 23:00:06 +0900 update change log git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@726 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog commit cf79a4303a894ae256a26630b0066d3d206be22b Author: Choe Hwanjin Date: 2008-12-14 22:59:26 +0900 xim string conversion 기능 구현 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@725 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M test/xlib.cpp commit 8c5017e59cbbe3e339d640fd9c971393cab851de Author: Choe Hwanjin Date: 2008-12-14 22:41:48 +0900 String Conversion 기능을 사용한 한자 변환 기능 구현: * XIM_STR_CONVERSION_REPLY를 받으면 그 string과 preedit string을 합쳐서 다시 검색하여 한자 목록을 보여주도록 한다. * 한자 검색 방식을 hanja_table_match_suffix() 함수로 교체 단어 단위 입력이나 string conversion 기능을 이용하여 한자로 변환할때 앞부분 부터 변환하는 것보다 뒷 부분부터 변환하는 것이 사용에 더 편리한 것 같다. * 한글의 자모방식 스트링을 처리하기 위해서 libhangul의 함수를 사용하지 않고 직접 구현함. (이 방식이 코드가 더 간단한 것 같음) git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@724 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/candidate.c M src/candidate.h M src/handler.c M src/ic.c M src/ic.h commit 7917b15cb4a6e1b5974e41dc7896b362c9f508a4 Author: Choe Hwanjin Date: 2008-12-14 21:12:25 +0900 XIM_STRING_CONVERSION 프로토콜 구현: * string conversion 프로토콜을 사용하기 위해서 먼저 XNQueryIMValuesList, XNQueryICValuesList 처리를 구현함 xim client 쪽에서는 XNQueryICValuesList를 사용해서 XIM 서버가 string conversion 프로토콜을 지원하는지 검사하고 string conversion 관련 세팅을 하게 된다. (GTK2의 GtkIMContextXim 관련 코드 참조) * _Xi18nStringConversionCallback() 함수에서는 synchronous모드로 작동하지 않고 라이브러리를 사용하는 곳에서 XIM_STR_CONVERSION_REPLY를 받았을때 처리하도록 한다. 그렇지 않으면 XIM 서버가 client의 응답을 기다리면서 멈춰버리기 때문에, 다른 클라이언트에 서비스를 못하는 상황이 발생할 수 있다. * 미구현된 StrConvReplyMessageProc() 함수를 구현 XIM 메시지 핸들러에 XIM_STR_CONVERSION_REPLY를 보냄 * 이 구현이 동작하기 위해서는 libx11에 먼저 구현이 되어야 한다. 자세한 내용은 아래 링크를 참조한다. http://bugs.freedesktop.org/show_bug.cgi?id=2832 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@723 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M IMdkit/XimProto.h M IMdkit/i18nAttr.c M IMdkit/i18nClbk.c M IMdkit/i18nIMProto.c M IMdkit/i18nPtHdr.c M IMdkit/i18nX.c commit 859ecbcbe4fa7857e313f5677ff1f66f4ff83364 Author: Choe Hwanjin Date: 2008-12-13 13:30:06 +0900 0.99.3 release git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@721 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M configure.ac commit fe868dd5e714da78409417af72742da7e5101858 Author: Choe Hwanjin Date: 2008-12-13 13:22:47 +0900 문서 업데이트: 0.99.3 릴리스 준비 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@720 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M NEWS commit effc095f9a8a8514d36646576dad9b0b1cd71f0c Author: Choe Hwanjin Date: 2008-12-13 13:22:10 +0900 ChangeLog 생성 룰 수정: * ChangeLog를 svn의 로그를 사용하기로 함 이전의 로그는 ChangeLog.0로 옮김 svn log로 부터 ChangeLog 다시 생성, 앞으로는 svn log로만 관리 * Makefile.am에서 ChangeLog 생성하는 룰를 간단하게 바꿈 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@719 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog A ChangeLog.0 M Makefile.am commit ba717a9c6d2d3f5cb0d58d895cc7fcced4a0edd0 Author: Choe Hwanjin Date: 2008-12-13 01:32:50 +0900 번역 파일 업데이트 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@718 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M po/de.po M po/ko.po commit d7147c11e15747dc4edf02207688b8876283fb29 Author: Choe Hwanjin Date: 2008-12-13 01:20:19 +0900 한자 폰트 설정 버튼도 GtkFontButton 스타일로 구현 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@717 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/preference.c commit d3e67e80d2a11732f25a137eddf9ca2154cb6539 Author: Choe Hwanjin Date: 2008-12-09 23:05:55 +0900 on the spot 모드에서 preedit caret callback 도 연결함 최근 코드에서 부터는 preedit caret callback을 연결하지 않으면 on the spot으로 XIC가 생성되지 않는 것 같음 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@716 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M test/xlib.cpp commit 260aa6b2928a19ce5865b4bd64da64eab8507180 Author: Choe Hwanjin Date: 2008-12-07 17:55:41 +0900 디버깅 메시지를 출력할때에는 session에 연결안하게 함 - 그래야 자동으로 재시작하지 않아서 디버깅 할때 편리함 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@715 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/debug.c M src/debug.h M src/main.c commit bcede1a5087e75cfe273348d9bc6b0e7a25dd68c Author: Choe Hwanjin Date: 2008-10-07 00:48:21 +0900 candidate window 개선: * theme에 따라서 active 상태가 normal상태과 같게 그려지는 것들이 있다. 그런때에는 candidate item에서 현재 cursor가 있는 것들이 구분이 안되게 그려진다. candidate window는 focus가 가지 않는 윈도우다보니 아이템이 select가 되지 않는다. 그래서 treeview widget의 style을 수정해서 active 상태를 select 상태의 색상과 같도록 처리한다. git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@714 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/candidate.c commit 8f6b30f45354e4edaf2c78a26306d40194e299cb Author: Choe Hwanjin Date: 2008-10-06 23:27:39 +0900 NabiServer 수정 * candidate font도 PangoFontDescription을 사용하도록 수정 preedit font와 일관성을 가지기 위해서 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@713 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/candidate.c M src/server.c M src/server.h commit fc1a5b9cac80ca1f178f8addfe178a741e6085b1 Author: Choe Hwanjin Date: 2008-10-06 22:58:14 +0900 NabiServer 시작 종료 방식을 단순화: * NabiServer를 생성할때 Display와 Screen을 받고 거기에 따른 xim 서버를 생성하도록 한다. xim 서버에서 사용하는 window를 직접 만드는 것이 외부에서 윈도우를 제공 받는 것보다 좋은 선택인것 같다. * 따라서 GtkWidget이 realize될때까지 기다릴 필요가 없이 바로 서버를 시작해도 되므로 realize 시그널에 처리하지 않고 바로 nabi_server_start() 함수를 부른다. * NabiServer에서 root window 관련 기능도 Xlib을 이용해서 구현한다. git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@712 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/main.c M src/server.c M src/server.h commit baf4c4706b67bb1d89b9dd381161903dfc17fe6e Author: Choe Hwanjin Date: 2008-10-06 18:27:04 +0900 preedit font 설정: * 처음에 app가 시작할때 설정값을 읽어오는 곳 처리 * preedit font 초기값을 nabi_server_new()에서 설정하는 것이 맞음 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@711 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/server.c M src/ui.c commit c52c1e9dfc381df21a67d1ba111d292b85c8725c Author: Choe Hwanjin Date: 2008-10-06 18:10:56 +0900 preedit string 관리 코드 개선 * preedit string의 font에 대한 옵션 추가 * 설정 윈도우에 preedit_font 설정 버튼 추가 * 설정값에 preedit_font를 추가하고 ic에서 preedit string을 그릴때 이 폰트를 사용하여 그리도록 처리 * 이 옵션은 off the spot, root window 옵션일 경우에만 적용됨 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@710 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/conf.c M src/conf.h M src/ic.c M src/preference.c M src/server.c M src/server.h commit cea3a43073799574b357612376fd3b207820de91 Author: Choe Hwanjin Date: 2008-10-06 16:55:16 +0900 NabiServer 코드 정리: * nabi_server_init()함수를 nabi_server_new()에 포함시키고 지움 nabi_server_init()함수를 따로 사용하지도 않는데 굳이 분리해둘 필요가 없는 것 같음 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@709 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/main.c M src/server.c M src/server.h commit 8adf051d030b175af78c3dc541ab05e03bff0415 Author: Choe Hwanjin Date: 2008-10-06 16:38:58 +0900 NabiServer 코드 개선: * 사용하지 않는 GdkGC 제거 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@708 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/server.c M src/server.h commit 09600ed30392c9fd5152c5edc23d517e6b72af86 Author: Choe Hwanjin Date: 2008-10-05 19:50:31 +0900 XLookupKeysym() 함수가 실패할 경우의 처리 * XLookupKeysym()이 실패하면 XLookupString()으로 한번더 키를 찾아본다. * Xkb로 여러 자판을 설정해 놓고 쓰는 경우 기본 자판이 아닌 것들은 XLookupKeysym()으로 찾질 못해서 키를 변환하지 못하는 일이 발생한다. 이 문제를 해결하기 위해서 XLookupString()으로 한번더 체크한다. * 일부 환경에서 한번 한글 모드로 전환한 후에는 shift-space 키가 작동하지 않는 문제가 있었다. * 버그: #304811 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@707 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/handler.c commit de42edcf7ba6878bc24ff759bf56adf975cadf1d Author: Choe Hwanjin Date: 2008-10-05 16:03:11 +0900 nabi handlebox 구현 개선: * window의 속성을 GDK_WINDOW_TYPE_HINT_TOOLBAR 로 설정 * keep above 속성이나 stick 속성은 handlebox에서 결정할 것이 아니라 app에서 결정할 내용이므로 제거 * 화면 해상도가 런타임에 바뀔 경우 창의 위치가 바뀌던 문제 수정 nabi_handle_box_size_allocate() 함수에서 gdk_window_resize()를 부르던 부분이 문제가 있는 것 같음 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@706 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/handlebox.c commit b73556e395ffa42571914b9ad27ca8d51fcfd816 Author: Choe Hwanjin Date: 2008-10-05 12:49:26 +0900 자판을 바꾼후에도 툴팁이 갱신되지 않는 문제 수정 * 툴팁 관련 포인터를 NabiApplication structure에 저장하고 있다가 업데이트 하도록 바꿈 * 관련해서 keyboard 변경시에 keyboard 버튼 업데이트하는 방식도 바꿈 * 버그 #305100 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@705 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/nabi.h M src/server.c M src/server.h M src/ui.c commit 32dd0f6dc19591b07c013bc40e9e9a8b5c3f69cf Author: Choe Hwanjin Date: 2008-10-05 11:16:49 +0900 팔레트 구현 수정: * palette를 menubar를 사용하지 않고 button으로 구현 menubar의 decoration이 볼록한 느낌이라 별로임 * menubar를 쓰지 않으므로 menuposition 함수를 사용해야 함 * 또한 menu position 함수도 allocation을 사용하도록 수정 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@704 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/nabi.h M src/ui.c commit 502b18194cb671c23bb9f5ee5aaf3c39212fc605 Author: Choe Hwanjin Date: 2008-04-20 16:38:19 +0900 0.99.2 release git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@702 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M configure.ac commit 7fec14c4bd988a9d62d025ecc015f1acef398ed4 Author: Choe Hwanjin Date: 2008-04-20 16:37:09 +0900 문서 업데이트 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@701 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog M NEWS commit d50f50c53afd3ed394262e9fd259b2dd7339780f Author: Choe Hwanjin Date: 2008-04-20 16:32:56 +0900 libhangul 0.0.8 이상 사용: #304770 수정을 위해 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@700 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M configure.ac commit 3e3ef5a965f5f1ce346cbf03559a8f4a3362ed92 Author: Choe Hwanjin Date: 2008-04-20 16:26:29 +0900 po 업데이트 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@699 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M po/de.po M po/ko.po commit 087ffa429fe2a70b5e5cd9328ffa6d2fb3d4ab01 Author: Choe Hwanjin Date: 2008-04-20 16:05:09 +0900 gcc에 debug 옵션 추가 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@698 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M test/Makefile commit d9ab2dac90b8d31131f395d6a1d16509efcedc72 Author: Choe Hwanjin Date: 2008-04-20 15:52:06 +0900 자판 변경후 output mode 옵션을 항상 재설정함 * 나비버그: #304770 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@697 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ic.c commit be6e8cb4b34ac85377ab79e86915193fb38f033c Author: Choe Hwanjin Date: 2008-04-20 15:16:59 +0900 한자 변환 기능 버그 수정: * 한자 변환 전에 자모형을 음절형 스트링으로 변환후 검색 시도 - 나비버그: #304770 * ic의 Preedit string을 gunichar array로 가지고 있도록 변경 * nabi_u4str_xxx() 함수들 추가 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@696 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ic.c M src/ic.h commit ad7b5faf8f946d4002a3efb1724322164f7a6b52 Author: Choe Hwanjin Date: 2008-03-25 11:35:10 +0900 update german translation: Thanks to Niklaus Giger git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@694 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M po/de.po commit 65b587d4ebcd08a63eab1066733501615d659b7d Author: Choe Hwanjin Date: 2008-02-24 20:54:32 +0900 memory leak 수정: * IMdkit 코드에서 XFree()를 쓰던 곳을 free()로 변경. 이 코드들은 malloc()으로 할당하고도 XFree()를 쓰고 있었음 * IMdkit에서 빠진 몇가지를 free 하도록 처리 * nabi 코드에서 free하지 않던 스트링 처리 * default_icon 처리 루틴 단순화 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@693 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M IMdkit/IMConn.c M IMdkit/XimFunc.h M IMdkit/i18nClbk.c M IMdkit/i18nIc.c M IMdkit/i18nMethod.c M IMdkit/i18nPtHdr.c M IMdkit/i18nUtil.c M IMdkit/i18nX.c M src/conf.c M src/ic.c M src/server.c M src/ui.c commit 3d09cbb7d07bfa11ede401368bd710d6477934ef Author: Choe Hwanjin Date: 2008-02-10 14:14:57 +0900 트레이 아이콘의 툴팁에 자판 정보 나오게 함 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@692 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M po/de.po M po/ko.po M src/ui.c commit 6ba866838a0fac1c583c130c30e73ee78e6bb5ae Author: Choe Hwanjin Date: 2008-02-04 02:36:12 +0900 기본 설정의 간체자 사용 옵션 값을 FALSE로 설정 (#304722) git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@691 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/conf.c commit b76134bea0e2e828411b7a55b74a2619a48ce769 Author: Choe Hwanjin Date: 2008-01-23 23:23:32 +0900 keyboard layout 설정 버그 수정 * nabi_server_set_keyboard_layout() 함수에서 server 포인터 처리 실수 * #304700 수정 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@690 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/server.c commit c1b86b89167fd771bddc370eac92141d95b687e2 Author: Choe Hwanjin Date: 2008-01-05 23:25:31 +0900 theme list에 svg icon이 있으면 svg를 보여주도록 함 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@689 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/preference.c commit ec0c96cad455f71cb6a3ba42e4252a30dee312b9 Author: Choe Hwanjin Date: 2008-01-05 22:59:25 +0900 0.99.1 release git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@687 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M configure.ac commit 93656dbedf3384787904acfcba4fcd7188c24e27 Author: Choe Hwanjin Date: 2008-01-05 22:59:10 +0900 문서 업데이트 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@686 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M AUTHORS M ChangeLog M NEWS commit cb03ef3dacaed5ff4bbe42f209866cedfdd2e7bd Author: Choe Hwanjin Date: 2008-01-05 22:56:29 +0900 번역 파일 업데이트 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@685 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M po/de.po M po/ko.po commit 0484a578a59b47fa177709d5813392beed94aef8 Author: Choe Hwanjin Date: 2008-01-05 13:41:16 +0900 ${datadir}/locale 대신 ${localedir} 사용 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@684 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/Makefile.am commit 3b57ba0603174d7238973c3fd49615721361b0cc Author: Choe Hwanjin Date: 2008-01-01 20:28:57 +0900 HAVE_LIBSM 처리를 session.c 안에서 함 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@683 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/main.c M src/session.c M src/session.h commit f9d890a0625bf6e31828718584075c8aa9e559d2 Author: Choe Hwanjin Date: 2008-01-01 20:20:02 +0900 about window의 copyright 연도 갱신 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@682 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ui.c commit 2ff9b2513ce2eef20df0b1801aeea93c0c6d2f57 Author: Choe Hwanjin Date: 2008-01-01 20:17:59 +0900 필요없는 파일 삭제 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@681 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 D src/automata.c commit 22e1061beb91eacb2cb339ffcdd7b4d001faab81 Author: Choe Hwanjin Date: 2008-01-01 20:09:05 +0900 update copy right year git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@680 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/candidate.c M src/candidate.h M src/conf.c M src/conf.h M src/debug.c M src/debug.h M src/fontset.c M src/fontset.h M src/handlebox.c M src/handlebox.h M src/handler.c M src/ic.c M src/ic.h M src/keycapturedialog.c M src/keycapturedialog.h M src/main.c M src/nabi.h M src/preference.c M src/sctc.h M src/server.c M src/server.h M src/session.c M src/session.h M src/ui.c M src/util.c M src/util.h commit bc22cd653e46fde068ece7258e4ade4f65353318 Author: Choe Hwanjin Date: 2008-01-01 19:51:44 +0900 단축키를 등록하기 전에 이미 등록되어 있는지 확인하는 코드 추가 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@679 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M po/de.po M po/ko.po M src/preference.c commit 03b7c331f2f9e106feb5479ebf4ff3e5f3f033d2 Author: Choe Hwanjin Date: 2008-01-01 18:42:45 +0900 key capture dialog의 메시지 업데이트 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@678 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M po/de.po M po/ko.po commit 6d99f04bb0ec66194952e18b47b26a27640fbbfd Author: Choe Hwanjin Date: 2008-01-01 18:07:33 +0900 나비 설정 창, 한자탭의 한자키 설정 부분의 여백 크기 조정 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@677 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/preference.c commit c6da5a3f85e0b9a0e41955c5127c26e46e821b74 Author: Choe Hwanjin Date: 2008-01-01 18:05:29 +0900 key capture dialog의 여백 조정 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@676 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/keycapturedialog.c commit 777e47737d9641220ecd745271c07683eb0e777a Author: Choe Hwanjin Date: 2008-01-01 00:04:12 +0900 한영전환키, 영어전환키, 한자키 설정 gui 코드 개선 * key capture dialog를 popup하는 코드를 on_key_list_add_button_clicked() on_key_list_remove_button_clicked() 함수로 통합 * 각각 키를 NabiServer에 설정하는 코드를 model의 "row-changed", "row-deleted" 시그널의 callback으로 등록하여 처리 * 키를 추가하기 전에 이미 등록된 키인지 확인 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@675 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/preference.c commit 3c0652c232ef2a551d01ab672173b90bfc717ac1 Author: Choe Hwanjin Date: 2007-12-31 02:17:33 +0900 여러가지 key list를 보여주는 treeview를 생성하는 코드를 하나로 모아서 create_key_list_widget() 함수로 구현 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@674 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/preference.c commit 84d04a1be71e7b99bce3bf78abd03ba35979d73c Author: Choe Hwanjin Date: 2007-12-29 19:30:08 +0900 nabi는 svn r605 이후 버젼 부터는 libhangul 0.0.5 버젼 이상이 필요함 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@673 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M configure.ac commit 2c8546fc59560c243ec99bae38d57f1f3f8343f9 Author: Choe Hwanjin Date: 2007-12-29 18:20:38 +0900 preference 창을 생성하는 코드에 create_pref_item() 함수를 사용해서 조금이라도 간단하게 처리함 번역 업데이트 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@672 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M po/de.po M po/ko.po M src/preference.c commit 0d9918099332a15e7e85e0d6884ef8361f6caa63 Author: Choe Hwanjin Date: 2007-12-29 16:42:13 +0900 입력모드를 영어로 바꾸는 키 설정 기능 추가 * off key가 들어 오게 되면 키 입력을 xim에서 사용하지는 않고 입력 상태만 direct mode로 바꾸도록 함 * 설정에 offkeys 추가, 초기값은 escape만 처리 emacs를 위해서 control-x를 추가하려 했으나, control-x는 일반적으로 cut 기능으로 많이 쓰는 단축키라서 전환이 일어나면 불편할 사용자들이 많을 것 같다. * NabiServer에 관련 함수 구현 * Preference dialog에 Off keys 설정 추가 * Feature Request: #304688 http://kldp.net/tracker/index.php?func=detail&aid=304688&group_id=275&atid=350275 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@671 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/conf.c M src/conf.h M src/ic.c M src/preference.c M src/server.c M src/server.h commit f68618bbe65377e6fdf9a26d7dff37278c49dc61 Author: Choe Hwanjin Date: 2007-12-26 23:04:27 +0900 불규칙적으로 입력기가 블락 되는 문제 해결: * nabi 사용중에 불규칙적으로 입력이 더이상 되지 않던 문제를 해결함 * 원인은 일부 xim client에서 XNextEvent()와 XFilterEvent()사이에서 ic focus전환을 하면서 XIM_SYNC_REPLY를 xim 서버에서 받지 못하게 되고 xim server가 한정없이 XIM_SYNC_REPLY를 기다리면서 새로 forwarding되는 이벤트를 처리하지 않고 queue에 쌓아두면서 발생함. * set focus, unset focus에서 sync 상태로 이벤트를 기다리는 client들을 모두 async로 바꾸고 queue를 비워버림 일단 문제는 피해갈수 있지만 좋은 해결책은 아닐거라 생각함. * 디버깅을 위해서 nabi_log()함수로 메시지 출력 * 버그: #300802 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@670 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M IMdkit/i18nPtHdr.c commit 808a4b2989d56cd8295b05a5c55b7746ebf4b199 Author: Choe Hwanjin Date: 2007-12-26 22:57:48 +0900 preedit window hide 하기 전에 visible 인지 확인함 그렇지 않으면 X에서 BadWindow 에러남 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@669 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ic.c commit 782937088a4446d62b3dc5e1ac03181781293454 Author: Choe Hwanjin Date: 2007-12-26 17:55:01 +0900 ic 관리 루틴 개선 * ic를 NabiConnection에서 관리하도록 하고 NabiServer에 있던 ic table 관리 코드를 삭제 * ic를 생성/삭제할때 cache 처리하지 않고 바로 바로 삭제함 * ic id는 connection마다 unique 하고, 감소하는 경우 없이 계속 증가하기만 함. 0은 유효하지 않은 값으로 처리, 16비트 범위를 넘어선 경우에는 다시 1부터 시작 key event 처리 수정 * key release event를 받도록 변경 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@668 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/handler.c M src/ic.c M src/ic.h M src/server.c M src/server.h commit 9e7d1d798b59de3ffb5bff92f9300e6a40fd2246 Author: Choe Hwanjin Date: 2007-12-23 16:25:19 +0900 번역 파일 업데이트 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@666 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M po/de.po M po/ko.po commit 6c6dbb70999ab879aa6eacb5cfce4ee012384bed Author: Choe Hwanjin Date: 2007-12-23 16:23:05 +0900 문서 업데이트 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@665 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog M NEWS commit 7584531b10d04c1484afbb9816f82814d6d8f705 Author: Choe Hwanjin Date: 2007-12-23 16:21:52 +0900 nabi 0.99.0 작업 준비 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@664 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M configure.ac commit b4946dc90786907d33beff4c8ae3dcc96836faac Author: Choe Hwanjin Date: 2007-12-23 16:15:04 +0900 컴파일러 워닝 방지 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@663 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M IMdkit/i18nAttr.c commit 60d2e95c603186479de1bb5c453fadf9e23482f5 Author: Choe Hwanjin Date: 2007-12-23 13:42:29 +0900 같은 이름의 xim이 이미 작동중인지 확인하는 코드 추가 * nabi_server_is_running() 추가 * nabi_server가 생성되었는지에 따라 코드가 작동하도록 수정 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@662 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/main.c M src/server.c M src/server.h commit 0b74475a12f929ea34756a4d58cf0c80542418d3 Author: Choe Hwanjin Date: 2007-12-21 00:23:49 +0900 로그 함수 개선: 시작시간과 끝나는 시간을 모두 기록 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@661 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/server.c M src/server.h commit ca0a5b18b1b621a2b8fa72e59f8bd8674bc45387 Author: Choe Hwanjin Date: 2007-12-20 23:40:21 +0900 번역 업데이트 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@660 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M po/de.po M po/ko.po commit 16a6e20c46d597bfc7e90dd54b1e9cb09e82a94d Author: Choe Hwanjin Date: 2007-12-20 00:33:04 +0900 input mode info: * input mode 정보를 업데이트 하는 코드를 ui.c 에서 NabiServer 쪽으로 옮김 * NabiServer에서 mode_info_cb를 삭제하고 그와 관련된 코드도 삭제 * nabi_server_set_mode_info()를 사용하여 상태 업데이트 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@659 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/handler.c M src/ic.c M src/server.c M src/server.h M src/ui.c commit e2d86f87893df7834bd0bea9594d8a46470282e1 Author: Choe Hwanjin Date: 2007-12-20 00:10:21 +0900 필요 없는 데이터타입 제거 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@658 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/server.h commit 06904eadc6fe39abc184f954f6cbd9b6ac310126 Author: Choe Hwanjin Date: 2007-12-20 00:07:51 +0900 입력 모드 관리 옵션 구현: * 입력 모드를 per desktop, per application, per toplevel, per context로 세분하여 구현함 * toplevel 별로 입력 모드를 관리하는 기능 구현 * 입력 모드 관리 방법에 따른 옵션 조정 ui 추가 * NabiServer에 toplevel 리스트 추가 * NabiIC에 관련 함수 구현(NabiToplevel 추가) client_window에서 toplevel window 찾는 루틴 구현 * global_input_mode 옵션 제거 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@657 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/conf.c M src/conf.h M src/handler.c M src/ic.c M src/ic.h M src/preference.c M src/server.c M src/server.h M src/ui.c commit 79c324f701a9bcbabf880b615f3389bf7ef65bb2 Author: Choe Hwanjin Date: 2007-12-19 16:13:45 +0900 notification area 프로그램이 갑자기 죽는 경우 처리 * peksystray로 여러번 테스트해봤지만, 이제는 죽는 현상은 발생하지 않고 작동하는 것으로 나와서 처리할 방법이 애매하여 등록된 버그에 올라온 패치를 적용하는 것으로 마무리함 * 참고: [#300760] E16.8의 systray 사용후 E restart시 nabi 죽는 문제 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@656 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/eggtrayicon.c commit ad672da83d8f88afaa2e0ce4f4fb1a8fd7e1bb03 Author: Choe Hwanjin Date: 2007-12-19 15:49:53 +0900 memory leak 수정 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@655 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/conf.c M src/ui.c commit 98a9bb6ee70e55fcdea65e4318f3986400678a62 Author: Choe Hwanjin Date: 2007-12-19 15:49:32 +0900 디버그 메시지 출력 개선 (flush) git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@654 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/debug.c commit 60ab26195fdfec0fa6ed2a4b914aef021e8d4c45 Author: Choe Hwanjin Date: 2007-12-18 18:00:35 +0900 * nabi_server_toggle_input_mode() 함수 구현 * NABI_MODE_INFO_ENGLISH -> NABI_MODE_INFO_DIRECT * NABI_MODE_INFO_HANGUL -> NABI_MODE_INFO_COMPOSE git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@653 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ic.c M src/server.c M src/server.h commit ce19fd39a1986735c164f261fc9e55f8902fddf0 Author: Choe Hwanjin Date: 2007-12-18 17:59:21 +0900 tray icon을 마우스의 아무 버튼으로나 클릭해도 메뉴가 나오게 함 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@652 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ui.c commit b4e1edfda04dcd6615ec5911f4070cc292cc95d7 Author: Choe Hwanjin Date: 2007-12-18 15:17:17 +0900 디버그 메시지 출력 변경: * 디버그 메시지 출력 포맷 변경 * session 관련 메시지 디버그출력 루틴 사용 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@651 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/debug.c M src/session.c commit cb27d97be68d32c771dd2eb44f24292380281c7c Author: Choe Hwanjin Date: 2007-12-18 14:37:45 +0900 --status-only (-s) 옵션을 사용한 경우 처리 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@650 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/preference.c M src/server.c M src/ui.c commit 581beae120ed4dd7a0ed7c7434f73d4819a441b9 Author: Choe Hwanjin Date: 2007-12-17 21:10:14 +0900 아이콘 리사이징 루틴 개선 * 크기 계산할때 반올림 처리 * 리사이징 옵션 GDK_INTERP_TILES으로 변경 * 디버그 메시지 출력 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@649 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ui.c commit 2b1de7f18a0345663a77f365750ee8af5ebd679f Author: Choe Hwanjin Date: 2007-12-17 21:02:16 +0900 세로 패널에 아이콘이 들어갈 경우 크기 계산에서 오류 발생하는 문제 수정 참고: #304681 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@648 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ui.c commit 08ada932393900d828cb4ddddcbcab22e6b28045 Author: Choe Hwanjin Date: 2007-10-29 00:38:19 +0900 XIM api 호출 테스트를 위한 코드 추가 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@647 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M test/Makefile A test/xim_filter.c commit 4c7b4203802ecb0c1b7a77075bb8564bd004804f Author: Choe Hwanjin Date: 2007-10-28 00:52:16 +0900 간체자 입력 기능 구현: * 설정창 한자탭에 "간체자로 입력" 옵션 추가 * config에 use_simplified_chinese 옵션 추가 * util.c util.h sctc.h를 추가하고 nabi_traditional_to_simplified() 함수를 이용하여 간체자와 번체자간 변환을 처리 * 옵션에 대한 번역 업데이트 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@646 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M po/de.po M po/ko.po M src/Makefile.am M src/candidate.c M src/conf.c M src/conf.h M src/ic.c M src/preference.c A src/sctc.h M src/server.c M src/server.h M src/ui.c A src/util.c A src/util.h commit 609330908d710821d62cab38f0a0966f272298c7 Author: Choe Hwanjin Date: 2007-10-20 23:17:04 +0900 #304587 프랑스어 자판 버그 수정 ( ugrave -> apostrophe ) git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@645 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/keyboard_layouts commit ddaaa0c49552972b708103953127559206ac9b11 Author: Choe Hwanjin Date: 2007-10-07 10:41:56 +0900 문서 업데이트 번역 업데이트 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@642 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog M NEWS M TODO M po/de.po M po/ko.po commit 5d77fda0debb4e8b92858861b260f82db6bd0acb Author: Choe Hwanjin Date: 2007-10-07 10:39:40 +0900 0.19 버젼 작업 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@641 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M configure.ac commit aea81e39d082234c86a9ed27825e03e29fde66c1 Author: Choe Hwanjin Date: 2007-10-07 10:38:23 +0900 kingsejong2를 dist 패키지에 추가 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@640 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M themes/Makefile.am commit 3f0f86c4dd46df6cdc06b6560a7be985d5ac2e2d Author: Choe Hwanjin Date: 2007-10-03 23:17:46 +0900 Mac 테마도 제거함 (라이센스 문제가 있을 수 있음) git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@639 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M themes/Makefile.am commit 4dc5deae2fb144af4bbc5f7ed64d869bbe2e91df Author: Choe Hwanjin Date: 2007-08-15 17:13:51 +0900 MS-Windows 관련 테마 제거 * 라이센스상 문제의 소지가 있음 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@638 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M themes/Makefile.am commit b1f27d91fa392776b112f9ad4539812fa62d14bc Author: Choe Hwanjin Date: 2007-08-15 17:12:20 +0900 번역 업데이트 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@637 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M po/de.po M po/ko.po commit c6e69fd8346dc16e42ef8f32c5d2fea9d2377e20 Author: Choe Hwanjin Date: 2007-08-15 17:11:47 +0900 theme loading 실패할때 error 처리 * 오류 메시지 상자 출력 루틴 추가 * GtkWindow의 default icons 세팅 루틴을 에러 메시지 박스가 뜨기 전으로 옮김 * load_icon()에서 잘못된 메모리 관리 수정 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@636 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ui.c commit eb043d74d0f444e5c146f8c4c4ae9014de2d0e41 Author: Choe Hwanjin Date: 2007-08-13 01:11:13 +0900 KingSejong2 아이콘 추가 Stefan Krämer 님이 보내주신 것 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@635 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 A themes/KingSejong2/README A themes/KingSejong2/english.png A themes/KingSejong2/hangul.png A themes/KingSejong2/none.png M themes/Makefile.am commit b2544730f2d0e812e6183b488cd6e366410249c3 Author: Choe Hwanjin Date: 2007-07-21 17:20:26 +0900 candidate에 symbol table 추가: 자음으로 기호 입력하는 기능 구현 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@634 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ic.c M src/server.c M src/server.h M tables/Makefile.am A tables/symbol.txt commit 51cd888f8e65250c066bb2fdb04096e4327bfc4a Author: Choe Hwanjin Date: 2007-07-21 17:18:44 +0900 사용하지 않는 변수 제거 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@633 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/main.c commit bb2b6b09f79ca802fdc74499f94ccfeac560d914 Author: Choe Hwanjin Date: 2007-07-08 23:25:59 +0900 문서 업데이트 ChangeLog 생성룰 개선 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@632 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog M Makefile.am M NEWS commit 71173a37facfbb8572f150e6c3c6d105ac08601e Author: Choe Hwanjin Date: 2007-07-08 22:35:12 +0900 번역 업데이트 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@631 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M po/de.po M po/ko.po commit 17f28e3fd6629c90766fda2add6948982db4e9ec Author: Choe Hwanjin Date: 2007-07-08 00:27:04 +0900 gdk_pixbuf_unref() 대신 g_object_unref() 사용 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@630 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/preference.c M src/ui.c commit 4b21f4ccbbbbbe8a6c322138294c65ca277553f4 Author: Choe Hwanjin Date: 2007-07-08 00:25:38 +0900 X server가 종료할때 설정 저장하도록 처리 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@629 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/main.c commit fd49013bd9f5df941a61dce884abfff44b8c3df5 Author: Choe Hwanjin Date: 2007-06-06 23:19:23 +0900 state icon을 GtkBox를 쓰던 코드에서 GtkNotebook으로 바꿈 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@628 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ui.c commit f70baf07b11ff256e3e27013832c978080724371 Author: Choe Hwanjin Date: 2007-06-06 22:59:04 +0900 * 종료시 발생하는 warning 처리 gtk_style_detach: assertion `style->attach_count > 0' failed * 종료시에는 tray icon을 생성하기 위한 idle 함수를 추가하지 않음 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@627 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ui.c commit ce2f03e86571ed3a91925e09686c4f8b90b41bb8 Author: Choe Hwanjin Date: 2007-05-28 22:27:57 +0900 libhangul의 바뀐 callback 등록 api에 맞게 수정함 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@626 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ic.c commit d8b4d1e4446195efebc33a1fd234866beba88731 Author: Choe Hwanjin Date: 2007-03-21 22:53:41 +0900 * themes Makefile을 subdir로 나눠놨던 것을 하나로 합침 * 0.18 버젼 준비 configure.ac 버젼 업데이트 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@625 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M configure.ac D themes/Jini/Makefile.am D themes/KingSejong/Makefile.am D themes/MSWindows/Makefile.am D themes/MSWindowsXP/Makefile.am D themes/Mac/Makefile.am M themes/Makefile.am D themes/Onion/Makefile.am D themes/SimplyRed/Makefile.am D themes/Tux/Makefile.am D themes/keyboard/Makefile.am commit 19a1db342707458273ae772438718e1e21629b53 Author: Choe Hwanjin Date: 2007-03-21 22:37:32 +0900 번역 업데이트 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@624 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M po/de.po M po/ko.po commit 6c9a9428434b1dc24bb7f3a8be8ec5a68c0cb687 Author: Choe Hwanjin Date: 2007-03-21 22:31:47 +0900 * XOpenIM()이 실패했을 경우 처리 * XCreateIC()가 실패했을 경우 처리 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@623 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M test/xlib.cpp commit f640a17a36d4e8d5df1fca6277fb4f43d8b91c4c Author: Choe Hwanjin Date: 2007-03-08 22:45:35 +0900 * libhangul의 OnTranslate와 OnTransition에 callback 연결 * nabi_connection_create()에서 encoding대신 locale을 받도록 함 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@622 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ic.c M src/server.c commit 5bc281e25944cedb28d10fc96f4dbd942ebcf298 Author: Choe Hwanjin Date: 2007-02-26 01:14:19 +0900 "단어/글자" 옵션을 palette에서 제거 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@621 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ui.c commit cd4e14fcf7909b850d09608b3d98144ebe52066d Author: Choe Hwanjin Date: 2007-02-26 01:12:09 +0900 NabiHandleBox: * child의 크기 변화에 따라서 자동으로 palette 크기가 변하게 함 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@620 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/handlebox.c commit 85e59015b28d48f6fddb1bc1ca56ed1877969a07 Author: Choe Hwanjin Date: 2007-02-05 00:32:45 +0900 데스크탑에서 단일 한글 모드 사용 옵션 추가: * global_input_mode 옵션 추가 * 기본값을 global_input_mode = true로 설정 * 설정창에도 옵션 추가 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@619 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/conf.c M src/conf.h M src/handler.c M src/ic.c M src/ic.h M src/preference.c M src/server.c M src/server.h M src/ui.c commit 6ba3cad501f9973c132a0026a10fcc6b910e7394 Author: Choe Hwanjin Date: 2007-02-05 00:00:46 +0900 사용하지 않는 변수 제거 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@618 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ui.c commit aa6bcc5a63d69b308e2cc499419c0e655ca65cad Author: Choe Hwanjin Date: 2007-02-04 17:58:35 +0900 GetIMValuesMessageProc(): protocol handler를 부르기 전에 free하는 것 순서 조정 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@617 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M IMdkit/i18nPtHdr.c commit 113c4663ec6870497b7e4dec7bef2d48ae28bd1d Author: Choe Hwanjin Date: 2007-02-04 17:45:19 +0900 디버그 메시지 정리 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@616 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/server.c commit 1590deb4a21f679940f10ea4e0521f221dc1ba66 Author: Choe Hwanjin Date: 2007-02-04 17:40:07 +0900 한자 입력 포맷 옵션 수정 * 한자 입력 포맷 간경 조정 * 한자 입력 포맷을 제대로 설정하게 함(내부 설정값에 저장) git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@615 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/candidate.c commit 32d91a5351c308b0d424dd56dd6874e527cdbf11 Author: Choe Hwanjin Date: 2007-02-04 17:39:05 +0900 nabi_ic_destroy()에서 nabi_ic_preedit_done()하지 않음 프로그램 종료시에 xims 가 유효하지 않은 경우도 불리기 때문에 삭제한다. git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@614 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ic.c commit 69d3a21f379cbb990895f3f266ffb2cdc469a64f Author: Choe Hwanjin Date: 2007-02-04 17:11:51 +0900 한자 입력 포맷 옵션 추가 * 漢字, 漢字(한자), 한자(漢字)의 입력 형태를 선택할수 있음 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@613 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/candidate.c M src/conf.c M src/conf.h M src/ic.c commit 6db78756c6d6b806da45adc925315de06f387586 Author: Choe Hwanjin Date: 2007-02-04 16:18:59 +0900 * 한자 메뉴 제거 * 단어/글자 단위 입력 메뉴 초기 값 설정 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@612 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ui.c commit 853a582815e5d2d7aa91ad4e17ef8df7eeb707fb Author: Choe Hwanjin Date: 2007-02-04 16:08:14 +0900 about창의 copyright 연도 수정 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@611 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ui.c commit fd55fb33237c1991e14619352e8da342a2299eee Author: Choe Hwanjin Date: 2007-02-04 16:02:46 +0900 menu 개선 * palette show/hide 메뉴 추가 * 단어/글자 단위 입력 메뉴 추가 * menu 관련 함수 정리 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@610 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/nabi.h M src/ui.c commit d09301a4be27194d3f67b6bae897759fadd6266d Author: Choe Hwanjin Date: 2007-02-03 23:28:05 +0900 trigger key를 실행 중간에 변경할수 있도록 수정 * nabi_server_set_trigger_keys()에서 IMSetIMValues()를 이용하여 on key list를 업데이트 함 * IMSetIMValues()안에서는 새로 IMOnKeysList 값을 설정했을때에도 다시 값을 설정하도록 함 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@609 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M IMdkit/i18nMethod.c M src/server.c commit 000a86af70647b1035d99f1d2cb6eccf3d75e0af Author: Choe Hwanjin Date: 2007-02-03 22:27:57 +0900 palette 모양 개선: * NabiHandlebox를 이용하여 palette 구현 * tray icon 관리 루틴 개선 * NabiPalette, NabiTrayIcon으로 관리 * palette에 한/영 상태 아이콘 추가, 단어/글자 단위 메뉴 추가, 기본 메뉴 추가 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@608 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/Makefile.am M src/conf.c M src/conf.h M src/main.c M src/nabi.h M src/server.c M src/server.h M src/ui.c commit 29b6a914a32300a355a0e12f9de56e4d3d8f3b95 Author: Choe Hwanjin Date: 2007-01-24 00:39:12 +0900 NabiHandleBox 코드 추가 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@607 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 A src/handlebox.c A src/handlebox.h commit 1b43e9d42b47caf2f50fd215b4813a2fb035dc07 Author: Choe Hwanjin Date: 2007-01-20 21:49:58 +0900 * log 함수 개선: - 입력된 개수가 없으면 쓰지 않음 - log 출력 루틴을 정리 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@606 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/main.c M src/server.c commit ae2018bc316e22c83e6265189cb54ea8ed34649d Author: Choe Hwanjin Date: 2007-01-20 20:55:07 +0900 * 변경된 HangulICFilter 함수 수정 * 자동 순서 교정 기능 알고리듬 개선: - libhangul에 추가된 hangul_ic_has_jungseong(), hangul_is_jongseong() 사용 - NabiIC에서 사용하지 않는 변수 제거 * 키 입력 로그 개선: - nabi_server_on_keypress() -> nabi_server_log_key() 로 이름 변경 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@605 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ic.c M src/ic.h M src/server.c M src/server.h commit f2bb135c50b89ac2a29609583139a9f59d9f860c Author: Choe Hwanjin Date: 2007-01-15 00:56:17 +0900 기본 preedit string의 색상을 설정 값을 fg와 bg를 서로 뒤바꿈 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@602 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/conf.c commit 2fa46a1a3523042f74654b9bc27d2d51304303de Author: Choe Hwanjin Date: 2007-01-15 00:53:42 +0900 0.17 준비 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@600 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M configure.ac commit 54e616d6519b694edd667560c924b222ff871988 Author: Choe Hwanjin Date: 2007-01-15 00:52:58 +0900 문서 업데이트 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@599 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog M NEWS commit 4b74602b98196b50e579a87f784253004d5513a8 Author: Choe Hwanjin Date: 2007-01-14 23:45:54 +0900 번역 업데이트 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@598 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M po/de.po M po/ko.po commit 1485743d23540fc39442543fdfb8f28e2e944f51 Author: Choe Hwanjin Date: 2007-01-14 23:35:39 +0900 메뉴에서 자판을 변경했을 때는 바로 설정을 저장함 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@597 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ui.c commit 647aeaac8a4161d45d3eddaadec58a92a69ecc08 Author: Choe Hwanjin Date: 2007-01-14 23:25:05 +0900 automatic reorder 관련 옵션 추가: * 키의 순서가 뒤바뀌어 와도 자동으로 순서를 맞춰주는 기능을 켜고 끄는 옵션 추가 * auto_reorder 설정 키워드 추가 * nabi_server_set_auto_reorder() 추가 * nabi_ic_hic_filter()에서 순서가 뒤바뀐 경우 처리 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@596 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/conf.c M src/conf.h M src/ic.c M src/ic.h M src/preference.c M src/server.c M src/server.h M src/ui.c commit 75da9fde6de339fdd8962268b7e71159101cf2fa Author: Choe Hwanjin Date: 2007-01-14 17:34:54 +0900 메시지 출력 수정: * fprintf로 직접 출력한던 부분을 nabi_log()함수를 쓰도록 변경 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@595 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/fontset.c M src/ic.c M src/server.c commit 9f602de38fc7071092de88c89fb973e884d0f278 Author: Choe Hwanjin Date: 2007-01-14 17:22:10 +0900 preedit drawing 개선: * commit by word 옵션에 따라서 preedit 모양 개선 * normal text와 hilighted text로 나누어 그림 * 밑줄 그리는 루틴 추가 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@594 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/handler.c M src/ic.c M src/ic.h commit e18595f62c1f491f9126fe40ccb6bfbe4b54856d Author: Choe Hwanjin Date: 2007-01-14 17:19:12 +0900 commit by word 옵션을 시작할때 server에 적용함 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@593 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ui.c commit f4176e1c905f1cbe6289678ad1c4943a9b2913c0 Author: Choe Hwanjin Date: 2007-01-08 22:33:48 +0900 --with-default-keyboard configure 옵션 되살림 * NabiConfig에서 기본값을 DEFAULT_KEYBOARD를 참조하도록 함 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@592 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M configure.ac M src/conf.c commit eb35778098c3501cfaa2621efba96d6049c82871 Author: Choe Hwanjin Date: 2007-01-08 00:35:27 +0900 over the spot의 preedit string drawing 루틴 개선 * XmbTextEscapement() 대신 XmbTextExtents() 사용 * 매번 text의 extent를 저장해둠 * XFontSet에서 XExtentsOfFontSet()로 fontset의 metric 정보를 가져옴 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@591 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/fontset.c M src/ic.c commit c4ddd2c4600b577bda85cb67821d27f0d60d60ee Author: Choe Hwanjin Date: 2007-01-07 23:04:38 +0900 Xutf8 함수를 사용하지 않음 대신 Xmb 계열 함수를 사용함 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@590 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ic.c commit 4bb5bd708318d097de9677608261e3200dd1d793 Author: Choe Hwanjin Date: 2007-01-07 22:44:00 +0900 ResetICMessageProc()에서 commit_string을 free 해준다. git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@589 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M IMdkit/i18nPtHdr.c commit 855bca4f8769e8b7800b54c7a2e72f8e8311c36b Author: Choe Hwanjin Date: 2007-01-07 22:42:58 +0900 feedback의 마지막에는 0을 채워야 한다. git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@588 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ic.c commit 5fa0a2d0e3d2ca3dbf3a54c9897bfe5dee1f6986 Author: Choe Hwanjin Date: 2007-01-07 20:16:52 +0900 commit by word 옵션: * ui check 버튼 추가 * config에 엔트리 추가 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@587 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/conf.c M src/conf.h M src/preference.c M src/server.c M src/server.h commit 26805e3498430e0e76048ff99ed6b918313b3f37 Author: Choe Hwanjin Date: 2007-01-07 20:04:08 +0900 NabiServer에 commit_by_word 옵션 구현 * commit_by_word 옵션 추가 * NabiIC에 GString으로 preedit string을 들고 있도록 함 * candidate에서 key의 길이 만큼 preedit string을 지워준다. * candidate처리를 Hanja를 이용 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@586 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/candidate.c M src/candidate.h M src/ic.c M src/ic.h M src/server.c M src/server.h commit 5fb3b6b740359fccc46ea5575b2b1828ab2c4928 Author: Choe Hwanjin Date: 2007-01-07 16:46:32 +0900 NabiConfig 작성: * conf.c conf.h 추가 * configuration을 모두 NabiConfig로 관리함 * NabiApplication에서 멤버 일부를 NabiConfig로 옮김 * config 파일 관련 코드를 conf.c로 옮김 * preference에서 nabi_app_set_xxx()함수를 호출하던 것을 직접 NabiConfig 스트럭쳐의 내용을 바꾸도록 수정함 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@585 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/Makefile.am A src/conf.c A src/conf.h M src/main.c M src/nabi.h M src/preference.c M src/session.c M src/ui.c commit 7365badf5179442eeee95a909a2ca45c6dd430db Author: Choe Hwanjin Date: 2007-01-07 14:27:41 +0900 advanced option 추가: * event flow 옵션 추가 * xim name 옵션 추가 코드 정리: * 사용하지 않는 dvorak 관련 코드 제거 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@584 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/nabi.h M src/preference.c M src/server.c M src/server.h M src/ui.c commit 15a3e0228937306942244ed55678908ed3d5e791 Author: Choe Hwanjin Date: 2007-01-07 11:20:14 +0900 server: 사용하지 않는 코드 제거 * check_charset 관련 코드 제거 * converter 코드 제거 * dvorak 관련 코드 제거 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@583 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/server.c M src/server.h commit 19b716acd81cfbe8d16d445dc0fc2b6ffd750154 Author: Choe Hwanjin Date: 2007-01-07 11:05:08 +0900 잘못하여 중복되어 들어간 log를 제거함 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@582 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog commit 2cbe4d4ad683370e04a5c627cfce4d289c9f239d Author: Choe Hwanjin Date: 2007-01-07 11:03:39 +0900 테마: * svg 아이콘을 지원, svg아이콘을 먼저 사용하고 없으면 png 아이콘을 사용 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@581 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ui.c commit 07349832e0ac2afdcaa9ed830929317ee7f1c530 Author: Choe Hwanjin Date: 2007-01-07 10:40:34 +0900 fontset: * fontset 생성/삭제할때 debug log 메시지 출력 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@580 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/fontset.c commit 12a6039bd306c061b3ddca89927e266714d623f5 Author: Choe Hwanjin Date: 2007-01-07 00:48:39 +0900 SIGTERM에 대한 handler 등록 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@579 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/main.c commit e87d1e9aa478de0677926f675273c0cf75455bc6 Author: Choe Hwanjin Date: 2007-01-07 00:15:53 +0900 한영 모드 전환시 nabi_ic_flush()를 불러 남은 글자를 출력하도록 함 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@578 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ic.c M src/ic.h commit bb8dc877996a789eea973687b0587214e5260886 Author: Choe Hwanjin Date: 2007-01-06 22:51:18 +0900 update ChangeLog generating rule git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@575 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog M Makefile.am commit 4a8e513aaa70bff446fd2b0ff0149a452ddec5a5 Author: Choe Hwanjin Date: 2007-01-06 22:46:30 +0900 session code 활성화 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@574 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/main.c commit 4b43c010a2b127fb9ec7de47f455ec645b64fbdb Author: Choe Hwanjin Date: 2007-01-06 22:45:00 +0900 copyright 문구 업데이트 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@573 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/candidate.c M src/candidate.h M src/debug.c M src/debug.h M src/ic.c M src/ic.h M src/main.c M src/nabi.h M src/preference.c M src/server.c M src/server.h M src/ui.c commit 602f3605865a1e58d8afaa6ea0761910ac680312 Author: Choe Hwanjin Date: 2007-01-06 22:39:00 +0900 테스트하기 위해서 xim name을 "test"로 설정하던 코드를 제거 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@572 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/server.c commit bcdd7769c30c79d49052235956c2f079ecfc024b Author: Choe Hwanjin Date: 2007-01-06 16:43:40 +0900 문서 업데이트 ChangeLog 자동 생성룰 추가 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@570 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog M Makefile.am M NEWS commit 8a17b1186550d558d8c723b8b29c1939e14f0ac6 Author: Choe Hwanjin Date: 2007-01-06 16:11:39 +0900 * 0.16 릴리스 준비 * 빠진 파일들 소스리스트에 추가 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@569 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M configure.ac M src/Makefile.am commit fe6a3c6c1b46ac5fd792182fac3dae82b2283dc9 Author: Choe Hwanjin Date: 2007-01-06 16:09:42 +0900 update po files git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@568 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M po/de.po M po/ko.po commit cab9dd065e0f6898772cb4cee4eda5509f1a5f09 Author: Choe Hwanjin Date: 2007-01-06 16:07:14 +0900 기본 테마 아이콘을 Jini로 변경 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@567 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ui.c commit 47e849d05c5b447df6e82c8b41890de3a90f5bd2 Author: Choe Hwanjin Date: 2007-01-06 15:54:31 +0900 gcc 2.9 버젼에서 빌드가능하도록 변수 선언 위치 조정 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@566 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ic.c M src/preference.c commit 780f9a369a38541adab8a40eeb40e952f7085c4d Author: Choe Hwanjin Date: 2007-01-03 23:25:13 +0900 dvorak -> Dvorak 이름 변경 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@565 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/keyboard_layouts commit 391a015ed571ec4540147fadf8228342833189d0 Author: Choe Hwanjin Date: 2007-01-03 23:24:15 +0900 french 자판 배열 추가 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@564 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/keyboard_layouts commit 4ea0bbed932560e7373b23ca6088ed159d13111c Author: Choe Hwanjin Date: 2007-01-03 22:27:23 +0900 add comments git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@563 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/keyboard_layouts commit a4073033e9de0db7c67bf109513ec0d17279e065 Author: Choe Hwanjin Date: 2007-01-02 00:17:44 +0900 handler 함수들의 parameter를 각 함수에서 필요한 type으로 변경 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@562 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/handler.c commit fc11eb01ce9a0824b72d667d6eca7f476e13ae2f Author: Choe Hwanjin Date: 2007-01-02 00:05:43 +0900 디버그 메시지 출력 기능 구현: * -d [0-5] 옵션을 사용하여 디버그 메시지 출력하는 기능 추가 * debug.h, debug.c 추가 * nabi_log() 함수로 메시지 출력 * xim protocol 스트링 출력하는 코드를 xim_protocol.h 로 분리 ic 버그 수정: * fontset를 두번 free하던 코드 제거 * str이 없으면 commit 하지 않음 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@561 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/Makefile.am A src/debug.c A src/debug.h M src/handler.c M src/ic.c M src/main.c M src/ui.c A src/xim_protocol.h commit 54ce3ace12d2bf5f939663439ccec98e7e523ad7 Author: Choe Hwanjin Date: 2006-12-31 17:01:01 +0900 NabiConnection 사용: * NabiConnect를 NabiConnection으로 이름변경 * client의 encoding정보를 가지고 있음 * NabiIC는 NabiConnection을 사용해서 생성 NabiIC 변경: * ic를 destroy해야 할 때 ic를 즉시 삭제함 * NabiIC alloc/dealloc을 NabiServer에서 제공 * git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@560 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/candidate.c M src/candidate.h M src/handler.c M src/ic.c M src/ic.h M src/server.c M src/server.h M src/ui.c commit 486cfeffaecae750fa711a5c68e60d0f5d2b95c1 Author: Choe Hwanjin Date: 2006-12-30 13:48:43 +0900 입력기가 지원하는 locale의 목록에 encoding 정보를 추가하여 다시 작성 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@559 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/server.c commit a7e1ccd2b95ef7239a11fe4f46d18be3cafed9e4 Author: Choe Hwanjin Date: 2006-12-28 15:46:24 +0900 keyboard_layouts 파일 인스톨 룰 추가 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@558 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/Makefile.am commit f1b093ec84088a7faffa0c3359a57e572f3ee390 Author: Choe Hwanjin Date: 2006-12-27 23:41:11 +0900 hic의 filter 함수 구현 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@557 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ic.c commit 4d0a4019576f9882088be20afbdf86185f2088e3 Author: Choe Hwanjin Date: 2006-12-27 22:26:22 +0900 GtkSizeGroup delete하기 위한 코드 추가 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@556 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/preference.c commit 720eb47e29bd23d12555f785b6c1a78ed1a386dd Author: Choe Hwanjin Date: 2006-12-27 22:23:36 +0900 * keyboard_layout delete 하는 코드 추가 * nabi_server_get_hangul_keyboard_list()를 이용하여 hangul keyboard 정보 전달 * GtkSizeGroup을 이용하여 hangul keyboard와 latin keyboard combo box의 크기를 맞춤 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@555 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/preference.c M src/server.c M src/server.h M src/ui.c commit 81c3b9919158806632e763ea92455c92513f226d Author: Choe Hwanjin Date: 2006-12-27 21:29:10 +0900 키보드 배열 파일 추가(유럽어를 위한 것) git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@554 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 A tables/keyboard_layouts commit 7b5705e1c79697d4e946a4888c5b5deb7937277b Author: Choe Hwanjin Date: 2006-12-27 00:18:43 +0900 preference: * 한글자판, 영문자판 설정을 GtkComboBox로 변경 server: * keyboard layout에 default layout인 "none"을 추가 * layout을 설정하는 server 함수 추가 app: * hangul_keyboard와 latin_keyboard 설정 관련 코드 추가 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@553 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/nabi.h M src/preference.c M src/server.c M src/server.h M src/ui.c commit 895155fdb6800c2fbf881914683ccb282fdae5a1 Author: Choe Hwanjin Date: 2006-12-26 00:36:29 +0900 server.h: 사용하지 않는 struct 제거 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@552 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/server.h commit 6025fdeda17d2312b951bc488e9a8696a55d32f1 Author: Choe Hwanjin Date: 2006-12-25 22:13:10 +0900 * keyboard_layout 사용하는 코드 추가 * XK_exclam 과 XK_asciitilde 사이의 KeySym만 process 함 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@551 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ic.c M src/server.c commit da6e47bf9bcde8edf6936826e412009c851a16f9 Author: Choe Hwanjin Date: 2006-12-25 14:42:30 +0900 nabi_server_set_hangul_keyboard()의 인자를 id string으로 변경 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@550 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/server.c M src/server.h commit 66b79b4e4ab59092ead62e3db22c8f78ab5f3ffe Author: Choe Hwanjin Date: 2006-12-25 13:16:35 +0900 automata.c, hangul.c 파일은 제거함 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@549 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M po/POTFILES.in commit 6b67de842d3cb1c2342038500cbb484c6492a685 Author: Choe Hwanjin Date: 2006-12-25 12:07:35 +0900 libhangul 적용 * configure할때 libhangul이 있는지 확인함 * keyboard loading 루틴제거 * compose table loading 루틴 제거 * candidate 처리 코드를 libhangul의 것으로 대체 * automata를 libhangul의 HangulInputContext를 사용 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@548 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M configure.ac M src/Makefile.am M src/candidate.c M src/candidate.h M src/handler.c D src/hangul.c D src/hangul.h M src/ic.c M src/ic.h D src/keyboard.h M src/main.c M src/nabi.h M src/preference.c M src/server.c M src/server.h M src/ui.c commit 6f678cbba2b1be49651379fd0ba514c967dfe358 Author: Choe Hwanjin Date: 2006-12-22 22:01:48 +0900 debug 옵션 추가 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@547 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M configure.ac M src/handler.c commit d86a2ce914330b3adbf70df60479598a651d7f13 Author: Choe Hwanjin Date: 2006-12-22 21:42:35 +0900 configure.in -> configure.ac git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@546 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 A configure.ac D configure.in commit 3c92f88324a8e9a240f64c8def1e5cc7b2a63274 Author: Choe Hwanjin Date: 2006-12-18 23:22:03 +0900 Keyboard layout 관련 코드 추가, 유럽어 레이아웃을 일반적인 qwerty 자판으로 변환하기 위한 데이터 관리 코드 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@545 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/automata.c M src/server.c M src/server.h commit fc679ef4b340f255c43a0a00c8cebdff70b3bbe2 Author: Choe Hwanjin Date: 2006-11-20 17:23:21 +0900 update German translation (Thanks to Niklaus Giger) git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@544 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M po/de.po commit 8086a6cc3d8b939a34ed6a4c34a8cb02c1e56c24 Author: Choe Hwanjin Date: 2006-11-19 22:45:18 +0900 update README file for foreigner. git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@543 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M README commit 17e3ae23ba4983fb548b0934c3e083519f04c833 Author: Choe Hwanjin Date: 2006-11-19 21:59:15 +0900 한글 자판 이름을 영어로 바꾸고 gettext를 이용하여 번역함 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@542 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M po/de.po M po/ko.po M src/preference.c M src/server.c M src/ui.c M tables/keyboard/2qwerty M tables/keyboard/32qwerty M tables/keyboard/39qwerty M tables/keyboard/3fqwerty M tables/keyboard/3sqwerty M tables/keyboard/3yqwerty commit 28d2b26b1081291de7ed7a5030caba688d64eaf2 Author: Choe Hwanjin Date: 2006-11-19 20:18:23 +0900 add German translation (Thanks to Niklaus Giger) git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@541 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M configure.in A po/de.po commit 4f9285e3caf490ab3e2a35b350ee94846fe07c78 Author: Choe Hwanjin Date: 2006-05-30 18:39:22 +0900 Jini 테마 추가 (from http://kldp.net/projects/jini/ ) git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@540 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M configure.in A themes/Jini/Makefile.am A themes/Jini/README A themes/Jini/english.png A themes/Jini/english.svg A themes/Jini/hangul.png A themes/Jini/hangul.svg A themes/Jini/none.png A themes/Jini/none.svg M themes/Makefile.am D themes/jini/README D themes/jini/english.png D themes/jini/english.svg D themes/jini/hangul.png D themes/jini/hangul.svg D themes/jini/none.png D themes/jini/none.svg commit 25c3240da6fa958bf013e62fb7ae3ac61cbfb763 Author: Choe Hwanjin Date: 2006-05-30 17:32:44 +0900 jini 테마 추가 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@539 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 A themes/jini/README A themes/jini/english.png A themes/jini/english.svg A themes/jini/hangul.png A themes/jini/hangul.svg A themes/jini/none.png A themes/jini/none.svg commit 58cfa6976449469ec9ae64f01a28611d2efb8d33 Author: Choe Hwanjin Date: 2006-05-12 00:01:02 +0900 eol-style property 제거 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@538 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M nabi-about.png commit 04106f61b0baa9cdf5978de6107d405adc806840 Author: Choe Hwanjin Date: 2006-05-12 00:00:10 +0900 nabi.svg로 부터 새로 아이콘 이미지 생성 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@537 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M nabi.png commit f49a117c7c3dea9bbeaee61e6995db9028c3895f Author: Choe Hwanjin Date: 2006-05-11 23:57:53 +0900 깨진 이미지 제거 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@536 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M nabi.png commit ae6c9dafb1c2d0b74057587a0d000d941399facf Author: Choe Hwanjin Date: 2006-05-11 23:49:25 +0900 nabi.svg 파일으로 로딩실패할 경우 nabi.png를 사용하도록 개선 png 이미지에 mimetype 설정 (현재 파일이 깨진 상태임) git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@535 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog M src/ui.c commit 28be18a9307edecc1601a2c7400f45844d86f349 Author: Choe Hwanjin Date: 2006-04-26 00:25:17 +0900 단축기 로딩 루틴에서 오타 수정 Ctrl->Control git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@534 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/server.c commit 5ebd39174663e5fc074c013e12953e7bed1e53bd Author: Choe Hwanjin Date: 2006-04-23 23:56:28 +0900 XLookupString 대신 XLookupKeysym으로 대체, 유럽어 자판 문제 해결 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@533 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/automata.c M src/handler.c commit 97572a2349fa80228e1a2364c20c6c24a55db18f Author: Choe Hwanjin Date: 2006-04-23 22:47:04 +0900 자판 입력창 통계 수치 출력 루틴을 GString을 이용해서 개선 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@532 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog M src/ui.c commit 361d7f61008460383c91d3a74998bbaee545f4b8 Author: Choe Hwanjin Date: 2005-09-06 11:06:53 +0900 cvs에서 svn으로 이사한후, 이미지 파일들의 prop이 잘못 설정되어 있어서 이미지 파일이 손상되었음. 이문제를 바로 잡음. git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@531 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M themes/KingSejong/english.png M themes/KingSejong/hangul.png M themes/KingSejong/none.png M themes/MSWindows/english.png M themes/MSWindows/hangul.png M themes/MSWindows/none.png M themes/MSWindowsXP/english.png M themes/MSWindowsXP/hangul.png M themes/MSWindowsXP/none.png M themes/Mac/english.png M themes/Mac/hangul.png M themes/Mac/none.png M themes/Onion/english.png M themes/Onion/hangul.png M themes/Onion/none.png M themes/SimplyRed/english.png M themes/SimplyRed/hangul.png M themes/SimplyRed/none.png M themes/keyboard/english.png M themes/keyboard/hangul.png M themes/keyboard/none.png commit 2eb28db7859a9991b38b958dbcf257cbab82cf75 Author: Choe Hwanjin Date: 2005-07-20 22:46:22 +0900 remove unneeded new line git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@530 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M test/xlib.cpp commit 815f47b00573690196f715af794e2e0bb689366d Author: Choe Hwanjin Date: 2005-07-20 22:35:24 +0900 modifier 키가 눌렸을 경우는 insert 하지 않는다 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@529 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M test/xlib.cpp commit 16888a0ba61415992d95e30fa752221fb53a9386 Author: Choe Hwanjin Date: 2005-07-17 01:22:52 +0900 source tarball에 test 디렉토리도 추가함 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@528 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M Makefile.am commit 07c6d522280d0078cc4cf03afbef79a104178fb3 Author: Choe Hwanjin Date: 2005-07-17 01:17:20 +0900 여러가지 toolkit에서 테스트하기 위한 코드가 들어 있는 test 디렉토리 추가 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@527 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog A test/Makefile A test/gtk.c A test/gtk1.c A test/qt.cpp A test/xlib.cpp commit 41198e04f71c88f0b0207788974579e6b8b55927 Author: Choe Hwanjin Date: 2005-07-10 11:50:08 +0900 * cvs2svn으로부터 생성된 svn repo의 디렉토리를 프로젝트에 맞게 다시 정리함 git-svn-id: http://kldp.net/svn/nabi/nabi/trunk@526 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 commit ebeed946b9f41b2de1dd54071f010f5e64f93230 Author: Choe Hwanjin Date: 2005-01-17 17:50:24 +0900 gcc 4.0에서 발생하는 error/warning 제거 (from SungHyun Nam) git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@524 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/candidate.c M src/ic.c M src/server.c commit 4e5e21ea2bfa798c1230d582fe5724fd4cb1b987 Author: Choe Hwanjin Date: 2005-01-13 22:56:09 +0900 nabi_ic_preedit_show()에서 nabi_ic_preedit_configure를 부름 (PreeditArea 방식에서 preedit window의 위치를 제대로 잡게됨) git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@523 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog M src/handler.c M src/ic.c commit dde1d4759df27b6dd7fb7cf4c15ec3400cd079ec Author: Choe Hwanjin Date: 2005-01-08 10:42:49 +0900 * reset할때 preedit window 숨김 * gtk1 text widget에서 preedit string이 안나오던 문제 수정: over the spot(PreeditPostion) 방식에서 foreground, background값을 client가 보내주는 값대신 nabi의 설정값을 따름 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@522 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog M src/ic.c commit 0fcabd2b71b7832c821faf93cf691ac0483917f1 Author: Choe Hwanjin Date: 2004-12-05 00:29:47 +0900 Update document git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@518 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M NEWS commit da407f8d18f22100121a4c4ab463461f4a57cc7a Author: Choe Hwanjin Date: 2004-12-05 00:20:55 +0900 Release 0.15 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@517 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog commit b285581f141ac323feae5035f96b773285402aa1 Author: Choe Hwanjin Date: 2004-12-05 00:15:16 +0900 Align the key text to center git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@516 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/keycapturedialog.c commit 3a2cd0798597d20356b3c2a0106ef4a2185df265 Author: Choe Hwanjin Date: 2004-12-04 20:58:17 +0900 Update about window (thanks to bluetux) git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@515 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog M Makefile.am M po/ko.po M src/ui.c commit 8f2c4e51950d9a2a0d07a76608d015cf161934e8 Author: Choe Hwanjin Date: 2004-12-04 17:26:18 +0900 apply new nabi about image git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@514 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 A nabi-about.png M src/ui.c commit df62147172e29aa524e7a07e46c4cde28de6097a Author: Choe Hwanjin Date: 2004-12-03 23:36:24 +0900 nabi icon update(nabi.png->nabi.svg) git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@513 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog M Makefile.am A nabi.svg M src/ui.c commit 919941ae491195a954fcd0e9c78d1f177e4c2fec Author: Choe Hwanjin Date: 2004-12-02 23:15:35 +0900 * nabi_server_write_log() 구현: 자모 빈도를 $HOME/.nabi/nabi.log에 기록 * Statistics에서 XK_space도 기록함 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@508 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog M po/ko.po M src/main.c M src/server.c M src/server.h M src/ui.c commit 5dfc988d1dffe47d67f8b86c31a6781909fc582d Author: Choe Hwanjin Date: 2004-11-30 21:48:24 +0900 번역 업데이트 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@506 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog M po/ko.po commit e9afe94b19e0ade5abfa228cdf12d4603cb0a8dd Author: Choe Hwanjin Date: 2004-11-27 18:29:36 +0900 gtk_tree_model_get에서 있던 memory leak 수정 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@505 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/preference.c commit 8a0bd13fa0216dac50bb08125b2d5d5481770f25 Author: Choe Hwanjin Date: 2004-11-27 18:27:55 +0900 ic_table 메모리 할당 에러 수정, 개수를 512로 줄임 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@504 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/server.c commit bebaff526795a4fc4cb33c61350583ab47e64536 Author: Choe Hwanjin Date: 2004-11-27 16:17:13 +0900 종료할때 about, preference 창을 닫도록 함 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@503 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ui.c commit 451fae663ebf06452f013a3d8dada313429e715b Author: Choe Hwanjin Date: 2004-11-26 23:48:54 +0900 * 설정창에서 한글/한자로 탭을 나눔 * about창에서 더이상 gtk_dialog_run()을 사용하지 않음 * about창 copyright 문구 수정 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@502 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/preference.c M src/ui.c commit 63eba5f7db5675d497c090e30c585643a38a8335 Author: Choe Hwanjin Date: 2004-11-25 22:46:06 +0900 0.15 준비 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@501 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M configure.in commit 233d31173208d86da541807c7b7379892f889e05 Author: Choe Hwanjin Date: 2004-11-21 20:23:20 +0900 * 순아래 자판 추가 * 옛글 compose table을 Makefile.am에 추가 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@498 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog M tables/Makefile.am A tables/keyboard/3sqwerty commit b60305a1ffe92bb7850a0bea3c06746602f18e6a Author: Choe Hwanjin Date: 2004-11-21 20:12:08 +0900 * FocusIn 이벤트에서 grab함 * 마우스가 창을 벗어나서 클릭하면 창을 닫음 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@497 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/keycapturedialog.c commit 7824dd38dcaa9d65094e2b5ab5556c856bd215cd Author: Choe Hwanjin Date: 2004-11-21 15:57:53 +0900 * 한영,한자키를 사용자가 직접 선택할수 있도록 함 * key_capture_dialog_new, key_capture_dialog_get_key_text 함수를 구현함 * nabi_server_set_trigger_keys()와 nabi_server_set_candidate_keys()의 인자를 int에서 char**로 바꿈 * 메뉴에서 종료를 선택하면 session에서 자동 재실행 옵션을 꺼서 바로 종료함 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@496 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog M po/ko.po M src/Makefile.am A src/keycapturedialog.c A src/keycapturedialog.h M src/nabi.h M src/preference.c M src/server.c M src/server.h M src/session.c M src/ui.c commit f09ff24b0d3a1240fece2505f6ef6b25d4946d15 Author: Choe Hwanjin Date: 2004-11-09 21:25:02 +0900 * tray icon size 설정 옵션 제거 * size-allocate 시그널에서 아이콘 크기를 자동 조정 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@495 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog M src/nabi.h M src/preference.c M src/ui.c commit 1ae4c23ba5963e7afddbca8ce0522aa8c982843f Author: Choe Hwanjin Date: 2004-11-09 20:47:42 +0900 Qt immodule의 XIM에서 preedit window 위치를 잘못 찾던 버그 수정 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@494 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog M src/ic.c commit 50da0966bf76552099ac71c58e3292a1520d311f Author: Choe Hwanjin Date: 2004-11-06 00:34:00 +0900 태나무 리 -> 배나무 리 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@492 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi-hanja.txt commit d90a286e5959b66df333dd6dcebb2c4a44040b03 Author: Choe Hwanjin Date: 2004-11-03 23:33:51 +0900 숲 박 -> 엷을 박 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@491 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi-hanja.txt commit 4efd42ad51a629ede610428c2764dcf6475d5d77 Author: Choe Hwanjin Date: 2004-10-23 21:55:48 +0900 키 입력 통계를 다른 창으로 띄우게 함 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@490 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ui.c commit 25395536be3c5328f8f0afce39661d3f246e2807 Author: Choe Hwanjin Date: 2004-10-23 21:10:44 +0900 * output_mode를 자판 별로 설정 가능하도록 함 * compose_table을 자판별로 가지고 있는 데이터로 수정함. 자판에서 compose_table 포인터를 가지고 있지 않으면 server의 기본값을 사용하고 compose_table을 가지고 있다면 keyboard_table이 가지고 있는 compose_table을 한글 자모 compose시에 사용하도록 함 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@489 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/automata.c M src/ic.c M src/keyboard.h M src/server.c M src/server.h M tables/keyboard/3yqwerty commit 4aa9bf52fee8a13ab4dba9f32065ba90a04f6281 Author: Choe Hwanjin Date: 2004-10-23 20:14:43 +0900 server.c: locale string을 하드코딩하지 않고 UTF-8 인코딩인지만 확인한다 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@488 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/server.c commit 12e796b175e12f8258ddc2846e22383ec1da1c4d Author: Choe Hwanjin Date: 2004-10-05 22:31:09 +0900 세벌식 옛글 자판 추가 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@487 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog M src/keyboard.h M src/server.c M src/server.h M src/ui.c A tables/keyboard/3yqwerty commit 2d982a9a3d20425803af1bbb7653e96db6252166 Author: Choe Hwanjin Date: 2004-10-05 21:30:49 +0900 full compose table 추가함 (옛글 입력할때 필요한 compose map) git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@486 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog A tables/compose/full commit 304f7acc7015f56930a2061118255274f7b2bed5 Author: Choe Hwanjin Date: 2004-10-04 14:17:25 +0900 ui.c: compose table을 제대로 로딩하지 못하던 문제를 수정 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@485 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog M src/ui.c commit 402649ce7ea5c59a6b62fe062762a033d122930b Author: Choe Hwanjin Date: 2004-08-30 12:08:03 +0900 Tux 테마 추가 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@475 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog commit 83defe47bf79f691533cdb03001abd7bbd4b05cb Author: Choe Hwanjin Date: 2004-08-30 12:06:56 +0900 Tux 테마 README 추가 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@474 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 A themes/Tux/README commit 47eceea90610cbe7ef6fafa3b5a6eaa0a8233d02 Author: Choe Hwanjin Date: 2004-08-30 10:44:39 +0900 Tux 테마 추가 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@473 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M configure.in M themes/Makefile.am A themes/Tux/Makefile.am A themes/Tux/english.png A themes/Tux/hangul.png A themes/Tux/none.png commit 90c850407f3bc71ea671000b9ebb124c038cf720 Author: Choe Hwanjin Date: 2004-08-28 23:03:42 +0900 release 0.14 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@472 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog commit c97b44ebda88600ff9d112a43e3f32d9998b4ad4 Author: Choe Hwanjin Date: 2004-08-28 21:40:28 +0900 문서 업데이트 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@470 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M NEWS M TODO M po/ko.po commit 3aa84b04ff9936186ff0a235a78036fad23f4048 Author: Choe Hwanjin Date: 2004-08-28 20:46:36 +0900 * preference.c: "테마"에서 "트레이"로 페이지 이름을 변경 * ui.c: nabi_app_set_candidate_font에서 config를 저장 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@469 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/preference.c M src/ui.c commit 916ddb2ea648b27848b8909bac29ecc005904e35 Author: Choe Hwanjin Date: 2004-08-28 20:25:12 +0900 * candidate list의 갯수를 9개로 변경 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@468 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog M src/candidate.c M src/default-icons.h M src/handler.c M src/ic.c M src/ui.c commit 700394d291a106500f71b7f2bd3d3717b7975b20 Author: Choe Hwanjin Date: 2004-08-28 16:53:59 +0900 * candidate list의 글꼴 설정 옵션도 설정창에 추가 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@467 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog M po/ko.po M src/nabi.h M src/preference.c M src/ui.c commit d99ba82a4131bd57192e74d9f1a31c6373acf812 Author: Choe Hwanjin Date: 2004-08-28 15:30:55 +0900 * ko이외에 ja_JP.UTF-8, zh_CN.UTF-8, zh_HK.UTF-8, zh_TW.UTF-8, en_US.UTF-8을 지원하도록 함 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@466 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog M src/server.c M src/server.h M src/ui.c commit 63eaac35f83ed8b871f7b7773772ae0d94420754 Author: Choe Hwanjin Date: 2004-08-19 14:22:17 +0900 hanja-to-c.py: 주석도 추가 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@465 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/hanja-to-c.py commit 046e45f15445dacfc402abec063d33e4a2254996 Author: Choe Hwanjin Date: 2004-08-18 23:15:34 +0900 hanja-to-c.py: 키 리스트를 출력할때 소팅해서 순서가 바뀌는 문제를 바로 잡음 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@464 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/hanja-to-c.py commit 9b6cce318c0c62c9a5e15990ff6484ece2468e35 Author: Choe Hwanjin Date: 2004-08-18 16:18:19 +0900 hanja-to-c.py 스크립트 추가 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@463 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/ChangeLog A tables/candidate/hanja-to-c.py commit 35871cd11a7a2bd799347b5e3055f3b8c02b43b8 Author: Choe Hwanjin Date: 2004-08-03 19:04:04 +0900 ���ڵ�׸���丮�� define�����ü git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@462 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/preference.c commit 1ad1145fa36f0ca015da68ed31a2e32015e7aa18 Author: Choe Hwanjin Date: 2004-08-01 11:33:16 +0900 XIMPreeditArea 지원 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@461 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog M src/ic.c commit 586419e2d25c1c37f291c53b750747636075a4ee Author: Choe Hwanjin Date: 2004-07-31 23:03:26 +0900 NabiIC와 NabiServer에서 사용하던 Window, GC들을 GdkWindow, GdkGC로 변경함 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@460 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog M src/ic.c M src/ic.h M src/main.c M src/server.c M src/server.h M src/ui.c commit d9db007da2069e352be5bca3a1ff8d0a33852152 Author: Choe Hwanjin Date: 2004-07-31 19:10:08 +0900 * 0.14 준비 * 설정창 설명문 추가 * 한자키를 모두다 끌 수 있도록 함 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@459 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M configure.in M po/ko.po M src/preference.c M src/server.c commit b2aff87675bcbf286e49ea1992d5d6d2f625fe41 Author: Choe Hwanjin Date: 2004-07-31 13:45:33 +0900 java 어플리케이션에서 필요로 하는 XNPreeditState 정보를 제공 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@458 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ic.c commit 5f595bf138f0c883a238c70b80fb09c375036f40 Author: Choe Hwanjin Date: 2004-07-27 22:07:47 +0900 키보드->자판 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@457 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M po/ko.po commit d55bd7fb47754ccb56556759abe4d2c497948b6a Author: Choe Hwanjin Date: 2004-07-27 22:06:33 +0900 설정창/자판 부분을 한글 자판/영문 자판 카테고리로 나눔 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@456 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M po/ko.po M src/preference.c commit c85fb374a49131574a555cb837917fa89ccdfbe9 Author: Choe Hwanjin Date: 2004-07-27 21:11:08 +0900 * 한국어 로캘이 아닐때 워닝 메시지를 한국어로 수정 * gtk_message_dialog_new_with_markup() 사용하지 않음 (2.4 API) git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@455 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ui.c commit 6ce06be11c65632280919f89a830f70246f05923 Author: Choe Hwanjin Date: 2004-07-26 22:36:15 +0900 preference 창에서 icon size widget을 GtkComboBox에서 GtkSpinButton으로 바꿈 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@454 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/preference.c M src/ui.c commit 386aa1a0f2eefeefad952479041d992877c4af34 Author: Choe Hwanjin Date: 2004-07-25 23:40:10 +0900 * ko locale이 아닌경우 워닝 표시 * 디폴트 아이콘 설정 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@453 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ui.c commit c64297f89ada34c422f46707f97c3a28e270bdb8 Author: Choe Hwanjin Date: 2004-07-25 22:25:11 +0900 * fontset 로딩에서 실패하더라도 한번더 로딩하도록 수정 * copyright 문구 수정 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@452 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/automata.c M src/candidate.c M src/candidate.h M src/fontset.c M src/fontset.h M src/handler.c M src/hangul.c M src/hangul.h M src/ic.c M src/ic.h M src/main.c M src/nabi.h M src/preference.c M src/server.c M src/server.h M src/session.c M src/session.h M src/ui.c commit d7d304760360b06582d783246d3f9e48d681f4f8 Author: Choe Hwanjin Date: 2004-07-25 19:40:52 +0900 설정창 구현 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@451 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog M TODO M po/POTFILES.in M po/ko.po M src/Makefile.am M src/ic.c M src/nabi.h A src/preference.c M src/server.c M src/server.h M src/ui.c commit 54b415c6d0c231cd27b75f33c014408655e9be68 Author: Choe Hwanjin Date: 2004-07-21 22:39:28 +0900 * candidate window에서 mouse를 grab하도록 하고, keypress, scroll event를 처리하게 함 * tray icon이 embed되었을때 리사이징 하던 루틴을 제거 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@450 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/candidate.c M src/handler.c M src/ui.c commit e4e58d9f68bfb2e48774c5a8f619cf1b8cfdd894 Author: Choe Hwanjin Date: 2004-06-26 22:12:13 +0900 shift key event가 오면 forwarding 함(전에는 무시했음) 이것으로 wine 문제를 해결할수 있는 것 같음 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@449 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/handler.c M src/ic.c commit d4b98b9f64023a961b0554fa67251d7349df1210 Author: Choe Hwanjin Date: 2004-06-23 22:42:09 +0900 nabi_ic_commit_unicode() 함수에서 처리되지 않은 키는 모두 forwarding하도록 수정 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@448 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog M po/ko.po M src/ic.c commit 62f6b623a3d51bf00222d880c9785d6da3db2d5d Author: Choe Hwanjin Date: 2004-06-08 21:12:35 +0900 클 대 -> 큰 대 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@447 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi-hanja.txt commit 64e21b2264c9a9f850c4e348d3ae3e9ea39b11de Author: Choe Hwanjin Date: 2004-06-05 14:47:17 +0900 * keyboard table과 compose table을 위한 함수 nabi_server_load_keyboard_table() nabi_server_load_compose_table()을 구현함. 더이상 ui.c에서 키보드와 컴포우즈 테이블을 관리하지 않음. * keyboard_map, compose_map에서 keyboard_table, compose_table로 이름을 바꿈 * compose table 포맷을 변경 name 부분을 []로 구분함 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@446 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog M configure.in M src/automata.c M src/keyboard.h M src/nabi.h M src/server.c M src/server.h M src/ui.c M tables/compose/default commit 082036e520f8810dd0b9707617553bc2c4d45fe0 Author: Chloe Date: 2004-05-26 03:24:54 +0900 hanja-sanity.pl 가 두음을 살펴보도록 수정했습니다. git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@445 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/ChangeLog commit 7344179ab4b36a182c42205b35c09f64079fdf1b Author: Chloe Date: 2004-05-26 03:17:15 +0900 두음법칙을 고려하도록 수정합니다. git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@444 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/hanja-sanity.pl commit 80083759f1f6e659bc39d94b105a0ec117bea3e9 Author: Chloe Date: 2004-05-26 01:01:01 +0900 原音 등의 표시가 kKorean 과 일치하는 글자를 추가하였습니다. git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@443 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi-hanja.txt commit f4b176cb05284f6507db742724ef78e36067f411 Author: Chloe Date: 2004-05-21 16:07:09 +0900 nabi-hanja.txt 를 Unihan-4.0.1.txt 에 맞도록 이전하였습니다. git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@442 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/ChangeLog commit 1001f78ba2bb649af06fddcbb9f8b90a4fa5a70d Author: Chloe Date: 2004-05-21 16:03:48 +0900 variant 정보가 있는 글자에 대해 同字 처리하였습니다. git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@441 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi-hanja.txt commit 11482dfcad2d3ceafdfb52c6af641a4aa9985561 Author: Chloe Date: 2004-05-20 17:46:25 +0900 Unihan-4.0.1.txt 로 이전하고 전체 검토를 마쳤습니다. git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@440 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi-hanja.txt commit 32b8669e5d246d33f5dc2f19b8826660a9ffb487 Author: Choe Hwanjin Date: 2004-05-16 22:15:19 +0900 몇가지 함수 관련 테스트 추가 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@439 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M configure.in commit a37c017c5ec9f3d8d50f8329f734a38a2267835d Author: Choe Hwanjin Date: 2004-05-16 21:08:16 +0900 특수 문자표 재배치 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@438 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/ChangeLog M tables/candidate/nabi-symbol.txt M tables/candidate/nabi.txt commit 5e8136cb8a80f991a87fdd5b5bf165c947f251c4 Author: Choe Hwanjin Date: 2004-05-16 14:14:17 +0900 nabi_server_is_candidate_key() 함수 추가(한자 입력 키 체크 함수) git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@437 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/handler.c M src/server.c M src/server.h commit 26b352dbda5294e423b6ad3a3f6df638e6adb97e Author: Choe Hwanjin Date: 2004-05-11 19:00:54 +0900 중복된 backspace 처리 코드 통합 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@436 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/automata.c commit 0a0dbdcaa26af8c1002f91ffa96e7179da5a7d9d Author: Choe Hwanjin Date: 2004-05-11 18:13:07 +0900 알고 보니 cvs 태그가 작동안함(cvs ci 로그를 메일로 보내는 스크립트에서 기본적으로 안쓰도록 되어 있음) git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@435 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/hanja-gettext.py M tables/candidate/hanja-merge.py commit 5df82d7b928716c16d3a1a38340444c54b068e34 Author: Choe Hwanjin Date: 2004-05-11 17:51:45 +0900 cvs keyword 오타 수정 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@434 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/hanja-gettext.py M tables/candidate/hanja-merge.py commit 02d9464975798fb8bb8d4b2e5914e3424ecd3cf2 Author: Choe Hwanjin Date: 2004-05-11 17:50:41 +0900 cvs keyword 추가 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@433 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/hanja-gettext.py M tables/candidate/hanja-merge.py commit 4e3bc4127af7eea34e409062e006d096f702e466 Author: Chloe Date: 2004-05-11 03:08:06 +0900 Unihan-3.2.0.txt 에 대한 검토분입니다. - 발음이 모호한 글자는 반영하지 않았습니다. - 자전에 없는 유사자(동자, 속자, 간체자 등)는 반영하지 않았습니다. git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@432 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi-hanja.txt commit 23c9bac18d7d87cb87321012861a18f5b940bbe6 Author: Chloe Date: 2004-05-08 16:59:28 +0900 鞫 U+97AB 까지의 검토문을 반영합니다. git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@431 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi-hanja.txt commit 8c76db83ab06d56f65b79adb6317321971fea79b Author: Choe Hwanjin Date: 2004-05-07 14:34:28 +0900 Unihan.txt 데이터베이스 파일에서 한자를 추출하는 hanja-gettext.py 추가 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@430 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/ChangeLog A tables/candidate/hanja-gettext.py commit efbfc5e8d32ba07666f0833d9fbd228a7f532ef9 Author: Choe Hwanjin Date: 2004-05-07 10:56:09 +0900 한자 테이블만을 위한 ChangeLog 파일 생성 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@429 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 A tables/candidate/ChangeLog commit f80a4c64e6a5d0f5a73e2c63fdbb461c9c4b7902 Author: Choe Hwanjin Date: 2004-05-07 10:54:12 +0900 한자 번역 결과물을 새 한자 템플릿 파일과 머지하는 도구를 만듦 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@428 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 A tables/candidate/hanja-merge.py commit 1e2f2268c80b524c04a44ffe1f89e8d465158eea Author: Chloe Date: 2004-05-04 12:43:51 +0900 this script will check chinese variants in Unihan.txt git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@427 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 A tables/candidate/hanja-variants.pl commit f60ee78f7c63d274dba9a18eaa04bda2b56553a8 Author: Choe Hwanjin Date: 2004-05-03 16:09:38 +0900 * feedback을 만들어주는 함수 추가 * commit 할때도 charset 변환 체크함 * 3벌식 오토마타에서 UTF-8에서는 모아치기 기능 지원하도록 수정 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@426 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/automata.c M src/ic.c commit f0b2d0d467749e37788457860c68afce42b0faf8 Author: Choe Hwanjin Date: 2004-04-29 22:50:36 +0900 * 사용하지 않는 IMGetIMValues()함수 호출 부분을 제거 * charset 체크하는 곳에서 잘못된 비교를 하던 부분을 제거하고 그냥 출력 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@425 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/server.c commit 8da73ddf0cf4f66c5c204416cb39d45b5375f1d6 Author: Choe Hwanjin Date: 2004-04-29 14:57:52 +0900 마우스 왼쪽/오른쪽 버튼에 모두 메뉴가 나오게함, 가운데 버튼으로 메인 윈도우를 보이게 하거나 숨기는 데 사용함 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@424 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ui.c commit 9482d54b1ff3cf31ee2662fd75c5e2beb952f290 Author: Choe Hwanjin Date: 2004-04-27 21:42:09 +0900 상태창을 안보이게 기본값 수정 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@423 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/server.c commit 2141e20927650e6fe3e709dd9c2d43a50092fbc1 Author: Choe Hwanjin Date: 2004-04-23 18:34:20 +0900 2004-04-23 Choe Hwanjin * src/handler.c src/ic.c src/ic.h src/server.c src/server.h: status window 콜백 함수를 구현함 * src/server.c: 한영 전환키로 오른쪽 Alt를 추가 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@422 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog M src/handler.c M src/ic.c M src/ic.h M src/server.c M src/server.h commit 52af3a979487d85a1f3d4c7e382437b70ee7f88a Author: Choe Hwanjin Date: 2004-04-19 12:25:18 +0900 2004-04-19 Choe Hwanjin * src/server.c: charset 체크하면서 ko로 시작하지 않으면 워닝을 출력하도록 함 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@421 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog M src/server.c commit 2fb386c76d77d5bb3e9cdf20c7f3e9956bb460d6 Author: Choe Hwanjin Date: 2004-03-15 21:48:23 +0900 문서 업데이트 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@419 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog M NEWS M TODO commit a9bd10032b7a01efeb8115a224f27f2180eb8ed2 Author: Choe Hwanjin Date: 2004-03-15 21:42:16 +0900 po 파일 날짜 업데이트 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@418 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M po/ko.po commit abfb1f07e8e91a0c220cf8a0303cba44028eb2ee Author: Choe Hwanjin Date: 2004-03-15 21:41:52 +0900 autoconf 2.57에 맞게 AC_INIT 매크로의 인자 수정 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@417 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M configure.in commit 69701212fcab12f3fa95a9f3fe8d176bfcbc9b3e Author: Choe Hwanjin Date: 2004-03-15 21:00:10 +0900 한자 최종 수정본 적용 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@416 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi.txt commit 84604d0fad64a8ef0ad680e98f9b269faacc6e7d Author: Choe Hwanjin Date: 2004-03-08 21:22:23 +0900 한자 설명 파일의 잘못된 부분을 지적해주는 스크립트 추가 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@415 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 A tables/candidate/hanja-sanity.pl commit f9672bf0ed4855b06e3756e19348132a933323cb Author: Choe Hwanjin Date: 2004-03-08 20:59:18 +0900 여러가지 오타, 잘못된 곳 수정 (thanks to ai) git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@414 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi-hanja.txt commit 00954b9c6d06e782d37aed5c7499fcf5302ecb1c Author: Choe Hwanjin Date: 2004-03-07 21:46:03 +0900 2004-03-07 Choe Hwanjin * src/ui.c: about 창 모양 개선 * po/ko.po: 번역 업데이트 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@413 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog M po/ko.po M src/ui.c commit a8bd90290d1b46fe9a24820c270cf5c689e51b58 Author: Choe Hwanjin Date: 2004-03-05 23:31:35 +0900 2004-03-05 Choe Hwanjin * src/nabi.h src/main.c src/server.h src/server.c src/ui.c: xim_name이라는 컨피그 옵션과 --xim-name 이라는 커맨드 라인 옵션을 추가함. 이것을 지정하면 XMODIFIER값을 다른 것을 사용할 수 있음 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@412 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog M src/main.c M src/nabi.h M src/server.c M src/server.h M src/ui.c commit 49a155f5a4a9fb35f97a4a760c8c66c0c64147d8 Author: Choe Hwanjin Date: 2004-03-05 21:08:31 +0900 형-히 수정 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@411 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi-hanja.txt commit fd43f0e23f5ccc9007949d7d2ec1af94c706afce Author: Choe Hwanjin Date: 2004-03-05 21:06:21 +0900 찬-체 수정 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@410 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi-hanja.txt commit 5bff335cc6f966823855324e43c4b4a6b4253efa Author: Choe Hwanjin Date: 2004-03-03 22:00:51 +0900 자-직 주석 추가 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@409 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi-hanja.txt commit d207b660d49d3eb20c91e94b78864ca8a5e6fea3 Author: Choe Hwanjin Date: 2004-03-03 22:00:15 +0900 아-임 주석 추가 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@408 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi-hanja.txt commit 10e4873c5de03fe4224f1adb74881528ce38d53b Author: Choe Hwanjin Date: 2004-03-02 22:12:35 +0900 Chloe Lewis님의 오타 수정 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@407 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi-hanja.txt commit 8d84bf093520eaef6854651ec822941e34c734a1 Author: Choe Hwanjin Date: 2004-03-02 21:44:21 +0900 Chloe Lewis님의 '사'부분 수정입니다. git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@406 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi-hanja.txt commit fa0793bcb0c7ed80e13588480931a594454b4ea5 Author: Choe Hwanjin Date: 2004-03-02 21:43:19 +0900 김선달님의 수정 작업 머지 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@405 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi-hanja.txt commit 6b3857bcdc48ce78f2db0c228e1f93e57e463f7e Author: Choe Hwanjin Date: 2004-03-01 09:47:24 +0900 2004-03-01 Choe Hwanjin * src/ui.c: GtkTextView를 사용하게 되면 GtkIMContext를 생성하게 되어 XIM 서버가 멈추는 위험한 상황이 자주 발생하므로 About 창에서 GtkTextView대신 GtkLabel를 사용하도록 수정함 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@404 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog M src/ui.c commit 0f59556069f9754d9bef7ce0d66e74993fc80d70 Author: Choe Hwanjin Date: 2004-02-29 19:47:56 +0900 2004-02-29 Choe Hwanjin * IMdkit/i18nIc.c IMdkit/i18nMethod.c IMdkit/i18nPtHdr.c: 바이트 오더 문제를 해결하기 위한 수정 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@403 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog M IMdkit/i18nIc.c M IMdkit/i18nMethod.c M IMdkit/i18nPtHdr.c commit 00d086c6b3e291c377ab6852303efe8ebaa7f7bd Author: Choe Hwanjin Date: 2004-02-29 19:47:19 +0900 * 잘못된 에러 메세지 수정 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@402 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ui.c commit b6586fbd5b813ad8afbb7845c42017bdb690fb84 Author: Choe Hwanjin Date: 2004-02-29 11:09:35 +0900 초벌 작업된 한자 사전을 merge git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@401 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi.txt commit 0012d6ef6789ee16cf9d5ca6bea2cbf2ea6a1b9a Author: Choe Hwanjin Date: 2004-02-23 20:51:46 +0900 오타 수정 (광->굉) git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@400 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi-hanja.txt commit c2b47a334b760b6fe3aa6f1fae52e364ddd0960b Author: Choe Hwanjin Date: 2004-02-22 22:34:09 +0900 마 영역의 에러 수정 (ai) git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@399 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi-hanja.txt commit c93df8b26f6aeb3c5e94a0395f544872736bbd47 Author: Choe Hwanjin Date: 2004-02-22 22:33:47 +0900 바 영역의 에러 수정 (ai) git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@398 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi-hanja.txt commit 94aa83cfb5b737cc556281a313f356d2ea939648 Author: Choe Hwanjin Date: 2004-02-20 16:16:39 +0900 typo 적용 - ai git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@397 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi-hanja.txt commit b12d96785b0e08775de3b0ebea02202e2d74dfec Author: Choe Hwanjin Date: 2004-02-20 16:15:28 +0900 라 적용 - ai git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@396 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi-hanja.txt commit 35ecea8d83caa2e2fb27f5f715e49d6ce03960c8 Author: Choe Hwanjin Date: 2004-02-20 16:14:34 +0900 나 주석 추가 - ai git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@395 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi-hanja.txt commit 89fcbf8e87d5da99dec0ced0a897013a9c90bbef Author: Choe Hwanjin Date: 2004-02-20 16:13:12 +0900 다 수정 - ai git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@394 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi-hanja.txt commit 915c37275dc4d5cb94e98f390fa6502711022908 Author: Choe Hwanjin Date: 2004-02-19 22:32:00 +0900 오류 수정 '가' - ai git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@393 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi-hanja.txt commit 39747498aa1ca80879f411c05ddd231d695238c4 Author: Choe Hwanjin Date: 2004-02-18 16:00:07 +0900 update git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@392 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M po/ChangeLog commit 4519bfaa4a7494e55bc02648c83bd18c15b9fbc4 Author: Choe Hwanjin Date: 2004-02-18 15:52:11 +0900 glib-gettextize 적용 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@391 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M autogen.sh D po/Makefile.in.in commit 917383e7458500e4b003e3daded52919925757f1 Author: Choe Hwanjin Date: 2004-02-18 15:45:41 +0900 GNU gettext에서 glib-gettext로 바꿈, 여러 모로 관리하기 편리한것 같음 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@390 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog M Makefile.am M configure.in D m4/.cvsignore D m4/ChangeLog D m4/Makefile.am D m4/codeset.m4 D m4/gettext.m4 D m4/glibc21.m4 D m4/iconv.m4 D m4/intdiv0.m4 D m4/inttypes-pri.m4 D m4/inttypes.m4 D m4/inttypes_h.m4 D m4/isc-posix.m4 D m4/lcmessage.m4 D m4/lib-ld.m4 D m4/lib-link.m4 D m4/lib-prefix.m4 D m4/nls.m4 D m4/po.m4 D m4/progtest.m4 D m4/stdint_h.m4 D m4/uintmax_t.m4 D m4/ulonglong.m4 D po/LINGUAS M po/Makefile.in.in D po/Makevars M po/POTFILES.in D po/Rules-quot D po/boldquot.sed D po/en@boldquot.header D po/en@quot.header D po/insert-header.sin M po/ko.po D po/quot.sed D po/remove-potcdate.sed D po/remove-potcdate.sin commit fb248c35da92f749e8667334c83b380c9bff0044 Author: Choe Hwanjin Date: 2004-02-17 17:07:28 +0900 78 적용 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@389 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi-hanja.txt commit f43f8ac3c0422b9e8d0a0be7ab18b13f7df71d7e Author: Choe Hwanjin Date: 2004-02-17 17:07:01 +0900 26 적용 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@388 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi-hanja.txt commit b59f505b59fa33e99f80525154f6ed5e51280ac5 Author: Choe Hwanjin Date: 2004-02-16 22:20:25 +0900 candidate 윈도우가 screen을 벗어나서 일부가 가려지던 문제를 해결(#300256) git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@387 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog M src/candidate.c commit 623f75e75469f296038735111c8710b63faa3e05 Author: Choe Hwanjin Date: 2004-02-16 11:59:10 +0900 기호 순서 조정 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@386 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi-symbol.txt commit bd87b43b69a1fb34bba233cf01277885e91d7788 Author: Choe Hwanjin Date: 2004-02-16 07:50:59 +0900 04 적용 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@385 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi-hanja.txt commit ba55173898b60bd2cd8be06850bbd233f27d943c Author: Choe Hwanjin Date: 2004-02-16 07:49:38 +0900 03 적용 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@384 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi-hanja.txt commit 8b41f3e192201f6db65f0076a577082d6b860e04 Author: Choe Hwanjin Date: 2004-02-16 07:48:57 +0900 02 적용 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@383 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi-hanja.txt commit 92c0f19e17c0a7ce8913e6549136a4a26b3dbe75 Author: Choe Hwanjin Date: 2004-02-14 11:35:53 +0900 57 적용 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@382 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi-hanja.txt commit 3ec8c39150ed6e3d0dd48b8ea1c897910c7601aa Author: Choe Hwanjin Date: 2004-02-10 22:31:00 +0900 STR_CONVERSION 메세지 일부 구현 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@381 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M IMdkit/i18nPtHdr.c commit b76749f8da601b0dc41978ce424d15d171310005 Author: Choe Hwanjin Date: 2004-02-10 22:25:56 +0900 -Wall 컴파일 옵션 제거 (#300245) git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@380 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog M IMdkit/Makefile.am M src/Makefile.am commit 78d8f4334c2db93bb5b3c2f4d215699af261b714 Author: Choe Hwanjin Date: 2004-02-09 20:28:03 +0900 66 적용 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@379 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi-hanja.txt commit 7fa2e2f1d56f546f5532c456ef27701801a461da Author: Choe Hwanjin Date: 2004-02-08 17:17:32 +0900 79 적용 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@378 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi-hanja.txt commit 1c0ea1047c615558180a0111bc402f8ab96b2052 Author: Choe Hwanjin Date: 2004-02-08 17:17:00 +0900 68 적용 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@377 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi-hanja.txt commit e7d6843b62c3a0f70dc01e23d1cfad80da3fdb0e Author: Choe Hwanjin Date: 2004-02-08 17:16:41 +0900 59 적용 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@376 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi-hanja.txt commit 31d1f987662f56df74d575a75abcc7086dce8ab0 Author: Choe Hwanjin Date: 2004-02-08 17:16:20 +0900 58 적용 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@375 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi-hanja.txt commit c5a59c8afaa045b098431739583e9eb69eeebe27 Author: Choe Hwanjin Date: 2004-02-08 11:54:24 +0900 80,81 적용 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@374 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi-hanja.txt commit 8897936638182cfebf16387dcb91e6c702c4a49c Author: Choe Hwanjin Date: 2004-02-08 11:54:02 +0900 72 적용 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@373 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi-hanja.txt commit ec044cfcbd69358387071b273324ccbd270af78a Author: Choe Hwanjin Date: 2004-02-08 11:53:22 +0900 71 적용 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@372 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi-hanja.txt commit 044935f806f4f5ad8da1caf7939b7c6b48233c3d Author: Choe Hwanjin Date: 2004-02-08 11:52:57 +0900 70 적용 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@371 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi-hanja.txt commit f010fdc9d08f2ac2dfa76a55cc540180d3685ac4 Author: Choe Hwanjin Date: 2004-02-08 11:52:11 +0900 69 적용 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@370 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi-hanja.txt commit e709a553999c55fcc73753f921801f7cc6966518 Author: Choe Hwanjin Date: 2004-02-08 00:17:25 +0900 73 적용 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@369 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi-hanja.txt commit 971b35c9c8465b07db8ab7a35af6831909c53b9d Author: Choe Hwanjin Date: 2004-02-07 23:48:38 +0900 77 적용 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@368 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi-hanja.txt commit f72db9b589174543a42daf2c5083d0674f796a02 Author: Choe Hwanjin Date: 2004-02-07 23:48:11 +0900 76 적용 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@367 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi-hanja.txt commit ace656452f9fb581d8798fd245fe335afad1d3ba Author: Choe Hwanjin Date: 2004-02-07 23:47:31 +0900 74 적용 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@366 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi-hanja.txt commit 0225a550617f2eba129ee28cc05b39099ed697de Author: Choe Hwanjin Date: 2004-02-07 23:46:53 +0900 54 적용 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@365 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi-hanja.txt commit b659d1d239087da07a87954b9d7bf7c007e8b7dc Author: Choe Hwanjin Date: 2004-02-07 23:46:28 +0900 53 적용 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@364 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi-hanja.txt commit 58308284856396b398f62d941c58fd9064fb70f8 Author: Choe Hwanjin Date: 2004-02-07 23:46:04 +0900 37 적용 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@363 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi-hanja.txt commit ae47e7c9630f1ff54a488451a336dd535fff2b9f Author: Choe Hwanjin Date: 2004-02-07 23:45:45 +0900 33 적용 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@362 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi-hanja.txt commit 5aef07d9d4e04aceaa5f438bc7c1cbff27fe2ab3 Author: Choe Hwanjin Date: 2004-02-07 23:44:19 +0900 32 적용 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@361 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi-hanja.txt commit a28787e25f8cb4d3dea85d70c7258dc5de770e68 Author: Choe Hwanjin Date: 2004-02-06 07:39:18 +0900 38 적용 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@360 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi-hanja.txt commit 92b7f7c7c1853b7facff08f79f1b2d4cad57ca97 Author: Choe Hwanjin Date: 2004-02-04 22:49:40 +0900 28 적용 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@359 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi-hanja.txt commit 9e523f2cd122d8fdabb95d315b1ee37d705f758d Author: Choe Hwanjin Date: 2004-02-04 22:48:04 +0900 56 적용 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@358 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi-hanja.txt commit c7dca6bb6616cd2f33aba03adb8a02e65894b408 Author: Choe Hwanjin Date: 2004-02-03 11:12:44 +0900 테마 디렉토리 이름 변경 적용(MSWindow2000 -> MSWindowsXP) git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@357 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M configure.in commit b095eff831951370c0a671f6d3b7e5d5d51b0457 Author: Choe Hwanjin Date: 2004-02-02 18:13:26 +0900 위젯을 만들기 전에 XMODIFIERS 환경 변수를 지움. 그러지 않으면 xim의 위젯이 xim 서버 자신에게 연결하려 해서 일종의 무한 루프에 빠지게 됨 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@356 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog M src/ui.c commit 63b6b5fdecb498a50ce5d77a53bceb91283328e1 Author: Choe Hwanjin Date: 2004-02-01 23:57:23 +0900 프로그램 정보창에서 키 입력 통계를 세로에서 가로 형식으로 수정 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@355 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ui.c commit d8f89043137fd697c101684890c1d0e3fb6712f7 Author: Choe Hwanjin Date: 2004-02-01 23:30:03 +0900 05 적용 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@354 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi-hanja.txt commit 68f371d5e698a39f5053469a70256d07bbe3eb13 Author: Choe Hwanjin Date: 2004-02-01 14:43:56 +0900 08 적용 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@353 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi-hanja.txt commit e0ed6aa7be474587a2bf92c6341d7d1f526a1c34 Author: Choe Hwanjin Date: 2004-02-01 01:23:56 +0900 07 적용 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@352 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi-hanja.txt commit 6bd4899867b46cc15133dfae647d2ea97a4066f4 Author: Choe Hwanjin Date: 2004-01-31 12:38:32 +0900 about 윈도우의 통계정보 위젯을 GtkTextView로 바꿈 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@351 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ui.c commit e94f8b8636ea5f810d113b46d7b5a51609242e1e Author: Choe Hwanjin Date: 2004-01-31 10:27:18 +0900 39, 40 적용 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@350 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi-hanja.txt commit ee6693fa1e1c1b9cc9eca8f69de9829d168ad4ad Author: Choe Hwanjin Date: 2004-01-30 23:30:05 +0900 52 적용 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@349 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi-hanja.txt commit a51c322fed85ea14f327f0c62e1012d6bb9f7443 Author: Choe Hwanjin Date: 2004-01-29 20:03:44 +0900 쓸데없이 메세지 출력하는 부분 제거 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@348 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/session.c commit ffc4acaddc9d8a595c504165a32e27004f1b54d1 Author: Choe Hwanjin Date: 2004-01-29 18:51:54 +0900 더이상 사용하지 않는 static array 파일들 제거 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@347 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 D src/hanjatable.h D src/symboltable.h D src/ucs2ksc.h commit 7335ed521c29afc9fc274a3219ad258cde0e09a5 Author: Choe Hwanjin Date: 2004-01-29 18:47:15 +0900 MSWindows2000 테마 이름을 MSWindowXP로 바꿈 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@346 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 D themes/MSWindows2000/Makefile.am D themes/MSWindows2000/english.png D themes/MSWindows2000/hangul.png D themes/MSWindows2000/none.png A themes/MSWindowsXP/Makefile.am A themes/MSWindowsXP/english.png A themes/MSWindowsXP/hangul.png A themes/MSWindowsXP/none.png M themes/Makefile.am commit 67c3b91f8df87e2d4b5d6d96a6e1288b4bace80b Author: Choe Hwanjin Date: 2004-01-29 18:44:28 +0900 실수로 지원던 파일 복구 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@345 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 A themes/MSWindows/Makefile.am A themes/MSWindows/english.png A themes/MSWindows/hangul.png A themes/MSWindows/none.png commit 1d062294edd0084e0b288e7a32827e87284245c3 Author: Choe Hwanjin Date: 2004-01-29 18:44:00 +0900 실수로 파일 지움 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@344 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 D themes/MSWindows/Makefile.am D themes/MSWindows/english.png D themes/MSWindows/hangul.png D themes/MSWindows/none.png commit 364e3aa2f4d60edcd74196b5cfe76f0aafd6f243 Author: Choe Hwanjin Date: 2004-01-29 18:30:39 +0900 새로운 작업자 추가 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@343 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/CREDITS commit 32f4ba9792d81c7ec7ba8b614f950002b614f824 Author: Choe Hwanjin Date: 2004-01-29 18:30:22 +0900 candidate_font 설정값 추가, 이것으로 candidate 창에서 candidate글자의 글꼴을 선택할수 있음 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@342 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog M src/candidate.c M src/nabi.h M src/server.c M src/server.h M src/ui.c commit 1ed5b5db515cab0d83bb6dc643ab8034b9b7767f Author: Choe Hwanjin Date: 2004-01-29 10:17:51 +0900 55 적용 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@341 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi-hanja.txt commit a52625e979413584b23a0ffb3a1724ce6c7d7514 Author: Choe Hwanjin Date: 2004-01-29 10:17:30 +0900 12 적용 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@340 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi-hanja.txt commit c833ab1e40cd62ee1e8d597500707578a9968e7d Author: Choe Hwanjin Date: 2004-01-28 12:01:49 +0900 51 적용 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@339 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi-hanja.txt commit e7cc1cd3e9840d1ba02169067922fe402a8651cd Author: Choe Hwanjin Date: 2004-01-28 01:53:20 +0900 50 적용 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@338 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi-hanja.txt commit cc0299b2db809484f62b52eb08bd01425e2ebfd8 Author: Choe Hwanjin Date: 2004-01-28 01:52:59 +0900 13 적용 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@337 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi-hanja.txt commit 7cc9bc06de6b00b9022010e074754eb9129c2ef1 Author: Choe Hwanjin Date: 2004-01-27 21:38:49 +0900 49 적용 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@336 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi-hanja.txt commit 4f1d0a95bbebf32ecb25d309154fe615bd7383a0 Author: Choe Hwanjin Date: 2004-01-27 21:38:27 +0900 62 적용 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@335 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi-hanja.txt commit 850bc758fa6eb1daa66cea1f2bb01d7bb487bcab Author: Choe Hwanjin Date: 2004-01-27 00:51:34 +0900 * candidate window의 메인 위젯을 GtkTable에서 GtkTreeView로 바꿈 * ic->candidate_window를 ic->candidate로 이름 바꿈 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@334 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog M src/candidate.c M src/candidate.h M src/handler.c M src/ic.c M src/ic.h commit e78f27b27e22bf2b34a35bd8088d24a86ee4ff25 Author: Choe Hwanjin Date: 2004-01-26 20:37:09 +0900 nabi_server_load_candidate_table 함수에서 잘못된 포인터 처리 수정 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@333 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/server.c commit 984953ca4f5dabd553506bb329676abe9401be2c Author: Choe Hwanjin Date: 2004-01-26 19:50:53 +0900 09, 10, 11 적용 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@332 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi-hanja.txt commit ed9d57ef617e72cba42af3b4a4bf93cc612dac94 Author: Choe Hwanjin Date: 2004-01-26 19:49:13 +0900 31 적용 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@331 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi-hanja.txt commit 10624f2f1d5d65ae09855559ed656deebad96c67 Author: Choe Hwanjin Date: 2004-01-26 19:47:37 +0900 48 적용 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@330 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi-hanja.txt commit 026b05cf7f5014121dd75ace837b803e9a9a5735 Author: Choe Hwanjin Date: 2004-01-20 12:34:40 +0900 47 적용 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@329 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi-hanja.txt commit 1a083f69e796082ff64dda236219c6d6ca9080ab Author: Choe Hwanjin Date: 2004-01-19 23:48:40 +0900 65 적용 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@328 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi-hanja.txt commit edfba8029be9a537e57f0284fdd4cf40a3204177 Author: Choe Hwanjin Date: 2004-01-19 12:00:51 +0900 43, 44, 45, 46 적용 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@327 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi-hanja.txt commit 61d1574bbe0197f8830b45dda231187821bdc92c Author: Choe Hwanjin Date: 2004-01-18 23:07:32 +0900 23, 24, 25 적용 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@326 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi-hanja.txt commit 3365da864a3c5b75bf21560b06e1d5c10ac3efba Author: Choe Hwanjin Date: 2004-01-18 00:25:20 +0900 30번 적용 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@325 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi-hanja.txt commit 0b463208b9f3106d5c452918a02bb209b7006f71 Author: Choe Hwanjin Date: 2004-01-17 23:28:43 +0900 22번 적용 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@324 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi-hanja.txt commit f5a2c3fc5a36b2d93115320d8f7b4a8c3ed9783d Author: Choe Hwanjin Date: 2004-01-17 23:26:39 +0900 21번 적용 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@323 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi-hanja.txt commit 0cb116a900369f5cac07b66a38a9ecd9ddc22c67 Author: Choe Hwanjin Date: 2004-01-17 16:41:18 +0900 20번 적용 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@322 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi-hanja.txt commit 849a167b9c6f83cda12c22f8701c80c0fc0983f3 Author: Choe Hwanjin Date: 2004-01-17 14:50:15 +0900 작업자 추가 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@321 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/CREDITS commit a7823b7494be6ba1bdd65d492725defd85540990 Author: Choe Hwanjin Date: 2004-01-17 14:49:50 +0900 82, 83 적용 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@320 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi-hanja.txt commit b24d5c5d634e400289b3e52ef754be1950807486 Author: Choe Hwanjin Date: 2004-01-17 14:21:28 +0900 19 적용 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@319 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi-hanja.txt commit dc46a228ab3451b6f4252c09e6cc134f61c49327 Author: Choe Hwanjin Date: 2004-01-17 14:12:20 +0900 18번 적용 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@318 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi-hanja.txt commit 6e79f1c60d06d819d024c2ad707c52d7ea86441f Author: Choe Hwanjin Date: 2004-01-17 14:10:11 +0900 29번 적용 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@317 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/CREDITS M tables/candidate/nabi-hanja.txt commit 5be3ec9498dbd90fabf2e1b9e47533f385b9e61e Author: Choe Hwanjin Date: 2004-01-17 01:04:21 +0900 41,42 작업 적용 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@316 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/CREDITS M tables/candidate/nabi-hanja.txt commit 3fd373571d19c7ca9e2b807e1eef6ad51b912c7f Author: Choe Hwanjin Date: 2004-01-17 00:01:06 +0900 17번 적용 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@315 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi-hanja.txt commit c728a8fdc066742c2bef09e0bd0d678f593a3496 Author: Choe Hwanjin Date: 2004-01-17 00:00:00 +0900 잘못 커밋된 부분을 복구 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@314 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/hanjatable.py commit 9cacf0d2d04e03282cca2c8c0f58b2c95e605c88 Author: Choe Hwanjin Date: 2004-01-16 23:52:09 +0900 36번 적용 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@313 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/hanjatable.py M tables/candidate/nabi-hanja.txt commit d4d6e5199839dfe904265b54ef5c0dffd57e2100 Author: Choe Hwanjin Date: 2004-01-16 18:21:08 +0900 작업자 추가 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@312 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/CREDITS commit b9d96ece7d10ddec07a4ae961802613b215db3c2 Author: Choe Hwanjin Date: 2004-01-16 18:20:58 +0900 작업 번호 64 merge git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@311 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi-hanja.txt commit 95c068775b9bf4aab13e066e53ca11b5b13ac371 Author: Choe Hwanjin Date: 2004-01-16 18:16:44 +0900 61번 작업 merge git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@310 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi-hanja.txt commit e8e29fdd6f0fb7875ef3d867e4b9ae6350627c8d Author: Choe Hwanjin Date: 2004-01-16 18:12:14 +0900 작업 번호 16번 적용 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@309 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi-hanja.txt commit cd1eebd24244a9c1334077a50cf957ac8cdc696b Author: Choe Hwanjin Date: 2004-01-16 13:31:48 +0900 속자, 동자, 약자, 고자 이런 지시자를 모두 한자로 전환 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@308 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi-hanja.txt commit 9c984f9ee04aa198bc9598a98eb8c4f251fce2ee Author: Choe Hwanjin Date: 2004-01-16 13:31:21 +0900 작업자 추가 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@307 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/CREDITS commit 49874f858cfc4712db023bcc4eb72491be8d8454 Author: Choe Hwanjin Date: 2004-01-16 13:22:33 +0900 작업 번호 01 적용 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@306 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi-hanja.txt commit 55849a9dc4943d715f7ee720294970d5d59daf85 Author: Choe Hwanjin Date: 2004-01-15 23:59:01 +0900 작업 번호 06, 15, 60, 67 적용 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@305 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/CREDITS M tables/candidate/nabi-hanja.txt commit bd90008c8e7ea51d942c399d99b9fabc2dedf523 Author: Choe Hwanjin Date: 2004-01-15 11:41:28 +0900 작업 번호 09, 14, 27, 34, 35, 75 적용 도움을 주신 분들 목록에 남김 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@304 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 A tables/candidate/CREDITS M tables/candidate/nabi-hanja.txt commit 0ef11e4eaa14b30025604ed4e7cfe0e80cf1aad5 Author: Choe Hwanjin Date: 2004-01-13 17:24:02 +0900 FrameMgr Iter memory leak fix. git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@303 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M IMdkit/FrameMgr.c commit 7f8a4f1916a6bd0369693faab9c22d6287ab07c9 Author: Choe Hwanjin Date: 2004-01-13 11:55:41 +0900 한자 추출 스크립트와 문서 추가 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@302 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 A tables/candidate/README A tables/candidate/hanjatable.py A tables/candidate/nabi-hanja.txt A tables/candidate/nabi-symbol.txt commit ae0186a8c15222694910886329388d7ae663bd1c Author: Choe Hwanjin Date: 2004-01-10 10:00:51 +0900 * 한자 commnet 부분을 지우고 새로 채워 넣기 쉽게 함 * 기호 부분에 있던 ^M을 지움 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@301 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/candidate/nabi.txt commit c0a635103443131080bd7409bcf88800df555261 Author: Choe Hwanjin Date: 2004-01-10 01:12:46 +0900 candidate window를 가로에서 세로 방향으로 바꿈 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@300 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/candidate.c M src/candidate.h M src/handler.c commit 2459078f91aaa05c681841c6b195f9b3266b2c76 Author: Choe Hwanjin Date: 2004-01-10 01:10:33 +0900 사용하지 않는 hanjatable.h, symboltable.h를 제거 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@299 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/Makefile.am commit aa40060991bf5e62399cec2c5f5f221355b71f0a Author: Choe Hwanjin Date: 2004-01-09 21:18:39 +0900 hanja_table과 symbol_table을 더이상 사용하지 않고 외부의 데이터 파일 (NABI_DATA_DIR/candidate/nabi.txt)로 저장한 것을 읽어 오는 형식으로 바꿈 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@298 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog M src/candidate.c M src/candidate.h M src/ic.c M src/nabi.h M src/server.c M src/server.h M src/ui.c M tables/Makefile.am A tables/candidate/nabi.txt commit 09910317ac13924c0e43f83dd441563a894ce29e Author: Choe Hwanjin Date: 2004-01-09 18:33:18 +0900 XIM_STR_CONVERSION message에서 factor 안보내던 부분을 수정 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@297 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M IMdkit/i18nClbk.c commit 597057b75c8424ada1e686c9c60c0d4253586849 Author: Choe Hwanjin Date: 2003-12-29 20:08:56 +0900 memory leak: property_free git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@296 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/session.c commit 26ba5968c87955b0ec3ca8d5ee026b1887a39690 Author: Choe Hwanjin Date: 2003-12-29 20:06:51 +0900 안쓰는 변수 삭제 session_id git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@295 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/main.c commit a1537b0438dad60a4447efc5fba2f1dcb8012608 Author: Choe Hwanjin Date: 2003-12-29 14:07:02 +0900 update cvsignore git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@294 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M .cvsignore A m4/.cvsignore M po/.cvsignore A tables/.cvsignore commit b7fe6b3eb4e9c579c4f198f2f16c668898838825 Author: Choe Hwanjin Date: 2003-12-29 14:05:46 +0900 memory leak 해결 IMdkit/i18nIc.c:_Xi18nChangeIC IMdkit/i18nPtHdr.c:GetIMValueFromName git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@293 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog M IMdkit/i18nIc.c M IMdkit/i18nPtHdr.c commit 9b4524c397224cfe13e07e01d86b28f18e44daa0 Author: Choe Hwanjin Date: 2003-12-23 13:45:43 +0900 nabi_server_on_keypress 함수에 keyval 인자를 추가함(backspace도 기록하기 위해) git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@291 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog M src/automata.c M src/server.c M src/server.h commit 21d2c43c74c142420be4743556be025c7fd968f9 Author: Choe Hwanjin Date: 2003-12-22 00:18:59 +0900 메일 주소 수정 (커밋정보를 메일로 보내는 테스트) git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@290 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M AUTHORS commit 14578974b9b74625cbecbe4e88e25c2c1eb5516e Author: Choe Hwanjin Date: 2003-12-22 00:07:56 +0900 메일 주소 수정 (cvs commits를 메일로 보내기 위한 설정을 테스트) git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@289 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M AUTHORS commit df56728ab1167dd650c2f40e040866a6ea98b1db Author: Choe Hwanjin Date: 2003-12-20 21:59:08 +0900 Session properties중 최소한 기본적으로 필요한 것들을 설정하는 루틴 추가 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@287 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog M po/ko.po M src/main.c M src/nabi.h M src/session.c M src/session.h M src/ui.c commit 3b39f14367e3fee3dda573b7db480cbcc1e0e5d2 Author: Choe Hwanjin Date: 2003-12-19 20:06:20 +0900 더이상 필요하지 않은 에러메세지 출력 루틴들을 지움 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@286 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/fontset.c M src/handler.c M src/server.c M src/ui.c commit 4dbbccc4eb0c2b9a44c194771db0d309cc919498 Author: Choe Hwanjin Date: 2003-12-19 15:59:51 +0900 기본 아이콘 크기가 36이 아니라 32가 일반적인 크기 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@285 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ui.c commit d8182cd700bf292f7ead52e0b1483389cb4bbec1 Author: Choe Hwanjin Date: 2003-12-18 16:53:13 +0900 문서 업데이트 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@283 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog M NEWS commit 6bd02b44f367c1abeeb021fdc8789a233e6dca83 Author: Choe Hwanjin Date: 2003-12-18 16:51:58 +0900 version up to 0.12 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@282 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M configure.in commit 57c2cb6ec3ef26a5321f43a2916dfd36e21e8782 Author: Choe Hwanjin Date: 2003-12-18 16:51:14 +0900 po file update git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@281 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M po/ko.po commit a314fbd61ef7f5b2613d6f1c517156090c4e6f85 Author: Choe Hwanjin Date: 2003-12-16 16:01:55 +0900 g_build_filename 사용, menu position 수정 tray icon destroy할때 none,hangul,english_image 포인터를 NULL로 세팅 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@278 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog M src/ui.c commit c990bd02bda472f64cace394d7b03e34bbfe1928 Author: Choe Hwanjin Date: 2003-12-16 14:57:25 +0900 PreeditCallback에서 preedit style을 XIMUnderline에서 XIMReverse로 바꿈 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@277 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog M src/ic.c commit fb468f545358518bf07d8683d63dca759bebaad8 Author: Choe Hwanjin Date: 2003-12-16 12:40:09 +0900 remove comments git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@276 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ui.c commit d7876e05e948ac5d31ed805f0f8377eb231bc215 Author: Choe Hwanjin Date: 2003-12-16 00:20:31 +0900 implement GtkMenuPositionFunc for menu git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@275 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog M src/ui.c commit 6afa75f5ee4280d8b8d346bc05ad8b5503e12824 Author: Choe Hwanjin Date: 2003-12-15 16:04:48 +0900 GtkSocket의 크기를 구해서 계산하여 icon의 크기를 24,36,48,64,128중에서 결정한다 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@274 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog M src/ui.c commit 31c50cbfc8c712893937abdb00790b8431ea1d8c Author: Choe Hwanjin Date: 2003-12-14 11:51:41 +0900 *** empty log message *** git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@273 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog commit 4c244ba66a812a642316b8286afc061e666957a6 Author: Choe Hwanjin Date: 2003-12-14 11:50:36 +0900 change the color position (thanks to Kim Seok-Jin) git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@272 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M themes/Mac/hangul.png commit 11dadc518c62dde252679e7503445922f4eaf408 Author: Choe Hwanjin Date: 2003-12-14 11:45:47 +0900 update icons thanks to Kim Seok-Jin git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@271 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M themes/keyboard/english.png M themes/keyboard/hangul.png M themes/keyboard/none.png commit 939fbb44eaebbe4603bb729be6a98cbb17718d1d Author: Choe Hwanjin Date: 2003-12-14 11:16:43 +0900 does not use iconv directly, instead use g_iconv git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@270 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog M src/server.c M src/server.h commit ed927fa296ec4c5c0063de15bd39f373a5454839 Author: Choe Hwanjin Date: 2003-12-09 17:22:05 +0900 Update ChangeLog git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@268 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog commit 87df27875460d583e11e1193bca18eedc45787bd Author: Choe Hwanjin Date: 2003-12-09 17:10:31 +0900 MSWindows2000 테마 추가 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@267 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M configure.in A themes/MSWindows2000/Makefile.am A themes/MSWindows2000/english.png A themes/MSWindows2000/hangul.png A themes/MSWindows2000/none.png M themes/Makefile.am commit d964263a56e147ab13ffe6b3a2a8ed68336f6331 Author: Choe Hwanjin Date: 2003-12-05 22:41:02 +0900 add utf8_to_compound_text() func. do not commit on ICReset, just send last preedit string git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@266 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/handler.c M src/ic.c M src/ic.h commit 2baae5d1bde7e6b2dfdf1326ad89fcf65bacbeca Author: Choe Hwanjin Date: 2003-12-03 11:55:59 +0900 PreeditPosition에서 preedit window를 spot location보다 한픽셀 뒤로 밂 (커서위치를 보이게 하기 위함) git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@265 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ic.c commit 84ff7d8b48cd8d00212a382f9407f8f5948c5dba Author: Choe Hwanjin Date: 2003-12-02 20:37:11 +0900 set overide-redirect to show preedit window correctly on Qt app git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@264 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ic.c commit fd055ad612496018ba2094fdeeda3eed3d7657c6 Author: Choe Hwanjin Date: 2003-11-29 17:29:45 +0900 update po git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@262 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M po/ko.po commit fb390f071c2ab09e1f12e08e3c1574e2e25f8fa6 Author: Choe Hwanjin Date: 2003-11-29 17:28:18 +0900 update ChangeLog git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@261 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog commit 280e31f8dcaa6e7c654907c68921c77b721fcded Author: Choe Hwanjin Date: 2003-11-29 16:46:23 +0900 set dialog variable to NULL when about window closed git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@260 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ui.c commit 73305b77bb2894e8caaec134f77355f600b5f9f1 Author: Choe Hwanjin Date: 2003-11-29 16:42:27 +0900 about window가 하나만 뜨게 함 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@259 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ui.c commit e146fbb75c355f5d4019d3039e8c8609402305b9 Author: Choe Hwanjin Date: 2003-11-28 18:52:45 +0900 gc를 ic별로 관리하는 대신 server에 기본 gc를 하나 만들고 그걸 사용하도록 함 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@258 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ic.c M src/server.c M src/server.h commit 77256dab801aac02bb3cd5e9fc84d9eb3c348eac Author: Choe Hwanjin Date: 2003-11-28 15:10:34 +0900 문서 업데이트 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@257 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M AUTHORS M NEWS M TODO commit 1539a60880c3dee59c63c7ffa82ea7620f99ee22 Author: Choe Hwanjin Date: 2003-11-28 15:09:52 +0900 prepare for version up git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@256 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M configure.in commit bed5eaa25d5be9b7485a65858e38df3daf84eb72 Author: Choe Hwanjin Date: 2003-11-28 12:59:07 +0900 번역 업데이트 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@255 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M po/ko.po commit 76c7cf803dd9f463e0918483ed272105f090e7b9 Author: Choe Hwanjin Date: 2003-11-28 12:00:16 +0900 xim 서버 종료시 gtk2 application들이 죽던 문제 해결, xim서버를 정상적으로 종료함 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@254 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/main.c M src/server.c M src/server.h M src/ui.c commit b37d0117721200ef96cfe629cf6ee70804ae7634 Author: Choe Hwanjin Date: 2003-11-28 11:03:33 +0900 set variable MSGID_BUGS_ADDRESS git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@253 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M po/Makevars commit 593a28042c7cd1c7d3e90fd0836e065d0da08ac2 Author: Choe Hwanjin Date: 2003-11-28 11:00:40 +0900 update comment for parsing command line args routine git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@252 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ui.c commit a814c1d057b3642c5d95d7ea0e0276d1e3d9a119 Author: Choe Hwanjin Date: 2003-11-27 21:33:24 +0900 candidate window에서 . 제거 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@251 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/candidate.c commit eebd533ce48d234a6807a88e8a43f391586e20b9 Author: Choe Hwanjin Date: 2003-11-26 11:54:14 +0900 rename function for root window event filtering git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@250 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ui.c commit cedce42bf7965abf7d304ede679495953e326055 Author: Choe Hwanjin Date: 2003-11-25 17:10:33 +0900 -s(--status-only) 옵션 추가(디버깅용도, 또는 상태 정보만 보여주기) git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@249 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/main.c M src/nabi.h M src/server.c M src/ui.c commit ae2a03bd8405c9b2c231e5a284425065f95ef0d5 Author: Choe Hwanjin Date: 2003-11-24 23:15:57 +0900 실수로 추가한 코드 제거 (server start 루틴 작동함) git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@248 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/main.c commit 031d50df4306324e9360878849dcd1b7649acff8 Author: Choe Hwanjin Date: 2003-11-24 22:56:56 +0900 update main window git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@247 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/main.c M src/ui.c commit e524caf096aa71a17028e4cb665c4e69462ca37d Author: Choe Hwanjin Date: 2003-11-24 11:39:10 +0900 세벌식 오토마타에서 잘못돼 있던 goto update를 goto insert로 수정, OUTPUT_JAMO의 경우만 순서를 고려하지 않는 코드(모아치기)를 사용 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@246 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/automata.c commit 41a383378cb5a8d0a5839e4c3b0847cec8d800fe Author: Choe Hwanjin Date: 2003-11-15 11:23:30 +0900 argument check, 안전한 프로그램을 위해 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@244 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/server.c commit f35fefb0d72728ae46cd25abbfe5f835e2b8fad9 Author: Choe Hwanjin Date: 2003-11-13 23:03:37 +0900 add tooltips on tray icon git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@243 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ui.c commit cc214310a0dedca00efcc319e0efafa48253d4aa Author: Choe Hwanjin Date: 2003-11-10 17:28:34 +0900 candidate window의 memory leak git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@242 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/candidate.c commit b9833ba2f3b64d5ac373af9a92e3c08f147ba708 Author: Choe Hwanjin Date: 2003-11-09 19:55:15 +0900 PreeditPosition에서 preedit window 위치 조정 (xterm에서) git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@241 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ic.c commit 49ba133d2c0b0304f65d04562ea23967b39ba40d Author: Choe Hwanjin Date: 2003-11-09 19:53:53 +0900 각 글자를 x 방향도 맞추도록 함 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@240 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/candidate.c commit bc5dee5e01deadcb804a523d89f4d0815fae0852 Author: Choe Hwanjin Date: 2003-11-07 12:54:21 +0900 candidate window에서 잘못된 인덱스 수정 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@238 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/handler.c commit a5f56670031d900c9decd43193d3aa6ebaf9392f Author: Choe Hwanjin Date: 2003-11-07 10:48:48 +0900 version up 0.10 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@237 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M configure.in M po/ko.po commit 70ba07bda71995c270ca1cb5520817743b379277 Author: Choe Hwanjin Date: 2003-11-05 11:26:50 +0900 단축키를 알파벳대신 숫자로 변경함 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@236 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/candidate.c M src/handler.c M src/ic.c commit 739e4d0b1078d1de4f83c411598fd771300587cd Author: Choe Hwanjin Date: 2003-11-04 20:44:13 +0900 on focus out event close the candidate window git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@235 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/handler.c commit fe6236a77806fa039bc5094f5d46909979e75ca8 Author: Choe Hwanjin Date: 2003-11-04 14:36:54 +0900 always show full window on screen git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@234 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/candidate.c commit 94bdfbe485617032bc71e86682cac08603a8f219 Author: Choe Hwanjin Date: 2003-11-04 14:28:49 +0900 candidate selection window의 기본형을 wchar_t에서 unsigned short int로 변경 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@233 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/candidate.c M src/candidate.h M src/hanjatable.h M src/ic.c M src/symboltable.h commit 6fc8f0566ec4b7f69ff5f114532c36b94b4f9550 Author: Choe Hwanjin Date: 2003-11-04 14:27:36 +0900 add symboltable.h to source list git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@232 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/Makefile.am commit 757b88ff2f6197d26fee1372ac6f80815818634c Author: Choe Hwanjin Date: 2003-11-04 14:26:17 +0900 change default keymapping on symbol selection window git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@231 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/handler.c commit ee898983c935f343acb7add7fba6eea98d0623f4 Author: Choe Hwanjin Date: 2003-11-03 23:58:23 +0900 add symbol selection function git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@230 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/candidate.c M src/candidate.h M src/handler.c M src/hanjatable.h M src/ic.c A src/symboltable.h commit 16aaeebf013dfadd5e4eab70bad74063c056fe12 Author: Choe Hwanjin Date: 2003-11-02 22:12:59 +0900 Add new candidate window routine git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@229 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog M src/Makefile.am A src/candidate.c A src/candidate.h M src/handler.c M src/ic.c M src/ic.h M src/ui.c commit 46d2f761e0a0ad1714aef74ff05e886e8f017bad Author: Choe Hwanjin Date: 2003-10-30 21:30:59 +0900 텍스트 파일의 인코딩을 UTF-8 로 변환 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@228 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog M README M TODO M po/ko.po M themes/KingSejong/README M themes/Mac/README M themes/keyboard/README commit 828e85a0b1316e6383da990d19aef49486187f5d Author: Choe Hwanjin Date: 2003-10-29 14:31:20 +0900 update icon git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@227 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M themes/SimplyRed/hangul.png commit afea00e15de19c504158fbda7bad4d27e0bfc4e5 Author: Choe Hwanjin Date: 2003-10-22 16:09:27 +0900 *** empty log message *** git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@226 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog commit 665229d816636d3297e5ed008e6eca0aa0d202e7 Author: Choe Hwanjin Date: 2003-10-22 16:06:58 +0900 jamo 방식으로 output 하는 기능 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@225 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ic.c M src/nabi.h M src/server.c M src/server.h M src/ui.c commit 1e72760dff11b1f9ec1204ae10ccc2328ceb300c Author: Choe Hwanjin Date: 2003-10-20 20:46:24 +0900 *** empty log message *** git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@224 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog commit c35e4c59687f39bfd8f29fd290a57cca764e3e4f Author: Choe Hwanjin Date: 2003-10-20 20:45:07 +0900 conforming to strict aliasing rule git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@223 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ui.c commit af785972f4890c19ed107bc20996c9fee8c4dcae Author: Choe Hwanjin Date: 2003-10-19 20:26:10 +0900 *** empty log message *** git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@222 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog commit 21f26e5c92df73f509e225f181c2aa460d1b8033 Author: Choe Hwanjin Date: 2003-10-19 20:24:29 +0900 0x20 - 0x7e, 0xa0 - 0xff 범위의 keyval은 forwarding 하지 않고 commit git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@221 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ic.c commit 1fe4aeda0482f4be6d1a0f9a5248168be6a53aaf Author: Choe Hwanjin Date: 2003-10-18 18:27:05 +0900 *** empty log message *** git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@220 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog commit 308436ce137895d4fb18a8622916a8111738260e Author: Choe Hwanjin Date: 2003-10-18 11:37:43 +0900 autotool helper script git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@219 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 A autogen.sh commit 82ec2f3ac13218e96d19c0a1a0ac73ee2ff2369c Author: Choe Hwanjin Date: 2003-10-17 17:59:37 +0900 Qt에서 한글 상태에서 영문입력 문제 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@218 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ui.c commit e9371e012e7362eca8d9494252dec584e6a6b074 Author: Choe Hwanjin Date: 2003-10-17 17:52:55 +0900 Qt 3.1.2 에서 한글상태에서 영문글자들이 입력 안되는 문제 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@217 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/automata.c M src/ic.c M src/ic.h commit b9ed3dca0345c5b040df3bf62985402d4d81b9d7 Author: Choe Hwanjin Date: 2003-10-15 23:40:23 +0900 nabi_ic_commit_keyval 함수 추가 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@216 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/automata.c M src/handler.c M src/ic.c M src/ic.h commit 9c9f9573401a9d7d831f580b849c676d583691fb Author: Choe Hwanjin Date: 2003-10-15 11:28:09 +0900 unicode keysym 도 처리 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@215 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/automata.c commit 7aa179243a472250adeef70013b3d6119c151798 Author: Choe Hwanjin Date: 2003-10-15 11:25:02 +0900 한글 범위만 기록함 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@214 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/server.c commit 233f4c4593347d2178443691480f56e13827eebf Author: Choe Hwanjin Date: 2003-10-15 11:17:36 +0900 check_charset 리턴 값을 boolean 형에 맞게 수정 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@213 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/automata.c commit 89c793ef0671bc9f0d5ffa900c1bbfd194a96298 Author: Choe Hwanjin Date: 2003-10-15 10:36:17 +0900 0.9 release git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@211 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog M configure.in commit f9c71401c1454a5b8b2157145bf5502ff41063a8 Author: Choe Hwanjin Date: 2003-10-14 10:46:01 +0900 hangul_wcharstr_to_utf8str 함수에 buffer 크기를 인자로 넘김 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@210 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/hangul.c M src/hangul.h M src/ic.c M src/server.c commit ac1e4edb411b506ef9b4e3e76be94a89b83848fb Author: Choe Hwanjin Date: 2003-10-13 23:38:13 +0900 0.9 준비 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@209 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M configure.in commit b8a018e6e37a42f9c4196a7ba6bb573dd60eb801 Author: Choe Hwanjin Date: 2003-10-13 23:29:17 +0900 *** empty log message *** git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@208 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog commit 46ab627b75aa2e880d1964881101698e970a6fbd Author: Choe Hwanjin Date: 2003-10-13 23:23:15 +0900 내부적으로 사용하던 wchar_t 함수를 모두 utf8 함수로 수정 (bsd 지원) git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@207 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/hangul.c M src/hangul.h M src/ic.c M src/server.c commit 8c6f89cba305b7c8cca3957dc6cec862a5a07b2f Author: Choe Hwanjin Date: 2003-10-11 01:35:48 +0900 2벌식 자판에서도 한글 이외의 키가 입력되게 함 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@206 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/automata.c commit 16f59f216a900499a43eb28a49289619a3d84909 Author: Choe Hwanjin Date: 2003-10-10 17:20:40 +0900 *** empty log message *** git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@205 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog commit fea4ff099f04d9ffbe066a36f6fb8615d0d8adf8 Author: Choe Hwanjin Date: 2003-10-10 17:19:07 +0900 qt에서 한자 변환시 commit 하기 전에 안보이던 문제 해결 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@204 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ic.c commit 8e7fe57cd1b23f72b1da6b23c33c63ea242f42ac Author: Choe Hwanjin Date: 2003-10-08 23:32:35 +0900 라벨 업데이트 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@202 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ui.c commit 5a8bd060f0460e0d31cf2b9ec4b703347391df8b Author: Choe Hwanjin Date: 2003-10-08 23:30:30 +0900 version up git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@201 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog M NEWS M configure.in commit 5e85866da9d215c0240750f0845a812282b220f2 Author: Choe Hwanjin Date: 2003-10-08 23:28:24 +0900 *** empty log message *** git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@200 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog commit e0d062e70650e763482b9eec6de5979056738650 Author: Choe Hwanjin Date: 2003-10-08 18:46:47 +0900 출력 데이터 수정 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@199 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/server.c M src/server.h M src/ui.c commit e68734af8c539be104d9a0b4e4a8012e88f0a240 Author: Choe Hwanjin Date: 2003-10-08 17:42:45 +0900 통계기능 추가 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@198 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/automata.c M src/server.c M src/server.h M src/ui.c commit d3911ddfc544a4b7e50c1b7bbc460d219a0672db Author: Choe Hwanjin Date: 2003-10-08 10:55:31 +0900 *** empty log message *** git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@197 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog commit 3a1a408b84fd9088be4d274d35ef2ffcf2967d22 Author: Choe Hwanjin Date: 2003-10-08 10:55:23 +0900 세벌식에서 charset check 강화 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@196 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/automata.c commit 514dc0b4a474220be1c35871a2c154d98305809b Author: Choe Hwanjin Date: 2003-10-01 18:43:40 +0900 *** empty log message *** git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@195 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog commit 72de9a88347fc418e62abb7ec36bcfcc8aaba720 Author: Choe Hwanjin Date: 2003-10-01 15:17:15 +0900 XIMPreeditPosition의 경우는 commit하고 preedit clear하도록 수정 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@194 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ic.c commit cb5087f6ce5354b557a93a82b27f9ffa537ac069 Author: Choe Hwanjin Date: 2003-09-26 14:34:35 +0900 *** empty log message *** git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@192 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog commit 2941bc66f218eb773725ff4499a0e1176125ded8 Author: Choe Hwanjin Date: 2003-09-26 10:43:42 +0900 version up 0.7 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@191 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M configure.in commit 1c6ef1fa9819e09cca3c3bb8d9541f2371931ccc Author: Choe Hwanjin Date: 2003-09-22 16:31:02 +0900 몇가지 매크로 업데이트 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@190 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M configure.in commit ef7e6ffe1600f1527f638791549aef0abf53a9ae Author: Choe Hwanjin Date: 2003-09-19 15:06:33 +0900 NULL pointer check git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@189 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/handler.c M src/ic.c commit cdea1c5395ff12d6932b8b36ab83bf1debcd0d0b Author: Choe Hwanjin Date: 2003-09-19 14:39:20 +0900 한글 입력 모드 정보를 좀더 자주 갱신함 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@188 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ic.c commit c8bfede6e2b0722cb5142d1b3877cbe0e71c2f2d Author: Choe Hwanjin Date: 2003-09-18 22:01:53 +0900 *** empty log message *** git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@187 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog commit d4a6839017ee31f8e4a3fd7426abf1ee1dc338fa Author: Choe Hwanjin Date: 2003-09-18 22:01:00 +0900 한자 변환 기능을 한자키 말고 F9도 작동하게 수정 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@186 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/handler.c commit e8c548d337346afea2c0afed5d2d2919f81556fc Author: Choe Hwanjin Date: 2003-09-18 21:36:52 +0900 set/get ic values 함수에서 status attribute도 제대로 처리 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@185 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ic.c commit 2bc57c35386438bb64d4cc70efb08b9f7c1c1836 Author: Choe Hwanjin Date: 2003-09-18 21:01:53 +0900 *** empty log message *** git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@184 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog commit d441b489fad99ef167de01c3f681ee45005961ac Author: Choe Hwanjin Date: 2003-09-18 20:48:08 +0900 conformint to XIM spec git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@183 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ic.c commit f321d06fc68006befc54ac20dfe82daf8649f2bc Author: Choe Hwanjin Date: 2003-09-17 23:18:31 +0900 ic attr에서 XNSeparatorofNestedList 도 처리함 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@182 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ic.c commit cf180303fa4464ca0d6055dd51bb8f06c106ba3b Author: Choe Hwanjin Date: 2003-09-17 16:28:20 +0900 closedir 빼먹은것을 수정 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@181 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ui.c commit e0cafcfd247a91dbf4ad6373761b946effaee68d Author: Choe Hwanjin Date: 2003-09-17 11:58:09 +0900 default icon 설정 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@180 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog commit 347cf0a1eea4804a2c41d5b21419b1afacd32fc0 Author: Choe Hwanjin Date: 2003-09-17 11:47:08 +0900 default icon을 설정함 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@179 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ui.c commit 7b5e19a748148032ccd6cce2baa469366912768f Author: Choe Hwanjin Date: 2003-09-16 18:02:49 +0900 version 0.6 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@177 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog M configure.in commit 4f83287400dc4817787fd325981d763d7e437e16 Author: Choe Hwanjin Date: 2003-09-16 17:59:25 +0900 ucs2ksc.h 파일을 더이상 사용하지 않음 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@176 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/Makefile.am M src/hangul.c commit f9ca1988cd12ad437acb20ed3cf2ea5014737552 Author: Choe Hwanjin Date: 2003-09-16 11:57:18 +0900 종료 상황을 좀더 깔끔하게 처리 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@175 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ic.c M src/main.c M src/nabi.h M src/session.c M src/ui.c commit bacdad45c6b63fe912d141be1825fbd00199d345 Author: Choe Hwanjin Date: 2003-09-15 18:07:50 +0900 libSM이 없는 곳에서는 session을 사용안함 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@174 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/main.c M src/session.c M src/session.h commit 31e3c0862e1fe87afcea43e144d1c53907bb7ee1 Author: Choe Hwanjin Date: 2003-09-15 10:36:36 +0900 메세지 수정 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@173 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/fontset.c commit df3288815f274cb88369162ad72fa8a9aa171805 Author: Choe Hwanjin Date: 2003-09-15 01:20:59 +0900 종료 루틴에서 예외 처리 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@172 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/main.c M src/server.c M src/session.c commit 21947e8e1294f5d5e493fd8b9def1cf1269d66d8 Author: Choe Hwanjin Date: 2003-09-14 17:24:27 +0900 about window를 화면 가운데에 뜨게 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@171 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ui.c commit 6a96780bf7d38c2c39104013d7d1f282cbd6fd89 Author: Choe Hwanjin Date: 2003-09-14 17:18:38 +0900 Session 에 반응하도록 코드를 추가 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@170 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog M configure.in M src/Makefile.am M src/main.c M src/nabi.h M src/session.c M src/session.h M src/ui.c commit 8ac3398f837e2746e7ffb9fdfa6c2e3b0f8b8b6e Author: Choe Hwanjin Date: 2003-09-14 01:42:01 +0900 세벌식에서 중성과 종성만 있는 경우를 바르게 처리하도록 함 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@169 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/automata.c commit 19c489d85cbb8127db23c323b2d2a538a9af06fa Author: Choe Hwanjin Date: 2003-09-14 01:40:58 +0900 callback 함수의 형 정리 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@168 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ui.c commit e3396eea8f2b76b987e606178a9b7db10ae4a946 Author: Choe Hwanjin Date: 2003-09-14 01:25:43 +0900 세션 관련 코드 추가 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@167 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 A src/session.c A src/session.h commit 51b69f95046059b51aa59977b5ddb1f373134864 Author: Choe Hwanjin Date: 2003-09-10 13:19:45 +0900 *** empty log message *** git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@166 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog commit 1bb90d36c5d5dc515937630d973f8f6913bbb572 Author: Choe Hwanjin Date: 2003-09-10 13:19:26 +0900 AM_CFLAGS가 작동안함, libXimd_a_CFLAGS에 직접 -Wall 옵션 넣음 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@165 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M IMdkit/Makefile.am commit 94d7ca526f805b93b25b7ba8bcc256d64c686609 Author: Choe Hwanjin Date: 2003-09-10 13:17:39 +0900 특수키 포워딩 하면서 남은 글자를 commit 하게 함 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@164 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/handler.c commit 4f107f4fdfe4a9b313f3596f53c1aa9b29d11a00 Author: Choe Hwanjin Date: 2003-09-10 13:17:08 +0900 글자 조합(compose)하는 부분의 버그 수정 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@163 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/automata.c commit 643fd3a24b89cba19d04ed585447518336a7d726 Author: Choe Hwanjin Date: 2003-09-10 13:06:21 +0900 특수키는 바로 포워딩 한다 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@162 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/handler.c commit cdc63f17dad7212eb716d4c7ea4e7720247a0b28 Author: Choe Hwanjin Date: 2003-09-10 13:04:32 +0900 사용하지 않는 변수 제거 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@161 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ui.c commit 2ab9ebd28f60734a0612319f576390a3d4152b1b Author: Choe Hwanjin Date: 2003-09-10 13:04:04 +0900 한자 입력창 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@160 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ic.c commit 89d592408566cf9e6ca0b2092bbd753613bdefdf Author: Choe Hwanjin Date: 2003-09-10 13:03:36 +0900 AM_CFLAGS가 작동 안함, 그래서 nabi_CFLAGS에다가 직접 -Wall 옵션 넣음 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@159 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/Makefile.am commit 75da477276c49348a9e70842523f17bbedf1da7b Author: Choe Hwanjin Date: 2003-09-09 15:00:39 +0900 hangul_ucs_to_ksc 함수 제거 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@158 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/hangul.c M src/hangul.h commit 26d6630f72e52cec239c983edee8e2602be58406 Author: Choe Hwanjin Date: 2003-09-09 13:56:16 +0900 탭 조정 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@157 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/handler.c commit 78e967ed79c90eced85646480e6928495864f54a Author: Choe Hwanjin Date: 2003-09-09 13:48:55 +0900 ic가 destroy 되면 한자 입력 창도 같이 destroy git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@156 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ic.c M src/ic.h commit 431f72b412d0981511ff000aaa1cd81d085a86e1 Author: Choe Hwanjin Date: 2003-09-09 13:48:00 +0900 ic가 destroy되면 한자 입력 창도 같이 destroy git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@155 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ui.c commit 6da5ecd4a774c0812dc85f153823fa8f89d2fd10 Author: Choe Hwanjin Date: 2003-09-09 11:50:40 +0900 한자 선택창의 포지션 설정 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@154 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ui.c commit 6304491d504b41a9f3ac4e3ad068d969b81e6def Author: Choe Hwanjin Date: 2003-09-09 11:44:02 +0900 check_ksc -> check_charset git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@153 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/server.c M src/server.h commit 22b47b231c5c02e553642af628b6f4fa180eb9de Author: Choe Hwanjin Date: 2003-09-09 11:40:38 +0900 check_charset 함수 수정 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@152 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/automata.c commit 7b2f4f05e987f9427b0c5d248d3de737dc33c984 Author: Choe Hwanjin Date: 2003-09-09 10:59:20 +0900 server -> nabi_server git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@151 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/main.c commit 978e02b5450bd1837d324c1251413c4a5d3fef0a Author: Choe Hwanjin Date: 2003-09-09 10:58:06 +0900 global variable server를 nabi_server로 바꿈 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@150 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/automata.c M src/handler.c M src/ic.c M src/main.c M src/server.c M src/server.h M src/ui.c commit 2454cbbff7e74121a5ecb5f7d328cc2753b7ae77 Author: Choe Hwanjin Date: 2003-09-09 10:47:43 +0900 *** empty log message *** git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@149 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog commit ca45e67b8507a46d0f3feb9baa1835f872fe1dd6 Author: Choe Hwanjin Date: 2003-09-09 10:46:30 +0900 한자 입력 기능 구현(iconv를 이용한 charset 체크루틴) git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@148 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/server.c M src/server.h M src/ui.c commit 3d348f0d44225ffc659ff701f7e06ec8bee6e1d4 Author: Choe Hwanjin Date: 2003-09-08 18:54:00 +0900 ksc <-> ucs 체크하는 코드 작성중 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@147 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/server.c M src/server.h M src/ui.c commit c9e291a08f8f392657e040d418b15155234ec3ad Author: Choe Hwanjin Date: 2003-09-08 16:56:35 +0900 한글 테이블의 type을 바꿈 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@146 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/hangul.c M src/ucs2ksc.h commit ce5e89dab6b82ee2a7083685cccd0c1ed74e3f48 Author: Choe Hwanjin Date: 2003-09-08 16:50:00 +0900 const 추가 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@145 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ucs2ksc.h commit 6de10829ee95489fe43a907764128601b8c7ac74 Author: Choe Hwanjin Date: 2003-09-08 16:18:29 +0900 *** empty log message *** git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@144 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog commit 6d0e5e47026de6fabf2a15b791408146a2e37af1 Author: Choe Hwanjin Date: 2003-09-08 16:09:53 +0900 nabi_ic_preedit_start/done 을 매번 키입력때마다 체크해서 실행함 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@143 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/handler.c commit c5ac4791db484cd464c87a1c4dc44c57040eeab5 Author: Choe Hwanjin Date: 2003-09-08 15:14:23 +0900 한자 입력을 바로 commit 하지 않고 일단 preedit 스트링으로 보관함 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@142 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/hangul.c M src/ic.c M src/ic.h M src/ui.c commit 165af6227bac939d2c31223e33b6cef986eaeb02 Author: Choe Hwanjin Date: 2003-09-08 13:30:26 +0900 한자 입력 기능 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@141 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog M src/handler.c A src/hanjatable.h M src/ic.c M src/ic.h M src/nabi.h M src/ui.c commit 90f71c5ec963b0fd8a88d8c08d7965123d72771f Author: Choe Hwanjin Date: 2003-09-07 23:25:18 +0900 *** empty log message *** git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@138 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog commit e64efaa8f59bd12e902000893c85c72fbb0ffd1c Author: Choe Hwanjin Date: 2003-09-07 23:24:59 +0900 LDFLAGS와 LDADD를 분리 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@137 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/Makefile.am commit 79784e72295c4f80a21ef3d562909fd5fddbad84 Author: Choe Hwanjin Date: 2003-09-07 22:57:31 +0900 X 환경을 검색하는 매크로를 다른 것으로 바꿈 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@136 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M IMdkit/Makefile.am M configure.in M src/Makefile.am commit 567c9397b7081d1d98417c81b7fd933bf5bc14c2 Author: Choe Hwanjin Date: 2003-09-07 22:06:22 +0900 메세지 출력 함수 변경 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@135 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/main.c commit bd7768c544de465df63ba1aec62dba3459a0d090 Author: Choe Hwanjin Date: 2003-09-07 22:06:09 +0900 빈칸 정리 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@134 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/nabi.h commit c89868c54af95506a9371a05bbfa1b206ba16a65 Author: Choe Hwanjin Date: 2003-09-07 21:55:35 +0900 tab 크기 조정 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@133 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/handler.c commit 356cdeb3ef5e46f7f65c97c7e866a7ac3a26b2cc Author: Choe Hwanjin Date: 2003-09-07 21:47:38 +0900 세션 관련 코드제거, 에러 리포팅 함수 이름 수정 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@132 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/main.c commit f0c487dead56c7178aae1c7d8abff8b7baa5396c Author: Choe Hwanjin Date: 2003-09-07 21:46:13 +0900 가능한 설정을 자주 저장한다 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@131 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ui.c commit 9f897be640f3195c49687f8a4cfad9aeecd14855 Author: Choe Hwanjin Date: 2003-09-07 21:44:23 +0900 header file include 정리 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@130 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ic.c M src/ic.h M src/server.c M src/server.h commit 050f10c3af6106defa6164a61817a4680c0123bb Author: Choe Hwanjin Date: 2003-09-07 21:34:46 +0900 we do not use session(libSM) git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@129 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/Makefile.am D src/session.c D src/session.h commit 25195e8ca6ebf4e793c0663ede148d39b101237b Author: Choe Hwanjin Date: 2003-09-07 21:20:11 +0900 use libSM git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@128 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/main.c commit b3fdcebbc700c5fe5a406bad70be050b7c69797f Author: Choe Hwanjin Date: 2003-09-07 21:14:38 +0900 use libSM git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@127 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/Makefile.am commit fd61b1271fdd4f62990c9f31131574c56fa54b67 Author: Choe Hwanjin Date: 2003-09-07 21:07:16 +0900 *** empty log message *** git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@126 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog commit fb1b1784a6f3980b71151b9389d40685433f0be5 Author: Choe Hwanjin Date: 2003-09-06 18:35:19 +0900 SMlib 관련 코드 파일 추가 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@125 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 A src/session.c A src/session.h commit 768524d3a77a627b3d71729d3205dedef2e6bad7 Author: Choe Hwanjin Date: 2003-08-31 00:30:47 +0900 system tray와 main window를 분리, 메뉴에 드보락 관련 부분 추가 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@124 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/main.c M src/ui.c commit 1b5755dc351d797d4320398018c9ee5e98bad180 Author: Choe Hwanjin Date: 2003-08-30 17:35:20 +0900 ENABLE_NLS 를 고려하여 코딩 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@123 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/main.c commit 707f6525954f985d74d65f578ed179a4d721fae4 Author: Choe Hwanjin Date: 2003-08-29 18:05:03 +0900 NULL 포인터 체크 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@122 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/fontset.c commit b4c80ca06fa4dafc700a65f7d8fca1e9241eeb6f Author: Choe Hwanjin Date: 2003-08-29 17:57:41 +0900 ucs2ksc.h의 테이블 크기 줄임 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@121 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog commit c28deb2e053e75521ec733457864c6400d176afa Author: Choe Hwanjin Date: 2003-08-29 17:34:15 +0900 add comment about nabi_server_destroy() git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@120 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/server.c commit d5c1dba6e16e527f98e6edecf1465b2509784c11 Author: Choe Hwanjin Date: 2003-08-29 11:26:20 +0900 ucs_to_ksc 테이블의 크기를 줄임 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@119 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/hangul.c M src/ucs2ksc.h commit f330e9aae95fc3e8266bef8f62210c67847c0dd8 Author: Choe Hwanjin Date: 2003-08-29 10:06:37 +0900 탭 위치 설정 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@118 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ui.c commit 5aa6574ab2aca21e60b6e802e292d6876d1445fe Author: Choe Hwanjin Date: 2003-08-27 13:23:31 +0900 메뉴 아이콘 추가 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@117 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog M src/ui.c commit efad0c125f3e762c4aafdc42ba43ce9672c93004 Author: Choe Hwanjin Date: 2003-08-27 13:02:41 +0900 dvorak 설정 정보 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@116 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog commit 348cd2c73bd1aa69ccb9bd9e30be0ec7169c9844 Author: Choe Hwanjin Date: 2003-08-27 13:00:35 +0900 dvorak 설정 정보 관련 루틴 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@115 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/nabi.h M src/server.c M src/server.h M src/ui.c commit 017fd2fd297671b68f2288d5ddc9bcfd3e528441 Author: Choe Hwanjin Date: 2003-08-27 11:15:33 +0900 다음 버젼 준비 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@114 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M configure.in commit 0d82c708c2d51b961fe11e13cd0c8f243dd41a84 Author: Choe Hwanjin Date: 2003-08-27 10:32:50 +0900 dvorak 지원 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@113 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog M src/automata.c M src/server.c M src/server.h commit 0d7818911ee628f711c89811db65f39216d6d7a5 Author: Choe Hwanjin Date: 2003-08-26 10:20:07 +0900 디버그 메세지 함수 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@111 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/handler.c commit b966b6da3dd46f8860833c6910f9e9f055b3bf56 Author: Choe Hwanjin Date: 2003-08-26 10:11:32 +0900 *** empty log message *** git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@110 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 A po/.cvsignore commit e493ce8850c0406b53167b17e2e2a5f6bc709aab Author: Choe Hwanjin Date: 2003-08-25 23:11:20 +0900 *** empty log message *** git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@109 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M TODO commit 7a43dce134e93ef74f8894468bb12e6d8a876730 Author: Choe Hwanjin Date: 2003-08-25 22:53:38 +0900 오타 수정 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@108 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M configure.in commit b25f0deaba8829dc39ca70179dd72a106e648c02 Author: Choe Hwanjin Date: 2003-08-25 22:51:20 +0900 *** empty log message *** git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@107 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M po/ko.po commit 137b4d69694721997e5782ba33aa65fcdafaa87a Author: Choe Hwanjin Date: 2003-08-25 22:50:22 +0900 0.4 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@106 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog M configure.in commit 6664a880524073bf4a6f2c2986476765c67a8622 Author: Choe Hwanjin Date: 2003-08-25 22:47:55 +0900 디버그 메세지 제거 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@105 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/handler.c commit f6bb4938ccc503ea82e4f3f1fb9678e5dc53f42e Author: Choe Hwanjin Date: 2003-08-25 22:46:13 +0900 0.4 출시? git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@104 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M NEWS commit 32a884185db46a112813e70c2350b6d865ef5f6e Author: Choe Hwanjin Date: 2003-08-25 22:43:53 +0900 기본 자판 설정을 configure 할때 가능하게 함 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@103 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M configure.in commit 4e470b622f5e9e5ae3db67597aa0e508fcbb36bc Author: Choe Hwanjin Date: 2003-08-25 22:43:20 +0900 기본 자판 설정을 configure 스크립트에서 가능하게 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@102 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ui.c commit 95079fbdda30af34cfdba4e2fc1243749f7b4cb3 Author: Choe Hwanjin Date: 2003-08-25 22:13:23 +0900 업데이트 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@101 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M TODO commit d5183aceec7d07722e90ff798508652458b890ea Author: Choe Hwanjin Date: 2003-08-24 22:36:49 +0900 디버그 메세지 함수 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@100 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/handler.c commit 70d1b09f7cfca0cbf9a0157cf136493fc99b26b9 Author: Choe Hwanjin Date: 2003-08-24 18:18:38 +0900 다음 버젼 준비 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@99 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M configure.in commit c1239854ccc29320c245b7d51302f1129bc82874 Author: Choe Hwanjin Date: 2003-08-24 18:18:07 +0900 다음 버젼 준비 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@98 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M configure.in commit 9bd69438259e41dd16edbcc0d19ee03c70544640 Author: Choe Hwanjin Date: 2003-08-24 00:47:07 +0900 라이센스 문단 추가 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@97 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/fontset.c M src/fontset.h commit 1bd2ee9efd882bb8b171ad843fb78728df9adab7 Author: Choe Hwanjin Date: 2003-08-23 16:52:48 +0900 NabiConnect 추가 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@96 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog commit 3d354c1b7f4b955c66d03a273467eafd1d664473 Author: Choe Hwanjin Date: 2003-08-23 16:52:29 +0900 NabiConnect obj 추가 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@95 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/handler.c M src/ic.c M src/ic.h M src/server.c M src/server.h commit 1a9798a73692da0c5c1c1f576741dcf7bc505e9c Author: Choe Hwanjin Date: 2003-08-23 00:15:33 +0900 오타 수정 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@94 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/fontset.h commit 7d624b235782c3d639e598fa3c7546029e4f6fcd Author: Choe Hwanjin Date: 2003-08-22 11:24:11 +0900 *** empty log message *** git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@93 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M TODO commit c738c280d15b0530c71329fa8bf8724b00692a7a Author: Choe Hwanjin Date: 2003-08-22 11:19:42 +0900 fontset 관련 루틴 정리 (free_all 함수 사용) git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@92 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/fontset.c M src/fontset.h M src/ic.c M src/server.c commit d571dd4e7e977316aee9d777b2ff548ad47adf05 Author: Choe Hwanjin Date: 2003-08-21 23:06:28 +0900 fontset 관련 루틴 변경 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@91 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ic.c commit c5fbe074fe5e9ffe07c2cd181ffb3a8d97050133 Author: Choe Hwanjin Date: 2003-08-21 23:01:45 +0900 fontset 루틴 추가 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@90 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog commit 15d03c4584c71ed8a71c8fee96312ba2bf90dfca Author: Choe Hwanjin Date: 2003-08-21 23:00:50 +0900 fontset 관련 루틴 추가 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@89 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/Makefile.am A src/fontset.c A src/fontset.h commit 279f96ae39b7304717233c5546b29c3ed1bceb56 Author: Choe Hwanjin Date: 2003-08-21 21:29:27 +0900 nabi_server_stop 함수 추가 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@88 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog M src/main.c M src/server.c M src/server.h commit 3d78bac05b20c2c9fdbd53239f7dd7cf1be566c7 Author: Choe Hwanjin Date: 2003-08-20 14:16:08 +0900 stdint.h 를 include 한 부분을 제거 server.h에만 include 함 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@87 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/automata.c M src/handler.c M src/ic.c M src/main.c M src/server.c M src/server.h M src/ui.c commit 2daa8dbd2dd5c31e323ff9ce92bebb7c6eed43d9 Author: Choe Hwanjin Date: 2003-08-19 10:05:38 +0900 폰트 로딩 루틴 개선 필요성 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@86 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M TODO commit 97294fd46e2ca0a067707f225bf0331b6d77a3fa Author: Choe Hwanjin Date: 2003-08-12 18:34:03 +0900 디버그 코드 추가 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@85 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/handler.c commit 7ff7c05a60a4d9863131ca875d42c54e4e420e44 Author: Choe Hwanjin Date: 2003-08-12 12:58:37 +0900 오타 수정 (xnabi->nabi) git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@84 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M configure.in commit f90eac639340adc0a68a8195a4e7dbfe937b93be Author: Choe Hwanjin Date: 2003-08-11 15:22:36 +0900 TODO 추가 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@83 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 A TODO commit 496df9f68434e6f5af113be503514e707cafc058 Author: Choe Hwanjin Date: 2003-08-11 14:41:23 +0900 about 창에서 version number 보이게 함 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@82 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog commit 4074bd1bd3512cbab7b60c9649b6a5661cf4218f Author: Choe Hwanjin Date: 2003-08-11 14:28:47 +0900 about 창에 버젼 표시 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@81 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ui.c commit 25e12e3cc2abdaeefa92fdaa794979cd63e7bef9 Author: Choe Hwanjin Date: 2003-08-11 10:41:40 +0900 3.0 준비 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@80 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M configure.in commit a332ef2eda05727b90689429471825c0ccb17535 Author: Choe Hwanjin Date: 2003-08-11 10:40:43 +0900 flash 관련 문제 해결(preedit_start, preedit_done) git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@79 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog commit cd17f72ae275893bba154c5ea81bfb679ff74637 Author: Choe Hwanjin Date: 2003-08-11 10:29:52 +0900 변수 초기화 루틴 개선 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@78 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ui.c commit ac1f9208a168b116372e3ae704858b58b00c6428 Author: Choe Hwanjin Date: 2003-08-11 10:29:20 +0900 사용하지 않는 변수 제거 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@77 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/nabi.h commit 2fa48a0d525f9c0efe640e2746e8fb3204e62f84 Author: Choe Hwanjin Date: 2003-08-11 10:27:26 +0900 preedit start 플래그 추가 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@76 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ic.c M src/ic.h commit 1d0ecc03e4bcb31f720b125a43274a89632c6391 Author: Choe Hwanjin Date: 2003-08-09 23:12:34 +0900 정보 더 추가 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@75 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M README commit d5266ca09979d35ea8fd874131e30557c2d03499 Author: Choe Hwanjin Date: 2003-08-09 23:10:21 +0900 gtk+-2.0 대신 2.2 체크 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@74 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog commit 302f2d8eb339f304de83d89737e8565db3e83239 Author: Choe Hwanjin Date: 2003-08-09 12:52:15 +0900 gtk+의 필요한 버젼체그 실수 수정 multi head safty때문에 2.2 이상이 필요함(eggtrayicon에서 문제가 생김) git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@73 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M configure.in commit f48f0c1d443b8982d442b2bd1651690ddf7286c9 Author: Choe Hwanjin Date: 2003-08-07 17:51:33 +0900 vi 사용자들을 위해서 esc키를 누르면 자동으로 영문 상태로 전환하는 기능 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@67 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog M src/handler.c commit 10603432f9263e39b9119ca087acbea16fcf20d4 Author: Choe Hwanjin Date: 2003-08-07 12:06:00 +0900 cvsignore 추가 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@66 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 A IMdkit/.cvsignore commit 283a58d7805dbe1d67b850a3851de1d532336347 Author: Choe Hwanjin Date: 2003-08-07 12:02:24 +0900 gettext 문서 추가 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@65 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 A ABOUT-NLS commit 614f0b17e6f249659656182d911f9356bc4b3e3c Author: Choe Hwanjin Date: 2003-08-06 18:16:09 +0900 g_malloc, g_free 대신 nabi_malloc, nabi_free 사용 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@62 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ic.c commit 25189a0630fe72e1c322ea864c6bd1b4bda259bd Author: Choe Hwanjin Date: 2003-08-06 16:39:56 +0900 한영 전환 버그 수정(NumLock on 일때 한영 전환 안되는) git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@61 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/server.c commit 0545fb0a12c5c71a8744a0d82904eb1415f23d03 Author: Choe Hwanjin Date: 2003-08-06 14:37:50 +0900 메모리 관리 코드 수정 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@60 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ic.c commit 4f211b45132ab03d61fda0b8f9006fe667b45f2c Author: Choe Hwanjin Date: 2003-08-06 12:47:10 +0900 malloc.h 대신 stdlib.h 사용 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@59 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog commit 53e5c03c180ad9ec7ce0e58d9ff3629c8da5666f Author: Choe Hwanjin Date: 2003-08-06 11:57:33 +0900 해제 해서는 안되는 메모리 해제 루틴 제거 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@58 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ui.c commit df20137a812be8f1f15743de821129ddf2e26fa3 Author: Choe Hwanjin Date: 2003-08-06 11:47:35 +0900 X 의 에러 처리 함수 등록 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@57 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/main.c commit 5042bba5a1c12a54fc0d60ebc84262237681c8e5 Author: Choe Hwanjin Date: 2003-08-06 11:47:20 +0900 nabi_app_free 부분에서 빠진 곳 추가 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@56 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ui.c commit bd6b23de5c3980ab0d373cc970fe4d569e754a69 Author: Choe Hwanjin Date: 2003-08-06 09:25:38 +0900 CapsLock, NumLock 문제 해결 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@55 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog commit db7e83e9926e6d64c122beedf2b89cc95cf51a75 Author: Choe Hwanjin Date: 2003-08-06 09:22:48 +0900 Num Lock, Caps Lock 경우에 처리하지 못하는 버그 수정 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@54 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/handler.c commit dd9e878860c3f33200846b181c071e627f87ce1d Author: Choe Hwanjin Date: 2003-08-05 18:22:17 +0900 CVS 디렉토리를 배포하지 않음 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@53 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M IMdkit/Makefile.am commit b1d2062e28df88a35371bd7e80f099bb4ad84a81 Author: Choe Hwanjin Date: 2003-08-05 18:21:21 +0900 파일 릴리즈를 위해서 간단한 문서 작성 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@52 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M ChangeLog M README commit 12bcd29b2b22da0899e519b3fbf3e9382b9bd1bb Author: Choe Hwanjin Date: 2003-08-05 18:19:28 +0900 malloc.h대신 stdlib.h를 사용함 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@51 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M configure.in commit 7f3fa749c981623835b9fc8081be30851e9cee8c Author: Choe Hwanjin Date: 2003-08-05 18:18:30 +0900 malloc.h 대신 stdlib.h 로 바꿈 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@50 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M IMdkit/IMConn.c commit ea53c4bc8098cee0a15d407bedc0832f6210c306 Author: Choe Hwanjin Date: 2003-08-05 18:16:19 +0900 다음 버젼 준비 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@49 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M configure.in commit 0e08f1d95221269425ce3a654a9b67007b64bf0a Author: Choe Hwanjin Date: 2003-08-05 14:47:21 +0900 번역 업데이트 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@48 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M po/ko.po commit e5069ad5b74ef85efd0eecac3045f86a8203dd6c Author: Choe Hwanjin Date: 2003-08-05 14:43:48 +0900 라이센스 스트링 추가 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@47 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/automata.c M src/handler.c M src/hangul.c M src/hangul.h M src/ic.c M src/ic.h M src/main.c M src/nabi.h M src/server.c M src/server.h M src/ui.c commit e6d47406acc91a56942b5c4a6e9b30dc61f7604a Author: Choe Hwanjin Date: 2003-08-05 14:07:39 +0900 기본 이미지 파일 추가 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@46 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M Makefile.am A nabi.png commit 542c8a6cac7f0017751763d97251e14097b92d21 Author: Choe Hwanjin Date: 2003-08-05 14:07:17 +0900 버젼 0.1 로 수정, 시스템 체크를 추가 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@45 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M configure.in commit 9ff8535979845aa036541a0adf0860ebc1a604de Author: Choe Hwanjin Date: 2003-08-05 11:17:48 +0900 쓸데 없는 파일 목록 추가 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@44 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M .cvsignore commit 38c7654472f72c51684d8faeb424d9ded59d132e Author: Choe Hwanjin Date: 2003-08-05 11:15:38 +0900 LOCALEDIR 설정을 config.h 에서 Makefile로 옮김 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@43 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M configure.in commit a82f8480800582db072640ca22ff78f31603ef1e Author: Choe Hwanjin Date: 2003-08-05 11:14:42 +0900 세벌식 자판 파일 추가 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@42 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M tables/Makefile.am M tables/keyboard/2qwerty A tables/keyboard/32qwerty A tables/keyboard/39qwerty A tables/keyboard/3fqwerty commit 4092a30d9fe429ff2a72b20cca784176caec8096 Author: Choe Hwanjin Date: 2003-08-05 11:13:09 +0900 cvsignore 리스트 추가 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@41 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 A themes/.cvsignore A themes/KingSejong/.cvsignore A themes/MSWindows/.cvsignore A themes/Mac/.cvsignore A themes/Onion/.cvsignore A themes/SimplyRed/.cvsignore A themes/keyboard/.cvsignore commit 79e6c714661507d154e658400e88dfff963ad97b Author: Choe Hwanjin Date: 2003-08-05 11:11:29 +0900 gettext: textdomain설정 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@40 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/main.c commit 02311480bdcac3b75695356563aafd7ce910f7f0 Author: Choe Hwanjin Date: 2003-08-05 11:10:53 +0900 LOCALEDIR 설정을 config.h 에서 Makefile.am으로 옮김 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@39 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/Makefile.am commit c11976d0c721d361afc4898096919c6ae1e7662e Author: Choe Hwanjin Date: 2003-08-05 11:10:11 +0900 디버그 메세지 제거 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@38 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/handler.c commit 6df20b7e990780c8fd7ce58c96c9cc9550d8f6aa Author: Choe Hwanjin Date: 2003-08-05 11:09:48 +0900 about 메뉴 구현 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@37 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ui.c commit 3d143123be1cea39d72f058470bd082d123b42f3 Author: Choe Hwanjin Date: 2003-08-04 18:06:33 +0900 메뉴 모양 수정, 메뉴와 설정 값을 서로 sync git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@36 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ui.c commit 36e59f622e8f4a9837b371689f702825a403356a Author: Choe Hwanjin Date: 2003-08-04 17:57:43 +0900 번역 업데이트 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@35 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M po/ko.po commit 0c58fb7d451457d2a18a74096d6fdec39ac25128 Author: Choe Hwanjin Date: 2003-08-04 17:55:21 +0900 pref 메뉴 스트링 수정 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@34 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ui.c commit 4fdea442ecb8917cf0e82d2e457c8aea97fe04d1 Author: Choe Hwanjin Date: 2003-08-04 17:42:13 +0900 번역 업데이트 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@33 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M po/ko.po commit 3a1799a2144254cfebb3eee5c53a2ecba6fc990b Author: Choe Hwanjin Date: 2003-08-04 17:38:34 +0900 pref 메뉴 추가, 탭크기 조정 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@32 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ui.c commit 5eed1ff20b5332494ea2ee9c8f0a62635c9d73c4 Author: Choe Hwanjin Date: 2003-08-04 17:16:54 +0900 키보드 로딩과 메뉴 선택 구현 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@31 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/Makefile.am A src/keyboard.h M src/nabi.h M src/server.c M src/server.h M src/ui.c commit 5bd70c31dc295aafeee9a36d0728d2f11afeb0c4 Author: Choe Hwanjin Date: 2003-08-01 18:16:57 +0900 키보드 맵 로딩 부분 작성중 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@30 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/nabi.h M src/server.c M src/server.h M src/ui.c commit 9fc342a362ee8725dc867d52b79283a45901304a Author: Choe Hwanjin Date: 2003-08-01 16:38:04 +0900 안쓰는 변수 삭제 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@29 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/server.c commit bfe9a9b4131cf851c7c656ab19e9f15e6b454f05 Author: Choe Hwanjin Date: 2003-08-01 16:37:33 +0900 빠진 함수 nabi_ic_commit_unicode 선언 추가 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@28 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ic.h commit 3b5ff43a8c7a87397cfda2604a3087441f4a30db Author: Choe Hwanjin Date: 2003-08-01 16:37:08 +0900 디버그 메세지 프린트 제거 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@27 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ic.c commit ddd970ed0b60302b38791cbb40edd7ed3802c97a Author: Choe Hwanjin Date: 2003-08-01 16:36:29 +0900 compose 관련 버그 수정 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@26 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/automata.c commit dcc7013b0cdf86da702e86b3dc203bb17fc61b87 Author: Choe Hwanjin Date: 2003-08-01 10:44:38 +0900 테마 기능 완성 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@25 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/Makefile.am M src/ui.c commit 7276766d39ffeef887c1d4b2264e2952c53f0037 Author: Choe Hwanjin Date: 2003-08-01 09:34:04 +0900 테마 설정 창 추가 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@24 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ui.c commit b79ce2d6106d0ef8b333a7e8d4960cbb3da4c7ba Author: Choe Hwanjin Date: 2003-07-31 14:08:49 +0900 메뉴 업데이트 작업중 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@23 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ui.c commit 6503aa5570c733ffb0d0fe107400a27415ea691c Author: Choe Hwanjin Date: 2003-07-30 15:42:50 +0900 po 디렉토리 컴파일 순서를 맨 뒤로 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@22 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M Makefile.am commit c81193b3f0dbbba12f0939bb9f6c3ff936903f70 Author: Choe Hwanjin Date: 2003-07-30 15:42:13 +0900 키보드 테이블과 컴포즈 테이블 추가 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@21 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 A tables/Makefile.am A tables/compose/default A tables/keyboard/2qwerty commit 513039d9ca35d170afd40e309ac86a99be00d5b2 Author: Choe Hwanjin Date: 2003-07-30 14:52:00 +0900 default-icons.h 추가 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@20 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/Makefile.am commit c5a7b61d8524008609f0cee08e5a152db906edfd Author: Choe Hwanjin Date: 2003-07-30 14:39:46 +0900 테마 디렉토리별로 Makefile.am을 따로 만들어 버림 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@19 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M configure.in A themes/KingSejong/Makefile.am A themes/MSWindows/Makefile.am A themes/Mac/Makefile.am M themes/Makefile.am A themes/Onion/Makefile.am A themes/SimplyRed/Makefile.am A themes/keyboard/Makefile.am commit a9774716a1c8674b50f741699bec8d815a27fb87 Author: Choe Hwanjin Date: 2003-07-30 13:57:50 +0900 for gettextize git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@18 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 A config.rpath commit d2ff9df96b842ae19c0df34007727a736f9281da Author: Choe Hwanjin Date: 2003-07-29 17:24:07 +0900 기본 아이콘 크기 24로 수정 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@17 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ui.c commit afe9a87b4eebe02b8e519517ef37a3fbee11d55d Author: Choe Hwanjin Date: 2003-07-29 17:04:24 +0900 기본 테마 아이콘 추가 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@16 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 A src/default-icons.h commit 953f5d95d3af4a4a1f2adaf05e74e563f7b81485 Author: Choe Hwanjin Date: 2003-07-29 17:01:58 +0900 테마 기능 지원 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@15 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M Makefile.am M configure.in A themes/KingSejong/README A themes/KingSejong/english.png A themes/KingSejong/hangul.png A themes/KingSejong/none.png A themes/MSWindows/english.png A themes/MSWindows/hangul.png A themes/MSWindows/none.png A themes/Mac/README A themes/Mac/english.png A themes/Mac/hangul.png A themes/Mac/none.png A themes/Makefile.am A themes/Onion/README A themes/Onion/english.png A themes/Onion/hangul.png A themes/Onion/none.png A themes/SimplyRed/english.png A themes/SimplyRed/hangul.png A themes/SimplyRed/none.png A themes/keyboard/README A themes/keyboard/english.png A themes/keyboard/hangul.png A themes/keyboard/none.png commit fbad99f4369c48b984807cc08c6ef4b416932eac Author: Choe Hwanjin Date: 2003-07-29 16:47:16 +0900 한/영 모드 정보 기능 지원 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@14 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/handler.c M src/ic.c M src/nabi.h M src/server.c M src/server.h commit 64491106f1c0c1ff5754d11c3b61e6608a0ff3e0 Author: Choe Hwanjin Date: 2003-07-29 16:47:00 +0900 테마지원, 한/영 모드 정보 기능 지원 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@13 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/ui.c commit f2a85b6050766d24093691c5fe2a50942d3131e6 Author: Choe Hwanjin Date: 2003-07-29 16:46:09 +0900 테마 지원 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@12 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/Makefile.am commit 550a010ece8d4e25f24457e7b2243cbc1f104f76 Author: Choe Hwanjin Date: 2003-07-29 11:09:39 +0900 X 환경과 관련된 GDK 매크로를 올바른 것으로 수정 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@11 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/main.c commit 0c2410a14c3d704d684642b586ff838782e0f0f9 Author: Choe Hwanjin Date: 2003-07-29 10:22:03 +0900 gtk_widget_realize를 강제 실행하는 대신 콜백으로 처리함 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@10 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M src/main.c commit d0d2d89f8a75dda9ebe189c4934641aceda69b6f Author: Choe Hwanjin Date: 2003-07-28 21:49:31 +0900 gettextize git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@9 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 A src/gettext.h commit e6a10ea8993af1a255e39add61ace01375ac0a62 Author: Choe Hwanjin Date: 2003-07-28 21:48:44 +0900 po 디렉토리 업데이트 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@8 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M po/ChangeLog M po/POTFILES.in commit 915e79bcc283d7a0816e9beb41df3241e9832e47 Author: Choe Hwanjin Date: 2003-07-28 21:39:28 +0900 ����������� git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@7 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 D m4/Makefile D m4/Makefile.in commit bfc301dd78917743bf75011ff38b4ff725fa6433 Author: Choe Hwanjin Date: 2003-07-28 21:37:37 +0900 gettextize git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@6 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M Makefile.am M configure.in A m4/ChangeLog A m4/Makefile A m4/Makefile.am A m4/Makefile.in A m4/codeset.m4 A m4/gettext.m4 A m4/glibc21.m4 A m4/iconv.m4 A m4/intdiv0.m4 A m4/inttypes-pri.m4 A m4/inttypes.m4 A m4/inttypes_h.m4 A m4/isc-posix.m4 A m4/lcmessage.m4 A m4/lib-ld.m4 A m4/lib-link.m4 A m4/lib-prefix.m4 A m4/nls.m4 A m4/po.m4 A m4/progtest.m4 A m4/stdint_h.m4 A m4/uintmax_t.m4 A m4/ulonglong.m4 A po/LINGUAS A po/Makefile.in.in A po/Makevars A po/Rules-quot A po/boldquot.sed A po/en@boldquot.header A po/en@quot.header A po/insert-header.sin A po/quot.sed A po/remove-potcdate.sed A po/remove-potcdate.sin M src/Makefile.am M src/ic.c M src/main.c D src/nls.h M src/ui.c commit 3f96a89967101aa1fb9a313181b18750bd2296fe Author: Choe Hwanjin Date: 2003-07-28 21:33:48 +0900 저자 주소 git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@5 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 M AUTHORS commit 8b65509dcb4fe91c183195b92b695571526cfe13 Author: Choe Hwanjin Date: 2003-07-28 16:00:15 +0900 Initial revision git-svn-id: http://kldp.net/svn/nabi/trunk/nabi@2 3598d0bf-7bfb-0310-a9b8-e6047f1a0475 A .cvsignore A AUTHORS A COPYING A ChangeLog A IMdkit/FrameMgr.c A IMdkit/FrameMgr.h A IMdkit/IMConn.c A IMdkit/IMMethod.c A IMdkit/IMValues.c A IMdkit/IMdkit.h A IMdkit/Makefile.am A IMdkit/Xi18n.h A IMdkit/Xi18nX.h A IMdkit/XimFunc.h A IMdkit/XimProto.h A IMdkit/doc/API.text A IMdkit/doc/CHANGELOG A IMdkit/doc/README A IMdkit/doc/Xi18n_sample/IC.c A IMdkit/doc/Xi18n_sample/IC.h A IMdkit/doc/Xi18n_sample/Imakefile A IMdkit/doc/Xi18n_sample/Makefile.pu A IMdkit/doc/Xi18n_sample/README A IMdkit/doc/Xi18n_sample/sampleIM.c A IMdkit/i18nAttr.c A IMdkit/i18nClbk.c A IMdkit/i18nIMProto.c A IMdkit/i18nIc.c A IMdkit/i18nMethod.c A IMdkit/i18nPtHdr.c A IMdkit/i18nUtil.c A IMdkit/i18nX.c A Makefile.am A NEWS A README A configure.in A po/ChangeLog A po/POTFILES.in A po/ko.po A src/.cvsignore A src/Makefile.am A src/automata.c A src/eggtrayicon.c A src/eggtrayicon.h A src/handler.c A src/hangul.c A src/hangul.h A src/ic.c A src/ic.h A src/main.c A src/nabi.h A src/nls.h A src/server.c A src/server.h A src/ucs2ksc.h A src/ui.c nabi-1.0.0/INSTALL0000644000175000017500000003633211655153450010407 00000000000000Installation Instructions ************************* Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. This file is offered as-is, without warranty of any kind. Basic Installation ================== Briefly, the shell commands `./configure; make; make install' should configure, build, and install this package. The following more-detailed instructions are generic; see the `README' file for instructions specific to this package. Some packages provide this `INSTALL' file but do not implement all of the features documented below. The lack of an optional feature in a given package is not necessarily a bug. More recommendations for GNU packages can be found in *note Makefile Conventions: (standards)Makefile Conventions. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that you can run in the future to recreate the current configuration, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). It can also use an optional file (typically called `config.cache' and enabled with `--cache-file=config.cache' or simply `-C') that saves the results of its tests to speed up reconfiguring. Caching is disabled by default to prevent problems with accidental use of stale cache files. If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can be considered for the next release. If you are using the cache, and at some point `config.cache' contains results you don't want to keep, you may remove or edit it. The file `configure.ac' (or `configure.in') is used to create `configure' by a program called `autoconf'. You need `configure.ac' if you want to change it or regenerate `configure' using a newer version of `autoconf'. The simplest way to compile this package is: 1. `cd' to the directory containing the package's source code and type `./configure' to configure the package for your system. Running `configure' might take a while. While running, it prints some messages telling which features it is checking for. 2. Type `make' to compile the package. 3. Optionally, type `make check' to run any self-tests that come with the package, generally using the just-built uninstalled binaries. 4. Type `make install' to install the programs and any data files and documentation. When installing into a prefix owned by root, it is recommended that the package be configured and built as a regular user, and only the `make install' phase executed with root privileges. 5. Optionally, type `make installcheck' to repeat any self-tests, but this time using the binaries in their final installed location. This target does not install anything. Running this target as a regular user, particularly if the prior `make install' required root privileges, verifies that the installation completed correctly. 6. You can remove the program binaries and object files from the source code directory by typing `make clean'. To also remove the files that `configure' created (so you can compile the package for a different kind of computer), type `make distclean'. There is also a `make maintainer-clean' target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. 7. Often, you can also type `make uninstall' to remove the installed files again. In practice, not all packages have tested that uninstallation works correctly, even though it is required by the GNU Coding Standards. 8. Some packages, particularly those that use Automake, provide `make distcheck', which can by used by developers to test that all other targets like `make install' and `make uninstall' work correctly. This target is generally not run by end users. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the `configure' script does not know about. Run `./configure --help' for details on some of the pertinent environment variables. You can give `configure' initial values for configuration parameters by setting variables in the command line or in the environment. Here is an example: ./configure CC=c99 CFLAGS=-g LIBS=-lposix *Note Defining Variables::, for more details. Compiling For Multiple Architectures ==================================== You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you can use GNU `make'. `cd' to the directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. This is known as a "VPATH" build. With a non-GNU `make', it is safer to compile the package for one architecture at a time in the source code directory. After you have installed the package for one architecture, use `make distclean' before reconfiguring for another architecture. On MacOS X 10.5 and later systems, you can create libraries and executables that work on multiple system types--known as "fat" or "universal" binaries--by specifying multiple `-arch' options to the compiler but only a single `-arch' option to the preprocessor. Like this: ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ CPP="gcc -E" CXXCPP="g++ -E" This is not guaranteed to produce working output in all cases, you may have to build one architecture at a time and combine the results using the `lipo' tool if you have problems. Installation Names ================== By default, `make install' installs the package's commands under `/usr/local/bin', include files under `/usr/local/include', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PREFIX', where PREFIX must be an absolute file name. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you pass the option `--exec-prefix=PREFIX' to `configure', the package uses PREFIX as the prefix for installing programs and libraries. Documentation and other data files still use the regular prefix. In addition, if you use an unusual directory layout you can give options like `--bindir=DIR' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. In general, the default for these options is expressed in terms of `${prefix}', so that specifying just `--prefix' will affect all of the other directory specifications that were not explicitly provided. The most portable way to affect installation locations is to pass the correct locations to `configure'; however, many packages provide one or both of the following shortcuts of passing variable assignments to the `make install' command line to change installation locations without having to reconfigure or recompile. The first method involves providing an override variable for each affected directory. For example, `make install prefix=/alternate/directory' will choose an alternate location for all directory configuration variables that were expressed in terms of `${prefix}'. Any directories that were specified during `configure', but not in terms of `${prefix}', must each be overridden at install time for the entire installation to be relocated. The approach of makefile variable overrides for each directory variable is required by the GNU Coding Standards, and ideally causes no recompilation. However, some platforms have known limitations with the semantics of shared libraries that end up requiring recompilation when using this method, particularly noticeable in packages that use GNU Libtool. The second method involves providing the `DESTDIR' variable. For example, `make install DESTDIR=/alternate/directory' will prepend `/alternate/directory' before all installation names. The approach of `DESTDIR' overrides is not required by the GNU Coding Standards, and does not work on platforms that have drive letters. On the other hand, it does better at avoiding recompilation issues, and works well even when some directory options were not specified in terms of `${prefix}' at `configure' time. Optional Features ================= If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving `configure' the option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The `README' should mention any `--enable-' and `--with-' options that the package recognizes. For packages that use the X Window System, `configure' can usually find the X include and library files automatically, but if it doesn't, you can use the `configure' options `--x-includes=DIR' and `--x-libraries=DIR' to specify their locations. Some packages offer the ability to configure how verbose the execution of `make' will be. For these packages, running `./configure --enable-silent-rules' sets the default to minimal output, which can be overridden with `make V=1'; while running `./configure --disable-silent-rules' sets the default to verbose, which can be overridden with `make V=0'. Particular systems ================== On HP-UX, the default C compiler is not ANSI C compatible. If GNU CC is not installed, it is recommended to use the following options in order to use an ANSI C compiler: ./configure CC="cc -Ae -D_XOPEN_SOURCE=500" and if that doesn't work, install pre-built binaries of GCC for HP-UX. On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot parse its `' header file. The option `-nodtk' can be used as a workaround. If GNU CC is not installed, it is therefore recommended to try ./configure CC="cc" and if that doesn't work, try ./configure CC="cc -nodtk" On Solaris, don't put `/usr/ucb' early in your `PATH'. This directory contains several dysfunctional programs; working variants of these programs are available in `/usr/bin'. So, if you need `/usr/ucb' in your `PATH', put it _after_ `/usr/bin'. On Haiku, software installed for all users goes in `/boot/common', not `/usr/local'. It is recommended to use the following options: ./configure --prefix=/boot/common Specifying the System Type ========================== There may be some features `configure' cannot figure out automatically, but needs to determine by the type of machine the package will run on. Usually, assuming the package is built to be run on the _same_ architectures, `configure' can figure that out, but if it prints a message saying it cannot guess the machine type, give it the `--build=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name which has the form: CPU-COMPANY-SYSTEM where SYSTEM can have one of these forms: OS KERNEL-OS See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't need to know the machine type. If you are _building_ compiler tools for cross-compiling, you should use the option `--target=TYPE' to select the type of system they will produce code for. If you want to _use_ a cross compiler, that generates code for a platform different from the build platform, you should specify the "host" platform (i.e., that on which the generated programs will eventually be run) with `--host=TYPE'. Sharing Defaults ================ If you want to set default values for `configure' scripts to share, you can create a site shell script called `config.site' that gives default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. Defining Variables ================== Variables not defined in a site shell script can be set in the environment passed to `configure'. However, some packages may run configure again during the build, and the customized values of these variables may be lost. In order to avoid this problem, you should set them in the `configure' command line, using `VAR=value'. For example: ./configure CC=/usr/local2/bin/gcc causes the specified `gcc' to be used as the C compiler (unless it is overridden in the site shell script). Unfortunately, this technique does not work for `CONFIG_SHELL' due to an Autoconf bug. Until the bug is fixed you can use this workaround: CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash `configure' Invocation ====================== `configure' recognizes the following options to control how it operates. `--help' `-h' Print a summary of all of the options to `configure', and exit. `--help=short' `--help=recursive' Print a summary of the options unique to this package's `configure', and exit. The `short' variant lists options used only in the top level, while the `recursive' variant lists options also present in any nested packages. `--version' `-V' Print the version of Autoconf used to generate the `configure' script, and exit. `--cache-file=FILE' Enable the cache: use and save the results of the tests in FILE, traditionally `config.cache'. FILE defaults to `/dev/null' to disable caching. `--config-cache' `-C' Alias for `--cache-file=config.cache'. `--quiet' `--silent' `-q' Do not print messages saying which checks are being made. To suppress all normal output, redirect it to `/dev/null' (any error messages will still be shown). `--srcdir=DIR' Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. `--prefix=DIR' Use DIR as the installation prefix. *note Installation Names:: for more details, including other options available for fine-tuning the installation locations. `--no-create' `-n' Run the configure checks, but stop before creating any output files. `configure' also accepts some other, not widely useful, options. Run `configure --help' for more details. nabi-1.0.0/NEWS0000644000175000017500000001761212100712115010036 00000000000000나비 1.0.0 * 기호 입력 목록 업데이트 * 아이콘 테마 추가: malys * 쿼티 자판을 사용하지 않는 경우의 문제 수정 http://code.google.com/p/nabi/issues/detail?id=3 * 한자 선택 창의 크기를 제한 나비 0.99.11 * 드보락과 세벌식을 같이 쓸때 '/'가 'ㅁ'으로 입력되는 문제 수정 * 영문 자판과 시스템 키맵 사용 옵션에 대한 UI 개선 나비 0.99.10 * 오페라 브라우저에서 글자가 두번 입력되는 문제 (#316115) http://kldp.net/projects/nabi/issue/316115 * gtk 2.16 이하에서 컴파일 안되는 문제 수정 (#316453) http://kldp.net/projects/nabi/issue/316453 * 로마자 자판의 대소문자 처리 문제 수정 (libhangul 0.1.0 이상 필요) * 트레이 아이콘이 로딩되지 않으면 팔레트를 숨길수 없게 함 나비 0.99.9 * 버그 수정: #315977 firefox4 에서 backspace로 글자가 안지워지는 문제 * 버그 수정: #315744 wine 1.2에서 한글 상태에서 공백이 뒤에 입력 되는 문제 * GtkStatusIcon 사용 - 우분투 10.10에서 트레이 아이콘 배경이 희게 나오는 문제 수정 나비 0.99.8 * Ubuntu 테마 추가 * Colemak 관련 버그 수정 (#315056, #315058) * 동적 자판 목록 업데이트 (libhangul 0.0.12 이상) 두벌식 옛한글 지원(#315130), 안마태 자판 지원 * Over the spot 모드에서 지정된 fontset을 사용할 수 있도록 하는 옵션 추가 * 기본 동작을 system keymap을 무시하고 내장 keymap으로 작동 (qwerty가 아닌 자판을 기본 자판으로 설정했을때 문제 처리) * 빌드할때 테마를 지정할 수 있는 옵션 추가 * 코드 정리 나비 0.99.7 * 한자 전용 모드 구현 * 어플리케이션과 nabi의 locale이 달라도 UTF-8 이면 한글입력이 가능하도록 함 * X window에서 fontset을 생성할 수 없을때에도 preedit string을 그릴 수 있도록 함 (#315002) * Colemak 자판 지원 (http://kldp.net/projects/nabi/forum/309771) * 버그 수정 나비 0.99.6 * 버그수정: [#305368] 알림영역에 들어가지 않는 문제 최근 버젼의 배포판에서 자동으로 알림영역(Notification Area)에 들어가지 않던 문제를 해결 나비 0.99.5 * 로마자 자판 지원 (libhangul 0.0.10 필요) * pango 1.16 이하 버젼 지원 (Centos 5.3 지원) * 버그수정: [#305339] 나비 입력상태 설정 저장 리셋 버그 나비 0.99.4 * 설정창에 "초기값으로" 변경하는 버튼 추가 * 시작할때 한글 모드로 시작할 수 있는 옵션 추가 * tray icon을 사용하지 않을 수 있는 옵션 추가 * gvim에서 한글 상태에서 커맨드 모드에서 엔터치면 멈추는 문제 해결(#305259) * String conversion 기능 구현(그러나 아직 xlib수준에서 지원하지 않고 있음) * 내부 구현 개선, 버그 수정 나비 0.99.3 * 내부 코드 개선 * off the spot, root window에서 사용하는 입력 중인 글자 글꼴 설정 옵션 추가 * 한글 모드에서 한영 키가 작동하지 않는 문제 수정(#304811) * 자판 변경후 툴팁이 바뀌지 않는 문제 수정(#305100) 나비 0.99.2 * 독일어 번역 업데이트 (Thanks to Niklaus Giger) * 간체자 설정 기본값 버그 수정 (#304722) * 옛글 자판에서 한자 변환 버그 수정 (#304770) * 옛글 자판과 현재글 자판 변환할때 모드 변환 버그 수정(#304770) * 키보드 설정 관련 버그 수정 (#304700) * svg 아이콘을 먼저 사용하도록 함 * 몇가지 메모리 릭 수정 나비 0.99.1 * ic 관리 루틴 개선 * 사용하다가 갑자기 프로그램에 입력이 안되는 문제 해결(#300802,#300723) 참고: http://bugs.freedesktop.org/show_bug.cgi?id=7869 * 입력모드를 영어 상태로 바꾸는 키 설정 기능 추가(#304688) * 몇가지 코드 정리 나비 0.99.0 * 입력 상태 관리 기능을 개선 * 한자를 간체자로 입력하는 기능 추가 * 프랑스어 자판의 버그 수정(#304587) * 패널이 세로 방향으로 있을때 발생하는 버그 수정(#304681) * systray 프로그램이 갑작스럽게 죽는 경우 처리(#300760) 나비 0.19 * 라이센스 문제의 소지가 있는 테마 아이콘 제거(MSWindowS, MSWindowsXP, Mac) * 새로운 테마 추가(KingSejong2, Thanks to Stefan Krämer) * 자음으로 기호 입력하는 기능 구현 * 자잘한 버그 수정 나비 0.18 * 팔레트 모양 개선 * 한자 입력 포맷 지원 * 디버그 메시지 출력 개선 * 단일 한영 모드 옵션 추가 * X 종료시 설정 저장 나비 0.17 * 다이나믹 이벤트 처리 옵션 추가 * 단어 단위 입력 기능 추가 * 자동 순서 교정 옵션 추가 * over the spot에서 preedit string 그리는 루틴 개선 * 한영전환시 마지막 글자가 없어지는 문제 해결 * svg 아이콘을 로딩하지 못할때 발생하던 오류 수정 * EUC-KR 로켈에서 세벌식 기호 일부가 입력되지 않던 문제 해결 * 몇몇 자잘한 버그 수정 나비 0.16 * libhangul 적용 * 유럽어 자판 지원 기능 구현(프랑스, 독일어 자판) * 테스트 코드 추가 * 번역 추가 (독일어: Thanks to Niklaus Giger) 나비 0.15 * 순아래, 옛글자판 추가 * 아이콘 업데이트 (bluetux님 제공) * Tux 테마 추가 (exman님 제공) * 한영 전환, 한자 키 설정 기능 제공 나비 0.14 * 설정창 제공 * java 프로그램에서 한글 입력을 더 자연스럽게 수정 * 한자/심벌 입력리스트에서 갯수를 9개로 수정 * 지원하지 않는 locale의 경우 워닝 출력 * en_US.UTF-8 locale에서도 한글 입력 지원 나비 0.13 * 세션기능 지원 * 한자 입력시 뜻도 보여줌 * 메모리 릭 문제 등 자잘한 버그 수정 나비 0.12 * 트레이 아이콘이 사라지면서 죽는 버그 수정 * 트레이 아이콘 크기를 좀더 똑똑하게 처리함 * MS Windows 2000 테마 추가 * XIM 관련 버그 몇가지 수정 나비 0.11 * 메인 윈도우 제공 (시스템트레이를 제공하지 않는 곳에서도 설정가능) * 세벌식에서 조합중인 글자를 제대로 표현하지 못하던 문제 수정 * 상태정보만 보여주기 위한 -s (--status-only) 옵션 추가 * 나비를 종료하면 gtk2 app가 죽던 문제 수정 * 간단한 몇가지 버그 수정 나비 0.10 * 한자 입력 창 개선 * 심벌 문자 입력 기능 나비 0.9 * NetBSD, FreeBSD의 EUC-KR locale에서 한글 정상 입력 * Qt에서 한자 입력시 안보이던 문제 수정 나비 0.8 * Over the spot 개선 * EUC-KR charset을 좀더 정확히 구분 * About menu에서 키 입력에 대한 간단한 정보 제공 나비 0.7 * QT-3.1.2, 3.2.1 에서 한글 입력 됩니다. 대신 모질라에서 한글 입력할때 깜빡임이 좀 많아집니다. * F9 키도 한자 입력에 사용할 수 있습니다. 나비 0.6 * 세벌식 입력 버그 수정 * 한자 입력 기능 지원 * 세션 관리자 지원 나비 0.5 * 드보락 자판 지원 * system tray가 죽어도 종료하지 않음 나비 0.4 * 폰트셋 로딩 속도가 빨라짐 * 각 프로세스 별로 한영 상태를 따로 저장 * configure 할때에 기본 자판 설정이 가능해짐 나비 0.3 * Mozill3 flash player 에서 가끔 죽던 문제 해결 나비 0.2 - 종료시에 메모리 오류 수정 - NumLock이 켜졌을때 제대로 작동하지 않던 문제점 수정 - vi 사용자들을 위해서 Esc 키를 누른 경우 자동으로 영문 상태로 변환함 나비 0.1 imhangul_status_applet을 대신할수 있는 프로그램입니다. GNOME panel의 Notification Area(System Tray)에 들어가는 프로그램으로 아마도 KDE에서도 도킹이 가능할겁니다. gtk의 input module인 imhangul의 상태 정보를 보여줄수 있으며 XMODIFIER="@im=nabi" 라고 설정하면 한글 입력기로도 사용할수 있습니다. nabi-1.0.0/TODO0000644000175000017500000000003111655153252010031 00000000000000TODO ----- * 1.0 내기 nabi-1.0.0/compile0000755000175000017500000000727111655153447010742 00000000000000#! /bin/sh # Wrapper for compilers which do not understand `-c -o'. scriptversion=2009-10-06.20; # UTC # Copyright (C) 1999, 2000, 2003, 2004, 2005, 2009 Free Software # Foundation, Inc. # Written by Tom Tromey . # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . case $1 in '') echo "$0: No command. Try \`$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: compile [--help] [--version] PROGRAM [ARGS] Wrapper for compilers which do not understand `-c -o'. Remove `-o dest.o' from ARGS, run PROGRAM with the remaining arguments, and rename the output as expected. If you are trying to build a whole package this is not the right script to run: please start by reading the file `INSTALL'. Report bugs to . EOF exit $? ;; -v | --v*) echo "compile $scriptversion" exit $? ;; esac ofile= cfile= eat= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as `compile cc -o foo foo.c'. # So we strip `-o arg' only if arg is an object. eat=1 case $2 in *.o | *.obj) ofile=$2 ;; *) set x "$@" -o "$2" shift ;; esac ;; *.c) cfile=$1 set x "$@" "$1" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -z "$ofile" || test -z "$cfile"; then # If no `-o' option was seen then we might have been invoked from a # pattern rule where we don't need one. That is ok -- this is a # normal compilation that the losing compiler can handle. If no # `.c' file was seen then we are probably linking. That is also # ok. exec "$@" fi # Name of file we expect compiler to create. cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` # Create the lock directory. # Note: use `[/\\:.-]' here to ensure that we don't use the same name # that we are using for the .o file. Also, base the name on the expected # object file name, since that is what matters with a parallel build. lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d while true; do if mkdir "$lockdir" >/dev/null 2>&1; then break fi sleep 1 done # FIXME: race condition here if user kills between mkdir and trap. trap "rmdir '$lockdir'; exit 1" 1 2 15 # Run the compile. "$@" ret=$? if test -f "$cofile"; then test "$cofile" = "$ofile" || mv "$cofile" "$ofile" elif test -f "${cofile}bj"; then test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" fi rmdir "$lockdir" exit $ret # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: nabi-1.0.0/config.rpath0000755000175000017500000003521711655153252011667 00000000000000#! /bin/sh # Output a system dependent set of variables, describing how to set the # run time search path of shared libraries in an executable. # # Copyright 1996-2003 Free Software Foundation, Inc. # Taken from GNU libtool, 2001 # Originally by Gordon Matzigkeit , 1996 # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # # The first argument passed to this file is the canonical host specification, # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # The environment variables CC, GCC, LDFLAGS, LD, with_gnu_ld # should be set by the caller. # # The set of defined variables is at the end of this script. # Known limitations: # - On IRIX 6.5 with CC="cc", the run time search patch must not be longer # than 256 bytes, otherwise the compiler driver will dump core. The only # known workaround is to choose shorter directory names for the build # directory and/or the installation directory. # All known linkers require a `.a' archive for static linking (except M$VC, # which needs '.lib'). libext=a shrext=.so host="$1" host_cpu=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` host_vendor=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` host_os=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` # Code taken from libtool.m4's AC_LIBTOOL_PROG_COMPILER_PIC. wl= if test "$GCC" = yes; then wl='-Wl,' else case "$host_os" in aix*) wl='-Wl,' ;; mingw* | pw32* | os2*) ;; hpux9* | hpux10* | hpux11*) wl='-Wl,' ;; irix5* | irix6* | nonstopux*) wl='-Wl,' ;; newsos6) ;; linux*) case $CC in icc|ecc) wl='-Wl,' ;; ccc) wl='-Wl,' ;; esac ;; osf3* | osf4* | osf5*) wl='-Wl,' ;; sco3.2v5*) ;; solaris*) wl='-Wl,' ;; sunos4*) wl='-Qoption ld ' ;; sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) wl='-Wl,' ;; sysv4*MP*) ;; uts4*) ;; esac fi # Code taken from libtool.m4's AC_LIBTOOL_PROG_LD_SHLIBS. hardcode_libdir_flag_spec= hardcode_libdir_separator= hardcode_direct=no hardcode_minus_L=no case "$host_os" in cygwin* | mingw* | pw32*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; openbsd*) with_gnu_ld=no ;; esac ld_shlibs=yes if test "$with_gnu_ld" = yes; then case "$host_os" in aix3* | aix4* | aix5*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs=no fi ;; amigaos*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes # Samuel A. Falvo II reports # that the semantics of dynamic libraries on AmigaOS, at least up # to version 4, is to share data among multiple programs linked # with the same dynamic library. Since this doesn't match the # behavior of shared libraries on other platforms, we can use # them. ld_shlibs=no ;; beos*) if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; cygwin* | mingw* | pw32*) # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec='-L$libdir' if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then : else ld_shlibs=no fi ;; netbsd*) ;; solaris* | sysv5*) if $LD -v 2>&1 | egrep 'BFD 2\.8' > /dev/null; then ld_shlibs=no elif $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; sunos4*) hardcode_direct=yes ;; *) if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; esac if test "$ld_shlibs" = yes; then # Unlike libtool, we use -rpath here, not --rpath, since the documented # option of GNU ld is called -rpath, not --rpath. hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' fi else case "$host_os" in aix3*) # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L=yes if test "$GCC" = yes; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct=unsupported fi ;; aix4* | aix5*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix5*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done esac fi hardcode_direct=yes hardcode_libdir_separator=':' if test "$GCC" = yes; then case $host_os in aix4.[012]|aix4.[012].*) collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && \ strings "$collect2name" | grep resolve_lib_name >/dev/null then # We have reworked collect2 hardcode_direct=yes else # We have old collect2 hardcode_direct=unsupported hardcode_minus_L=yes hardcode_libdir_flag_spec='-L$libdir' hardcode_libdir_separator= fi esac fi # Begin _LT_AC_SYS_LIBPATH_AIX. echo 'int main () { return 0; }' > conftest.c ${CC} ${LDFLAGS} conftest.c -o conftest aix_libpath=`dump -H conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` fi if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib" fi rm -f conftest.c conftest # End _LT_AC_SYS_LIBPATH_AIX. if test "$aix_use_runtimelinking" = yes; then hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' else hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" fi fi ;; amigaos*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes # see comment about different semantics on the GNU ld section ld_shlibs=no ;; bsdi4*) ;; cygwin* | mingw* | pw32*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec=' ' libext=lib ;; darwin* | rhapsody*) if $CC -v 2>&1 | grep 'Apple' >/dev/null ; then hardcode_direct=no fi ;; dgux*) hardcode_libdir_flag_spec='-L$libdir' ;; freebsd1*) ld_shlibs=no ;; freebsd2.2*) hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes ;; freebsd2*) hardcode_direct=yes hardcode_minus_L=yes ;; freebsd*) hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes ;; hpux9*) hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; hpux10* | hpux11*) if test "$with_gnu_ld" = no; then case "$host_cpu" in hppa*64*) hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=no ;; ia64*) hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=no # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; *) hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; netbsd*) hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes ;; newsos6) hardcode_direct=yes hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; openbsd*) hardcode_direct=yes if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then hardcode_libdir_flag_spec='${wl}-rpath,$libdir' else case "$host_os" in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) hardcode_libdir_flag_spec='-R$libdir' ;; *) hardcode_libdir_flag_spec='${wl}-rpath,$libdir' ;; esac fi ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; osf3*) hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; osf4* | osf5*) if test "$GCC" = yes; then hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' else # Both cc and cxx compiler support -rpath directly hardcode_libdir_flag_spec='-rpath $libdir' fi hardcode_libdir_separator=: ;; sco3.2v5*) ;; solaris*) hardcode_libdir_flag_spec='-R$libdir' ;; sunos4*) hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=yes hardcode_minus_L=yes ;; sysv4) case $host_vendor in sni) hardcode_direct=yes # is this really true??? ;; siemens) hardcode_direct=no ;; motorola) hardcode_direct=no #Motorola manual says yes, but my tests say they lie ;; esac ;; sysv4.3*) ;; sysv4*MP*) if test -d /usr/nec; then ld_shlibs=yes fi ;; sysv4.2uw2*) hardcode_direct=yes hardcode_minus_L=no ;; sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7*) ;; sysv5*) hardcode_libdir_flag_spec= ;; uts4*) hardcode_libdir_flag_spec='-L$libdir' ;; *) ld_shlibs=no ;; esac fi # Check dynamic linker characteristics # Code taken from libtool.m4's AC_LIBTOOL_SYS_DYNAMIC_LINKER. libname_spec='lib$name' case "$host_os" in aix3*) ;; aix4* | aix5*) ;; amigaos*) ;; beos*) ;; bsdi4*) ;; cygwin* | mingw* | pw32*) shrext=.dll ;; darwin* | rhapsody*) shrext=.dylib ;; dgux*) ;; freebsd1*) ;; freebsd*) ;; gnu*) ;; hpux9* | hpux10* | hpux11*) case "$host_cpu" in ia64*) shrext=.so ;; hppa*64*) shrext=.sl ;; *) shrext=.sl ;; esac ;; irix5* | irix6* | nonstopux*) case "$host_os" in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= ;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 ;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 ;; *) libsuff= shlibsuff= ;; esac ;; esac ;; linux*oldld* | linux*aout* | linux*coff*) ;; linux*) ;; netbsd*) ;; newsos6) ;; nto-qnx) ;; openbsd*) ;; os2*) libname_spec='$name' shrext=.dll ;; osf3* | osf4* | osf5*) ;; sco3.2v5*) ;; solaris*) ;; sunos4*) ;; sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) ;; sysv4*MP*) ;; uts4*) ;; esac sed_quote_subst='s/\(["`$\\]\)/\\\1/g' escaped_wl=`echo "X$wl" | sed -e 's/^X//' -e "$sed_quote_subst"` shlibext=`echo "$shrext" | sed -e 's,^\.,,'` escaped_hardcode_libdir_flag_spec=`echo "X$hardcode_libdir_flag_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` sed -e 's/^\([a-zA-Z0-9_]*\)=/acl_cv_\1=/' <. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . case $1 in '') echo "$0: No command. Try \`$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by `PROGRAMS ARGS'. object Object file output by `PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputing dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit $? ;; -v | --v*) echo "depcomp $scriptversion" exit $? ;; esac if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi cygpath_u="cygpath -u -f -" if test "$depmode" = msvcmsys; then # This is just like msvisualcpp but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u="sed s,\\\\\\\\,/,g" depmode=msvisualcpp fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. ## Unfortunately, FreeBSD c89 acceptance of flags depends upon ## the command line argument order; so add the flags where they ## appear in depend2.am. Note that the slowdown incurred here ## affects only configure: in makefiles, %FASTDEP% shortcuts this. for arg do case $arg in -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; *) set fnord "$@" "$arg" ;; esac shift # fnord shift # $arg done "$@" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz ## The second -e expression handles DOS-style file names with drive letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the `deleted header file' problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. tr ' ' ' ' < "$tmpdepfile" | ## Some versions of gcc put a space before the `:'. On the theory ## that the space means something, we add a space to the output as ## well. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like `#:fec' to the end of the # dependency line. tr ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ tr ' ' ' ' >> "$depfile" echo >> "$depfile" # The second pass generates a dummy entry for each header file. tr ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> "$depfile" else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts `$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then tmpdepfile1=$dir$base.u tmpdepfile2=$base.u tmpdepfile3=$dir.libs/$base.u "$@" -Wc,-M else tmpdepfile1=$dir$base.u tmpdepfile2=$dir$base.u tmpdepfile3=$dir$base.u "$@" -M fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then # Each line is of the form `foo.o: dependent.h'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" # That's a tab and a space in the []. sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; icc) # Intel's C compiler understands `-MD -MF file'. However on # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c # ICC 7.0 will fill foo.d with something like # foo.o: sub/foo.c # foo.o: sub/foo.h # which is wrong. We want: # sub/foo.o: sub/foo.c # sub/foo.o: sub/foo.h # sub/foo.c: # sub/foo.h: # ICC 7.1 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using \ : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form `foo.o: dependent.h', # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp2) # The "hp" stanza above does not work with aCC (C++) and HP's ia64 # compilers, which have integrated preprocessors. The correct option # to use with these is +Maked; it writes dependencies to a file named # 'foo.d', which lands next to the object file, wherever that # happens to be. # Much of this is similar to the tru64 case; see comments there. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then tmpdepfile1=$dir$base.d tmpdepfile2=$dir.libs/$base.d "$@" -Wc,+Maked else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d "$@" +Maked fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile" # Add `dependent.h:' lines. sed -ne '2,${ s/^ *// s/ \\*$// s/$/:/ p }' "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" "$tmpdepfile2" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in `foo.d' instead, so we check for that too. # Subdirectories are respected. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then # With Tru64 cc, shared objects can also be used to make a # static library. This mechanism is used in libtool 1.4 series to # handle both shared and static libraries in a single compilation. # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. # # With libtool 1.5 this exception was removed, and libtool now # generates 2 separate objects for the 2 libraries. These two # compilations output dependencies in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is # automatically cleaned when .libs/ is deleted, while ignoring # the former would cause a distcleancheck panic. tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4 tmpdepfile2=$dir$base.o.d # libtool 1.5 tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5 tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.o.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d tmpdepfile4=$dir$base.d "$@" -MD fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" # That's a tab and a space in the []. sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove `-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for `:' # in the target name. This is to cope with DOS-style filenames: # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise. "$@" $dashmflag | sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" tr ' ' ' ' < "$tmpdepfile" | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # X makedepend shift cleared=no eat=no for arg do case $cleared in no) set ""; shift cleared=yes ;; esac if test $eat = yes; then eat=no continue fi case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -arch) eat=yes ;; -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix=`echo "$object" | sed 's/^.*\././'` touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" sed '1,2d' "$tmpdepfile" | tr ' ' ' ' | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove `-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi IFS=" " for arg do case "$arg" in -o) shift ;; $object) shift ;; "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E 2>/dev/null | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" echo " " >> "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; msvcmsys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: nabi-1.0.0/install-sh0000755000175000017500000003253711655153447011373 00000000000000#!/bin/sh # install - install a program, script, or datafile scriptversion=2009-04-28.21; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. nl=' ' IFS=" "" $nl" # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit=${DOITPROG-} if test -z "$doit"; then doit_exec=exec else doit_exec=$doit fi # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_glob='?' initialize_posix_glob=' test "$posix_glob" != "?" || { if (set -f) 2>/dev/null; then posix_glob= else posix_glob=: fi } ' posix_mkdir= # Desired mode of installed file. mode=0755 chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false no_target_directory= usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve the last data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *' '* | *' '* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) dst_arg=$2 shift;; -T) no_target_directory=true;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call `install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then trap '(exit $?); exit' 1 2 13 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names starting with `-'. case $src in -*) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # Protect names starting with `-'. case $dst in -*) dst=./$dst;; esac # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test -n "$no_target_directory"; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else # Prefer dirname, but fall back on a substitute if dirname fails. dstdir=` (dirname "$dst") 2>/dev/null || expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$dst" : 'X\(//\)[^/]' \| \ X"$dst" : 'X\(//\)$' \| \ X"$dst" : 'X\(/\)' \| . 2>/dev/null || echo X"$dst" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q' ` test -d "$dstdir" dstdir_status=$? fi fi obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 if (umask $mkdir_umask && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writeable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. ls_ld_tmpdir=`ls -ld "$tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/d" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; -*) prefix='./';; *) prefix='';; esac eval "$initialize_posix_glob" oIFS=$IFS IFS=/ $posix_glob set -f set fnord $dstdir shift $posix_glob set +f IFS=$oIFS prefixes= for d do test -z "$d" && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && eval "$initialize_posix_glob" && $posix_glob set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && $posix_glob set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: nabi-1.0.0/missing0000755000175000017500000002623311655153450010754 00000000000000#! /bin/sh # Common stub for a few missing GNU programs while installing. scriptversion=2009-04-28.21; # UTC # Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006, # 2008, 2009 Free Software Foundation, Inc. # Originally by Fran,cois Pinard , 1996. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try \`$0 --help' for more information" exit 1 fi run=: sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p' sed_minuso='s/.* -o \([^ ]*\).*/\1/p' # In the cases where this matters, `missing' is being run in the # srcdir already. if test -f configure.ac; then configure_ac=configure.ac else configure_ac=configure.in fi msg="missing on your system" case $1 in --run) # Try to run requested program, and just exit if it succeeds. run= shift "$@" && exit 0 # Exit code 63 means version mismatch. This often happens # when the user try to use an ancient version of a tool on # a file that requires a minimum version. In this case we # we should proceed has if the program had been absent, or # if --run hadn't been passed. if test $? = 63; then run=: msg="probably too old" fi ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an error status if there is no known handling for PROGRAM. Options: -h, --help display this help and exit -v, --version output version information and exit --run try to run the given command, and emulate it if it fails Supported PROGRAM values: aclocal touch file \`aclocal.m4' autoconf touch file \`configure' autoheader touch file \`config.h.in' autom4te touch the output file, or create a stub one automake touch all \`Makefile.in' files bison create \`y.tab.[ch]', if possible, from existing .[ch] flex create \`lex.yy.c', if possible, from existing .c help2man touch the output file lex create \`lex.yy.c', if possible, from existing .c makeinfo touch the output file tar try tar, gnutar, gtar, then tar without non-portable flags yacc create \`y.tab.[ch]', if possible, from existing .[ch] Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and \`g' are ignored when checking the name. Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: Unknown \`$1' option" echo 1>&2 "Try \`$0 --help' for more information" exit 1 ;; esac # normalize program name to check for. program=`echo "$1" | sed ' s/^gnu-//; t s/^gnu//; t s/^g//; t'` # Now exit if we have it, but it failed. Also exit now if we # don't have it and --version was passed (most likely to detect # the program). This is about non-GNU programs, so use $1 not # $program. case $1 in lex*|yacc*) # Not GNU programs, they don't have --version. ;; tar*) if test -n "$run"; then echo 1>&2 "ERROR: \`tar' requires --run" exit 1 elif test "x$2" = "x--version" || test "x$2" = "x--help"; then exit 1 fi ;; *) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 elif test "x$2" = "x--version" || test "x$2" = "x--help"; then # Could not run --version or --help. This is probably someone # running `$TOOL --version' or `$TOOL --help' to check whether # $TOOL exists and not knowing $TOOL uses missing. exit 1 fi ;; esac # If it does not exist, or fails to run (possibly an outdated version), # try to emulate it. case $program in aclocal*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." touch aclocal.m4 ;; autoconf*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." touch configure ;; autoheader*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acconfig.h' or \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` test -z "$files" && files="config.h" touch_files= for f in $files; do case $f in *:*) touch_files="$touch_files "`echo "$f" | sed -e 's/^[^:]*://' -e 's/:.*//'`;; *) touch_files="$touch_files $f.in";; esac done touch $touch_files ;; automake*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." find . -type f -name Makefile.am -print | sed 's/\.am$/.in/' | while read f; do touch "$f"; done ;; autom4te*) echo 1>&2 "\ WARNING: \`$1' is needed, but is $msg. You might have modified some files without having the proper tools for further handling them. You can get \`$1' as part of \`Autoconf' from any GNU archive site." file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo "#! /bin/sh" echo "# Created by GNU Automake missing as a replacement of" echo "# $ $@" echo "exit 0" chmod +x $file exit 1 fi ;; bison*|yacc*) echo 1>&2 "\ WARNING: \`$1' $msg. You should only need it if you modified a \`.y' file. You may need the \`Bison' package in order for those modifications to take effect. You can get \`Bison' from any GNU archive site." rm -f y.tab.c y.tab.h if test $# -ne 1; then eval LASTARG="\${$#}" case $LASTARG in *.y) SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` if test -f "$SRCFILE"; then cp "$SRCFILE" y.tab.c fi SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` if test -f "$SRCFILE"; then cp "$SRCFILE" y.tab.h fi ;; esac fi if test ! -f y.tab.h; then echo >y.tab.h fi if test ! -f y.tab.c; then echo 'main() { return 0; }' >y.tab.c fi ;; lex*|flex*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.l' file. You may need the \`Flex' package in order for those modifications to take effect. You can get \`Flex' from any GNU archive site." rm -f lex.yy.c if test $# -ne 1; then eval LASTARG="\${$#}" case $LASTARG in *.l) SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` if test -f "$SRCFILE"; then cp "$SRCFILE" lex.yy.c fi ;; esac fi if test ! -f lex.yy.c; then echo 'main() { return 0; }' >lex.yy.c fi ;; help2man*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a dependency of a manual page. You may need the \`Help2man' package in order for those modifications to take effect. You can get \`Help2man' from any GNU archive site." file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo ".ab help2man is required to generate this page" exit $? fi ;; makeinfo*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.texi' or \`.texinfo' file, or any other file indirectly affecting the aspect of the manual. The spurious call might also be the consequence of using a buggy \`make' (AIX, DU, IRIX). You might want to install the \`Texinfo' package or the \`GNU make' package. Grab either from any GNU archive site." # The file to touch is that specified with -o ... file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -z "$file"; then # ... or it is the one specified with @setfilename ... infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` file=`sed -n ' /^@setfilename/{ s/.* \([^ ]*\) *$/\1/ p q }' $infile` # ... or it is derived from the source name (dir/f.texi becomes f.info) test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info fi # If the file does not exist, the user really needs makeinfo; # let's fail without touching anything. test -f $file || exit 1 touch $file ;; tar*) shift # We have already tried tar in the generic part. # Look for gnutar/gtar before invocation to avoid ugly error # messages. if (gnutar --version > /dev/null 2>&1); then gnutar "$@" && exit 0 fi if (gtar --version > /dev/null 2>&1); then gtar "$@" && exit 0 fi firstarg="$1" if shift; then case $firstarg in *o*) firstarg=`echo "$firstarg" | sed s/o//` tar "$firstarg" "$@" && exit 0 ;; esac case $firstarg in *h*) firstarg=`echo "$firstarg" | sed s/h//` tar "$firstarg" "$@" && exit 0 ;; esac fi echo 1>&2 "\ WARNING: I can't seem to be able to run \`tar' with the given arguments. You may want to install GNU tar or Free paxutils, or check the command line arguments." exit 1 ;; *) echo 1>&2 "\ WARNING: \`$1' is needed, and is $msg. You might have modified some files without having the proper tools for further handling them. Check the \`README' file, it often tells you about the needed prerequisites for installing this package. You may also peek at any GNU archive site, in case some other package would contain this missing \`$1' program." exit 1 ;; esac exit 0 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: nabi-1.0.0/mkinstalldirs0000755000175000017500000000672211655153444012167 00000000000000#! /bin/sh # mkinstalldirs --- make directory hierarchy scriptversion=2009-04-28.21; # UTC # Original author: Noah Friedman # Created: 1993-05-16 # Public domain. # # This file is maintained in Automake, please report # bugs to or send patches to # . nl=' ' IFS=" "" $nl" errstatus=0 dirmode= usage="\ Usage: mkinstalldirs [-h] [--help] [--version] [-m MODE] DIR ... Create each directory DIR (with mode MODE, if specified), including all leading file name components. Report bugs to ." # process command line arguments while test $# -gt 0 ; do case $1 in -h | --help | --h*) # -h for help echo "$usage" exit $? ;; -m) # -m PERM arg shift test $# -eq 0 && { echo "$usage" 1>&2; exit 1; } dirmode=$1 shift ;; --version) echo "$0 $scriptversion" exit $? ;; --) # stop option processing shift break ;; -*) # unknown option echo "$usage" 1>&2 exit 1 ;; *) # first non-opt arg break ;; esac done for file do if test -d "$file"; then shift else break fi done case $# in 0) exit 0 ;; esac # Solaris 8's mkdir -p isn't thread-safe. If you mkdir -p a/b and # mkdir -p a/c at the same time, both will detect that a is missing, # one will create a, then the other will try to create a and die with # a "File exists" error. This is a problem when calling mkinstalldirs # from a parallel make. We use --version in the probe to restrict # ourselves to GNU mkdir, which is thread-safe. case $dirmode in '') if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then echo "mkdir -p -- $*" exec mkdir -p -- "$@" else # On NextStep and OpenStep, the `mkdir' command does not # recognize any option. It will interpret all options as # directories to create, and then abort because `.' already # exists. test -d ./-p && rmdir ./-p test -d ./--version && rmdir ./--version fi ;; *) if mkdir -m "$dirmode" -p --version . >/dev/null 2>&1 && test ! -d ./--version; then echo "mkdir -m $dirmode -p -- $*" exec mkdir -m "$dirmode" -p -- "$@" else # Clean up after NextStep and OpenStep mkdir. for d in ./-m ./-p ./--version "./$dirmode"; do test -d $d && rmdir $d done fi ;; esac for file do case $file in /*) pathcomp=/ ;; *) pathcomp= ;; esac oIFS=$IFS IFS=/ set fnord $file shift IFS=$oIFS for d do test "x$d" = x && continue pathcomp=$pathcomp$d case $pathcomp in -*) pathcomp=./$pathcomp ;; esac if test ! -d "$pathcomp"; then echo "mkdir $pathcomp" mkdir "$pathcomp" || lasterr=$? if test ! -d "$pathcomp"; then errstatus=$lasterr else if test ! -z "$dirmode"; then echo "chmod $dirmode $pathcomp" lasterr= chmod "$dirmode" "$pathcomp" || lasterr=$? if test ! -z "$lasterr"; then errstatus=$lasterr fi fi fi fi pathcomp=$pathcomp/ done done exit $errstatus # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: nabi-1.0.0/nabi.png0000644000175000017500000002572611655153252011002 00000000000000PNG  IHDR>asBIT|dtEXtSoftwarewww.inkscape.org< IDATxwxU?}f2@T"(,VE *b[W]{Q, VTPAAW ػ@DJ fɄ P_"X9UloۊAF^Y%ZU^`mC桍x|o̾tMm𲠓Ddhi1fBD#旕] ;Y. s ꐳ]mO|gCQSKMb,eaU(DnKм11fWk? T\z+9D:_ڏZFvs PX CCTx>YV Kb$&/B*LC3]3Z> y)ETS,U̾*Fc%`!zz& s['hD-aںxt}FMj~g{r] w7'ԕz7}2~< ~@xK7@Yٲrn=%ӊNC[Цl#xI~p7vU>^y9Lf6c Ql"Lɓ`+AG"X"7槺4 sx53s \|1t=3"[t]uc?EEd [0\BٜBFEYJ@!BC ĵB+J>Q K}KX gNkJ>޷e, t%s2V-scf#]|g_(Fm3e5*4yD ZKif"7yK,ՙՉ؍!7i <':WrfsTи88;TW#gUuT76@-:bڎd 'z |}/֍! Mg+$bYwl٪:bܫ㛃ߊfaKR%~T]Pe L\Wx'WŽ֦w#7TsuԽ^5gQ4 !y$AH\e:@||G(Ƈ~9akқ qhq^8?t!<聓rޠ Q'ҧA(9o|$!zuU,6~ylJUS+FjtKi͆3xXPu?U Zu5.Fd{BkU[DE[kk! @6=RMxXP?Kᢜ  +yU@ro  H @lrJ'v"j]OVVXzukйl Pρ4N:2a*M  ɓUeR"oo9lܨse@\aAm"޹Tk>T`{m5A"|O~5f~`J|[MX{*z$5bMл,d* _<#",qP iSj=Yi5|Wr0P-skYDEJ1 U%ϫjI۸;wNJ[.5|nb,E2[ZױKY=$\ENB_VfP`'z+2۴UTk*To}Tup~#9ũUDbz'<$J3X*'AWs%h H>?KȠFwI)}-r/BڮL8 HCr hܪhv1x4m4T?Dy #>1A38 XUj{T"3L#<7) yS +pDFFj`(`JYnPJQX,(={5tЦд- P> aU}>v;v0~M6hĉ-W<*Ǫm*˞`ju KVη xSe'QEI4_|gOb vFc v瞅@uTtjb&hf&I||-]wuz}9:*y T s 56~`񍪞W5e m NF?|\TߊL5a2.&jt\>@IWIq7|cbVݱZKXu"m>BTunO)c&qOZ'U܋KNZ=BkvW`Ȼy!IW TSU7c_G?yvw)oB꠪j+tik|h4qNX: \v9AʵN~(r"Q(xq%%ƂYVk/9Et8dy\Vl,~ j`ޱ=!=7ېy2bbup:kG̋qaM4pi X@}$bST,~-̧GG垦OeY~D} SP̛_{4sIQ5>B?5 8 xFzQA>؞˰ (rҐ>ZV:*7, aMkj^ls`q0#! y) ;L'5`ú,_~ (T֔|@'s\5=U,&N$ sM_Wg x_@\ƞhYdiCG]'ac3@H9 8VtVt^Lj^GͿQ%#Rթ5E9_ȻOVM5UKj#LF j;)c\Fb ;|,\:KRQy66gr Mh$KuHl Avkxr R VٕzuMDdUy`V}P"ic8 jTshJiugY^ZP:@_ a.;{l!Bï9OL5`&uj_uu&vѓE(ATǪkJCOp9Q.o\/}) 1@`8CkLC#:ŶD)"b;(ȏMMoDcFPEBWkM @@\.`! ws|\~y㖎r0'n\Gd4=&WhAXph߮ A_+OOhF;ȗWwϏWGO g{{-}:'75 @1n5@T( IJ~㺴 "_ | e, rVv4-nc& }o]鑜^qO?i}w7YK:wQ}cvVJ j4SD5vS:i@6֜d& Bosrj!]ek܇=:lW,~n7>iQ:4x!hK}ʂٷNY8Ȳ]nvm^z8r o5p7J_fs oqh)Vk:+A;er:9eTt4<HԸ}hB|'5@.`rBMk&sšhѣ+Ik3@Dٮ0K42mt@gGWYc 6ڜ>,;=ck[o_yW'7~\ \ȓ:uva}jm2x87sGaMhA3.BUam٩ :`&i||u᝿leo~[qς?Y0Wk呻uٵk42Tiyyc|#^q/i,#|tpfx>؊`*В 0R5* po[';~n>9+ja]iw)]sN|gWbI;c$9WS.Q2.7_Up/KuIB+`6_L ֘)w53D-Kʪ)6Nؖ\Wǟ5Me>`ֽ^qw+:'O4WVE;ݒ?q]B s+xÚ7RÚ>m eR7xuaZcd v<%KX:?sWW`+dGby.דUا^l<`qH#Hq>z(ǻb:9q=y}swX̾ -~qdbY[ ѧ}nk:0qVL VqھycbRGp L i$8Z;w5dy@\{5Zuרة )-7JtlIǐ) Vmpi>O`台޳OŇn-xtU x}o{ 8)b,C݁4`8\e@ 8&rרE[^c.|t\ckY|Ӛػ$z5TfCk404٭CAih4ӡ&en >_f7賩fA;$,.0; cѣcaQQL#ꈝc:63<ׯXW~AWۤObq>h۰ 1Sߝ|JvN L} $#q`qbo˩| A{M|OȆS5d8[,W,x0)!(bj/s.ARK0mtn᎛1\LN#Lp)tbE/n KK4Gb6,_\vN[%Ŝv׽.i zvAu1 'ʚxis#eG @N=fysԅx<HšOFg2#3j$@c("u۞i+zcy0k'Af2%>5p?T2u:71^0 3Ewpة 4P;^M|[:JܘØ9"bUNۆg# ;Ԭcd|/"3X6_hj|'i1uL\@- ՁT$"y"r-CU/nC+qg~4Mvo깛};{Y}B=\YT*l(T』ITۮwJo "yػ]U7Zw19,cyѻѣ&?夜01܌[yPZ#\ Nvg勥EdGY`g8`WC)etՏ<}ɸԫg~؜DDrC usjARm_rZ ޒ#V;s)G86?_2MT!!=MR y~E_(=jgbjw=~7 [ moԅ-~;1r|ɿ.U9NڸqP$E1p"('z;4[}^q/& ~;{qH#{ <_,Яp t6?͟zio?_DTJM=\ӏ=7&kԀ wԅk=by r]H=D~S2B\b,jOҿMAs%ۍYRe{mP AҪR HYL\< /J},.k|y. ky`S̼Wnhd^g}ڗ ۻܻE'Hzf!_Ǐ[5)E"\;kbGsj{pG%1aF;d~UmRɅA4ܟ?`䭫~̒ #y4=ſ\;΀o2Ox;W7k8TW;k9Bq0҉k?c~zɄ LU?[DT+tؚI(H}b;G,$Ǿ҈%H*|bxS?j7 ~o>4ݢ}{d/%J_"XG> k",by;+^999"5FT;"E6 cFDNʜBd([g8id:ň?pQיVH^F)QHۏ|G*>͚&&u@ÞZ4@Uva-j9sV9[S)}P6޿9Mh(@-@V|'"'&]$ywKN>b ^w_O~E3)aÎM~_"ŶΥѫtCK^9,y@Ț2YĀv' ozƻiiiYBfNұjt FL4v,6t7n /Hr/P&?P$,"C"Qu&fBgn"J@4{ND$HFd%A@?S!V_dW>ǖ \Zjb)r73zeby]#42.uXJl<Њu$VHX,}%U ~XlCEDP ް孌9F7aBT>Ra3*ȰgB` եSI,Gr"!jЧ@.e ʦ2Z=+_mgx֟jO[IJ*vF1)#γߛ騳 W8;:#vLǫbn q7 /2d^ ϑ{ÐWo{@οx7bYkƇmy% + /-fM*XT5/2&VT["Z8xu2Hf1\ F,孄|`+M0G*RTS=e^?w޲NMZ"y ܙQ5 5#;^0pjA$.)B)O*)L#zЏ[6V%%M'a_͙|WTAO.&;m۷s(p_s9|BZw{ƀ:.ߠ_<}h_٢.߻)kd8gYy%b i/OtL_W5Iqq>uvS:P\DS%w`ݻ,n]Wئ:8qYѲ ӄ=r|E Wao$Hx֊+X l3b_,ߪpTPo4֠@rű.ܔ&>6l;쵹.QCPo/=Pd4;.|45^lZA"U5-wnGmISA ߳4, P=" h;m@@ݠDđjKx\ÇmGV_ D6&/].U>\VڶxTqN~@a&OkM6" ~հpI |: u f Ut'JX/aHfV6l*Ẓڬ>Y?g9dOUDĝk2v+YAIs:$@ZkVl c{ ڰتv=HSA ]AAV+@P/%6{yjiZDx]W`qp@<;9+!rU Eځr1 цG2@OvjW+@{ "74hoC&>f޷`Ida7Z#7w/0QľҺ@МhqhCˢU nöCp1+QY}IENDB`nabi-1.0.0/nabi.svg0000644000175000017500000005101211655153252011000 00000000000000 image/svg+xml nabi-1.0.0/nabi-about.png0000644000175000017500000005721611655153252012111 00000000000000PNG  IHDRjPbKGD pHYsaa?itIME u+ IDATx}wxUsffnv=!@IhR*M@YEP)*H:! f{v~d7LM6}<5W̙3>S ._&Рv]u:^sIKױi7A#N=%ݸᗐ_ӧ=ώ|Xθ.`G<˲1yޗa8.LÔq3fCR(3nZee0e$0  5]mڿecy_Qɱ\aU/J<@?; N?]bwRUyX^۵(6-?dXKX-~@TanvV,B(7+ ~MJ 1Q,-g7戒AsGUvia`׎?# ?Ǡ~<* l[ wD]A{YІ rYe}֬YvUdg^ :R[)7n$\.، Vd+*G!.*(1;H%yvmvf0aBO{cY귗/@_oq$?/_99q(JDGx@*cG;pۥZJJJ$"hI,o#ecЄOV!D;&=?dMUr*p;pۥB"##WUTs lMYlԓ3wMOF_~1((Hm:)*qv qZ/&IC>q@I'Y^YhNO3PN IKv;PۥIcjj$OL|& ٷ/4MmgN% !(,%h1Kv}0`5ݜ:x:(3**d\li~YjexB ׯ~jc-j縕so5 X{x(<NJ<Yo "HQZr~}h˗ {h;}'30u>^` #՗.]g3{ .pzpySVviVJJJ,˾ma$HR=⠊鹅+O>ɓ'O81+BAcUʺpPbԧOZEEwQ9cy! rܧK_Bs`L0@t(f ڳ~忕G\YIɫ Rا~V.WpBb&}wwc 35-*3r8+-%{+ZZE B(-wV9wtMf0F@i_ڒWȲ Q[=8dqUpXEM\k (<"|GK79^}9pw΀pY5m˄fs'w SkϺt^^xSNc?8]EQ@.jZ,)&WKcBpP+?Z)t,jlVkԫjypWVS;6iԮ]tzf 汼bpzFK55:<x|C`hZQg5,yum+gJNރ8W;y=Lzı{riq7bVW4dOB'Z;忆iw[g\ĥYKRUTWW=ztKT*jtAH&O~wFEE}Z2/¸o3 GEjt&$챹5Pf}#W2iqV}23̅I @{#AA.ՠC??e2"344t֟I41qѿ|7_wI\h;tq<WXTj*^[~ڠYm{d?vlldԢKNA6U1e usf=fJjR.B˱e__>yL_P*r{?wϺQݡt蔼~Wt%?n0Lgsn2عBor3;wŊtY3>~k׮u۫p=?/$H9'b͈ P.{`ݺuaRhƟ~TPP@2hT|bG 1 lAjݻ~vy?w<ò5Cu4o޼.zya~pmu:_\(iܸH0 HRYӽgk@Vmh :cNVn;Z7r :E'@_ιgGBBȖW'Y;AzSYebաm< @RFDEkCʍ.qwe9X,s%eNvjQZS~q?!>1~;H$Ymi]}׮YY?ð8>(wsh>r:p[e#HmvuuԩSÇX@*Veؖd<R?3f8&.7JtϫNllf.S3`XgJaa!#*f'Ư8iiKL\IQ:wS/<'ko; G]8ˁv-{а?d /D~zk>ZNRd-Ƽkw>m FFhwb ر{ɰȰ, N׶oc,Kʲ,}t>t:`}+rvSL u#DR@ RPZR"k̝O<1 q!z[Ǝaܰq/]8b 9 58Z٦M<*2SPP0p{}yڵk~^1h{㸞=z<E3\ F(*™s݅4>ʨ=1|0$vU1WG> <3T&|?Kppp7xcu^^ mf eg_$6ͿAz@j"wh*1}tQ{eyQNexPRz¢a?\Ng][7s#2*nw3:G - $qdy096V:vĊ)ZmZԆ[ct D"ܳ:*2aüy<ϷbhpE6 )//w_LgF RW(]dTwLۓO>y ))!**Ju֪ŋZ`󗀶qFO>RVAIF#aXJn޽իСC̯6;|۴oő'O`XQQѿV^ V-{@dC&Lxhmo{I.í 5Up>&>,Խ ͎)e%wcvneɴY,&1._Nb& Xf[jnmv` k=xUr}YWn73c,]iA+vn(T*8IJ crvɓ3f8Zh/2Y;]p%yc|+K}45P$IUnNv1r7<IoZ__ge%0L&!D4M.]bŋq+@nQF)ɐb\^P(:km6+5Ϝ9y/n0o瞽`'1r_8NsWr/H%/<<{ue%IW?heR#gs'k˪_t:>6 rO߮ҒK6tDv*!nG@bT9t[12N7\.p8VU]+,)..VW 0ݦNUL>?p`[PoP׮iƭz|K0ڢ 7,**++Z?0Z-9٧&)BVVzAB|Tr!=={={Խ⋆BQ]TT8hǺ\.D">ko9KrLԩ՚Z\vO_O9k[zwm)&,}㤑c;(\2JLdTmH.k.lv:dQ5=֗ghUåKwOᄡՑ!# DimY]ƨ5U#myiLZE^=Q1<׍k(mG$Bh\D{ ǻx>o=}eSډ)|&cᅀ &<ݬ۟ O>"˥Z@NKVV_$n8q,ciw1;Q(R.O*/˻vZk׮3Ty^qؑ4}}0ۜf0Z@%@Q$VIp Gb= C⣾w8fi{Ie* [dARXi`[>fnEF%tSll'  ²k.}+Ͻԛ9505g.,`@x"V8A Wa̫r:UWU*L"2 c!p9mIIcD13`?6?q _b… ?{VJ㓻%vt:t^4i;8@ BVnp8gkUWIt3/K2}fFXɈo-yU#m.\ !Sfy;PYYYItzǛ\YjaiF U/n0fkiKFţ6`!$Bc̒$Ir$b19 kWEVn'B $ϻۗL*,,Pںz} }c5ƸŹ `y3y!zp9&4"˫6dn^͉CG_(=Mҳ`=HEH&M$ũ[TTTxjb*atu.7M\)xw 49FԵ&1EX Wʱ)%%mZ}*ę#}823zV{" 1d{E__{+~֜|ӪS[g㏪ H2ރ6×+ڄ&ݨ?޶v٣3P(ϼd=xxHzR*'TIqqFw7]8 p}i*XzhGXJ AHL-8ZDLAEDSQ֊%̈́$IlV jYk;vr'Ƹip +*8NcYV ~&q'Jd<^7l3/\sjw=yFRx{rVX[fw}I~z` Jkl*gz톧֦]}ouΆ78t.?xM| Hђ{%$i=/;$0 ?{ejhh0`Yp)4hzqJ`[L&rⵃC{w%p3#p:Q N{1<#$0*٤td=@H 1_2˗s.6AkwKcbbAA<DJXĶOi3J}ĭ?t#tWrCFO=GoCpfOwތ4gF2Xlm-_ze/ OǨe#Y&; }cbM]nnnlhn'}z5o޶=h]u5I:-^bhWt[6>jWUR,m)L=&t1p}BM{f}C+P^^an%3e9D,NMN#4_XQJKK#0kSpOm<l3q $MAAAŅ]@^FHo=`0]k @k İ87N IDATM"τƠ43k5k_5ɋK*UuvE$pdc}{?89Ix&b Lc1Z"9Z)Ν]Ve2{yYh A@&M)۶ UhhSRxdD,(=̊h&C? E!Q$IϠ3H$F@IH 0ƄgB7@[mnݺh Q]RRZc=G-D"X, ^`{;fk%%Ap~(J1Le4ÀG;cID"Q .Z1y&Z1}o7P|a)AD6b&O0 Ai{Ów,g̝эôY#z;¯v_ɯNv ߿ޓ<8g=vdi =؉ϼܧ˗/r"k3/;&*bGvvJu<}]TM*h}3,0HIPx0Kh؋%gQ.L Ƭ&P]]D8iaƆ)DZ(39*r(D rj^ v 8MkjO4!ov'x_#s ɡ={L28鎙v1>K-M= Uܶ bv8:ccOg?=1]ӻ7~f)xaݺu!ǏaC\=wG}`5鉝R2vzgٌfw<G \.;/]-KJHyB0@%pBBYڝd'J6]Nƌc1B躥={ԔWpzaI"js0%4M#1BBB fX&`XmrO +moWK!n,Ǿu3Hvh5KI8?x丫3HbrNZr ҖjѡCw 0+W4fe-"N!פg=6gs3g/J8Sߙ3N̅F<=ੜ=Bߘ{?߼rZ>H= V+J.w|cJ.u8ޟ%4EQ˲|ʤo cN⒚[8!DVEpHD0 z>wt,`[T4ArN!4t:|fN_Xj)+ E^=4stU瞉qvvEMmeY&p_WkXZs1-G}`DlcbϞ=1}}v=0L>Ё>lU# iy䟿b7m8E*]ۯu5i}M1U]yW<{ad]ܙ+HdehmYHPPny!x/OC7~.:t(DR! P0ˢEzZV`vd2 h4rN>!HmiPhhW]]1N'm C[[[8@UUͨ40~skN+W俤2q iن(`<}ڐygϞþ ϼ ##wUmlqEXT!{e qU*UH$bB9ahO14'q!"z&;B,_7|XhQ*sssә VJ%y@o`D3w # SaÆtKإ߾\'i츐m){qCqa /%RϠAÇsIF1 SMz9%%=9 %;̆IZSW )- &r޽]d2YTEEEԩS;<-;;{͕+WpPD ߿ǽ{v6IR  ݒA@@6*bY%TT*b Y75-1,bXV[^/<-)Ja t-YےC~ͪ 3a ZvmFRRRSoXT?r\9o㒢6- $$@&Wç ~;u_]yyY_$WUU sT֨+/dK$Q0 طtLerMiNر#->>>8777GS?^둟"?no|$,Xjժ4M7|+rg?bYŴۭ8:!1[E!E<`2Wh %g96gQ N֘y,[o+uKZ{m3[ul} a߽7޻gϞ1955U{ Fe#Ƣ+cwHL˓njc/ "F؇XqV0rP\-~Mw޾}{'N 1cƌ7T*庺9YYY7}D_cX3b৽'IJ7!bQk$F#JLLPpXXؠaFOp AțX_[[W'ĂD"AAh&Pl-3 p+DqQyAKyXN^ZR2{y{P\o&l v{C%˖ef 3mq…|/xT$e{sJQ}VLGSݺTgXb<s[4pWk̫>Rn3FGGV\ٻ0ҥm6]?}T]]-:DSRUdSt Bˡ෢LN@>lEQH$aXJ$ ؈ս{Uo>RJ,DzLq!$$X,$0ju{KNIIqx9`04T<bɾشǦE<g7H\هHvA66qkA *0h&É5@9 y/vՌW6s}BBC^/ c *S$SYױS Bw$tzФy (62әh mVFdСASL]hQj}$<<|^^ާ@cmԸ&bVS:nܸĪJJ){rFfL7 @6-a8zcx6y6w4/J$5g?֨,Votc$IB޽Fc455 رfB}+5rOڴ%]'$;wgf츯 ~]ϾgFŜJ$(8ѣGfee.]ODpqq񺪪*m)tlKbhSLQ%9VaA_T`OL@e /wY[Q^D4ц.b_QhiP*˸"YF5WEEEQZ6<%cl2_;֟X,*@va3ݸgi`+^uPTTTEQ5,q\q%%%vNGl6f,;t: MԤW1ϫZ.ωֿW0${<zn w$$w9+,*+)P?/rhh(yQKlllh̭j#627Gj:6S%h$Iڬ"#n=YI2O{E׼뇹И'EpE**DVE+XB+K,1 FK^MT*QePL 8i|`YtiɣFWo*`I-E1n{|cV76ɫ-w[VDnr:SF `ο枈 Сp'<=lkUǙJ~|U d!a!:w\d;0s3y璾o&͑9G>l˚UeG5lrp5X`|Ȭs7)`cra{wJHd2yn**nV ρ=j1jB]^yǃVkލᴐ$ b$\!<8?_ױnVĀ>>^`u6;.s+169nzY>u; n}ɲʲeM_x`HfsN"^cƍ)SLFJvw a`?>Ӓ^<8x"Q;I yh XPEL&S=\O>nmGeel6Kr`pA&^&KGPFIy'j@1;,еmhawAp5$$$DZW[H펋;NH(!.,S^V0eIp (8fne9smTo%6=frjRrn\2 kb@I\xqfnV;ίL>61 BTΘG [+6[N[zn!fnjу)bjJ&Z[WWX_u mUܹsmĉi IRBVm (;2ck¸Qs;<)+(1Ŷ!Al "X1 HJ&@TΝUN0` %Hv%*`cd2ټc!jsmcǎu蔜w)WZԹÇ5 Ě{v~A;{0883g3\@*] sHԇ}#X;O^W._{֬=˖./-ZC~뜶=,>^ys uu1r 59968 ajBS&oŮ[>Vzקx?\/ ?BF"DpX3v;W߀ v RE!1[s}WWWeSO/b^K"gi>T Ӧl;9a eoB vMŤP#pryB43Cj4v1Lg/\Usb63aviݫW3u̘1!^xP]S[*w!`!F1^&$$N]5S:}U&Eb`4 62 lA<ϪZ,v[no7&%Vk&sOBJԩܟi-'njDA+iSNpS~f K!OT1I2,4|$4n[ɇGF~'tՅ0ՇN{-,,&sF >x}>BY6pi]9ׂZ - xߎo7AIIIr1 <^aD!B[\NX8M<ۅp;vܹLKK ɹԦԚ&[s}!D<7B{>XWW_#Tid&1x2px10v6,ՠmvS<<c W}'PbqBM+8)Iaq\muxIΞ1BL\|YsvH%_;]NlYښW^y~~dr.ޝoE%֕vsɼkbuNn/%_Ӟ7!(o\yzmȐS'e,+D[ƒ'Dqqq`@d?r˾sn`9"##Wr"ZhKƹ]+mikҿG=x-+)!XGHR/W(r{' 7';\\T4Ĥ}>=#7.Ш 6+8Lt5u)WN8TP)h\G$JiYAIx כrȳDDDHƆF' 2>kiYUQZ/v" :H^ J{Q0o RTfc tW XV)n/ۻwoZ;pW }]Ͻ%9Ȁ a(4gIDATo7h5|'RhT]=xb^sү7}MZv,?c)g)v=Fi(..܄ɓiVD%>mSyu 6NUpBPswBv;+ٍAƘ#<:cF#ZAѳزV/ulG%< Kژ^ {TW'$g5m9>"aq?.]Hh[0ƶH vxZ\DDd"c  %-ac@:n;y @. QWF ԯ{`g7upO"J ۭ֎(pYݷiծ֊͗bɏn9n9u9rdrkIv:D"QMd裃#MoW\/y0-n Ts/өw aWmJhM\{X7nj`~D"r7n Vmʅ9rPUI@YyqJK=$x';y"1LrN(lWF׾eC=r9NP"eئP,Ĝ!w1i2MuDN~ޞ+V%i8 BTʓ9ɖc˾'XΝ;._-̔=Oda?\BTRޗ EA$b jժ~$I۟}X^=]\n .|ò{n*\WJsTٳŴ.͗,C^!OOi,èi=Ip&f}X%`Y۲>37G~-idg̋9'1dE O$ @x9MT=^߇)ƴ9D4y@; ӧ0=z`H,r&…1pg\.vjjjV5??rƩbmћUEEEP&q@w1_yԩ='ڻ(;ګ轠A! 8G1`\b\q$D%è&$.T12FFdihzꥺ;{շnWU͖vwNO5vU~wA K|[mykZ[daoiE VϞp+^҅S+~e*͛W>u0˫)Ib38q良W|MmàTE"bcaOHygBDpҏ '0p0a?" ( fYMLjeYhRk)TI|>[dnu#n8,>>?onOY7$InokG/ʡHy^+n7tiǯXfs>T71Ν;|>_Y]E#ݴ5Dh7k#~ 5l߾O[8_ .iӦB[㸾ݽjk'D._S۰IVEbYj0YS@yCxWo "o\u_y?㢔JKK[ZZdUtwNΊt>B0dYv!.cCCNhj<xq4:>.MM裏_?oE ҈X(^b&[5{s.;;Kם/%t{Oޚ:yJ=}EQ2hYKɚeNHQIɁ%e1oqܹs|>_N4tH!]/(xwbzNק bEWY錱HUJx pcXGZ`xXh4E}tԷDlh$w_D@:~&qXqq1Oo[`"h rO6sgeWWWYԚ獿\Y'kYk'k„ y>؅|n=ٓ;pfQŠlZ=}aU]>i(8@\7_:>uXM} l\TS K,U>3b@kk^Qb!Cp%lYax>բ```r`Q(syNz9 ))Ŝ}kG |:sLԩS+wlXA!]2`o+ p+7ugEE,˗/oظ5u~lBB7o^}7;}o=۾dG[c YU7T]SusҎ ,ʮ@{ك?ni 55ưQ]E&]gϮ.]?ٵݻw^g|,z#TIq9.fWLL( cu-?_Xrjܖ͘8Y'XsBAobItzzztm^r:m׻j9R{ S+WzJcWZrUn+ꪫ?u[ KJީhN ݨO̮|D`6u +&N*7M\L;d£jwjMo^%.3ج{gZj{{́]v]9UƀEE9NQDzcH ,+1?dr7gs~(?%K%=ٸFX9jTƥ***8g-4`mvG-q{9P{|16`8V2,9W{mooϫx◣ho ّ2xX,+I}n:ysBx@1Q$Mp <H4֑Q_P/+ CgI=k„ Ň,_r94a< dY8W;0mA9NgsڂqF?2QEVBy'AZ-6^X:o7qĪ>|gA_\oޮ'7j7-f{ }{^gZ\nO;[sdPc a]R(D#$Gh_q6M9.KXhCrͣR\Z-yF'Q"xggWou:GAVĺ\.Ahxp0;kvOwWkʛb~zb#c.;پmE&j޶1<"`s⼼tSЀoT_}$&DŰ]6M(t |m1!.8JpgSt@5R`[tzHyH$ejDWQclk֬[zm/ LJ>轣&?aZZBn-YppPZ z1Kw:venb_6v(5P9mE.H$[q_~k82L*Ú=5`; ^o/xWٹtE"E?LcU&%35St8Rk,1I'XyLgs41MqԾ#{"XUmMcL'|'=b]Wl=`N%N::8tcYH !2Z <_QQ(J=ԾC===`LKj#JUUsppЙͩ::AjFQU5gSAj !6_/w~A`wY7狻[)Ӧ>o7j/d捯| ㄌ l!"@v欇N6=e5 Ry)"}UHn``G \xf#c8EcY:KL,{Z S}$y"%kX]*++c~'6IC @ƦʙeM^ҢC3TE)UUU>/ƪ=; F*+"A.\uk|N@aVw8͛gVUU-Bx, ͹eOҒwMGwGݪGj-x]ˋm8ޥ%Yb-͈bZy0Xdf}Zh]Ϸk}qnۡbӣ02Ilb{HW40Y5dc9iN4d_'P%k *WTTZ[ ENH̤̓->||^y{KwɲlÝy~៯#4ƥ =}._޺v W^ye3ݱX#/iMvfLFW \1ǚ$6Ȃc0k3 $͟?a kJs/hf hϓ O[09bZ)PgB=eL*&I6uTL9 `  .Z\^1v) CE%o?3o^;/Zq? ͍+W߭]>b u|+ƪrhI<ng#?e،'xfIŀ!qI xŘX Xwo`6cz0INId>O8ai}+&*|>gdhͤP$nyJ65+3g]%8: oH:>=i{e{zjeV2gΜ2Xy=nvnNhPZ%kh荌 _2k̎%؈iYÆ =Ymzw|oaDM\ksbU}tX, 1xOd 醐qM|\.r"f":8iCg&η~@ZA?5]ud Mo'IT4q_M##w\(XWAHh6Z!C֒^t%dԏbl:?+dY,a&#wR7Ȝ>Q35Fp(=l/JFIB ԹBfFVIB!rQM*@ Io-ρwsIAr.c1( ##D:pFKY)<UHج~3g#0{Y_^/㍮BjGJK o(k,]B% l]$S0Ƽ@pjt\# ~g^ j_cF.lZ4MƘA"M.,1*V+o1I+mel/Q+QШs% L5ccR{<-&#H1Q!KL\%}n痹AgK4el6ab,jMɜճjff=fw+HYO(lVIENDB`nabi-1.0.0/ChangeLog.00000644000175000017500000004064211655153252011265 000000000000002006-05-11 Choe Hwanjin * nabi.png: 새로운 아이콘에 맞게 수정 * src/ui.c: nabi.svg 로딩에 실패할경우 nabi.png를 아이콘으로 사용 2006-04-23 Choe Hwanjin * src/ui.c: 키입력 통계창 출력 루틴 개선 2005-07-17 Choe Hwanjin * test 디렉토리 추가 - 여러가지 toolkit을 위한 테스트 코드 2005-01-13 Choe Hwanjin * src/ic.c: PreeditArea에서 preedit window의 위치를 제대로 잡음 2005-01-08 Choe Hwanjin * src/ic.c: reset할때 preedit window 숨김 gtk1 text widget에서 preedit string이 안나오던 문제 수정(over the spot(PreeditPostion) 방식에서 foreground, background값을 client가 보내주는 값대신 nabi의 설정값을 따름) 2004-12-05 Choe Hwanjin * release 0.15 2004-12-04 Choe Hwanjin * About 창 업데이트 2004-12-03 Choe Hwanjin * 나비 아이콘 새로 올림 (bluetux님의 작품) 2004-12-02 Choe Hwanjin * 자판에서 자모 빈도를 $HOME/.nabi/nabi.log에 기록함 2004-11-26 Choe Hwanjin * 설정창에서 한글/한자로 메뉴를 나눔 2004-11-21 Choe Hwanjin * 한영 전환키와 한자 키 설정을 보강 * 옛글 compose table 추가 * 순아래 자판 추가 2004-11-09 Choe Hwanjin * tray의 크기에 맞춰 size-allocate 시그널에서 자동으로 크기를 수정함 * 아이콘 크기 설정 옵션을 없앰 2004-11-03 Choe Hwanjin * 키 입력 통계를 다른 창으로 띄움 * 하드코딩된 locale 스트링을 제거 * Qt immodule의 XIM에서 preedit window 위치를 잘못 찾던 버그 수정 2004-10-05 Choe Hwanjin * full compose map 추가(엣글 입력에 필요함) * 세벌식 옛글 자판 추가 2004-10-04 Choe Hwanjin * compose table을 제대로 로딩하지 못하던 버그 수정 2004-08-30 Choe Hwanjin * Tux 테마 추가 (박준철님에게 감사드립니다) 2004-08-28 Choe Hwanjin * release 0.14 2004-08-28 Choe Hwanjin * ko이외에 ja_JP.UTF-8, zh_CN.UTF-8, zh_HK.UTF-8, zh_TW.UTF-8, en_US.UTF-8을 지원하도록 함 * candidate list의 글꼴 설정 옵션도 설정창에 추가 * candidate list의 갯수를 9개로 변경 2004-08-01 Choe Hwanjin * XIMPreeditArea 지원 2004-07-31 Choe Hwanjin * XIMPreeditNothing을 지원하기 위해 ic.c에서 gdk 함수를 직접 부르는 방식으로 변경함 2004-07-25 Choe Hwanjin * 설정창 구현 2004-06-23 Choe Hwanjin * src/ic.c: nabi_ic_commit_keyval() 함수에서 더이상 XIM_COMMIT을 사용 하지 않고, 바로 key event를 forwarding하도록 수정함. 일부 프로그램에서 하나의 이벤트에서 두번 commit하는 것을 받아들이지 못하는 듯함. ex) wine 2004-06-05 Choe Hwanjin * src/server.h src/server/c src/ui.c src/nabi.h src/automata.h src/keyboard tables/compose/default configure.in: 키보드 테이블과 컴포우즈 테이블을 위한 함수 nabi_server_load_keyboard_table(), nabi_server_load_compose_table()을 구현함. 더이상 ui.c에서 키보드와 컴포우즈 테이블을 관리하지 않음. keyboard_map, compose_map에서 keyboard_table, compose_table로 이름을 바꿈. compose table 포맷을 변경 2004-04-23 Choe Hwanjin * src/handler.c src/ic.c src/ic.h src/server.c src/server.h: status window 콜백 함수를 구현함 * src/server.c: 한영 전환키로 오른쪽 Alt를 추가 2004-04-19 Choe Hwanjin * src/server.c: charset 체크하면서 ko로 시작하지 않으면 워닝을 출력하도록 함 2004-03-15 Choe Hwanjin * release 0.13 2004-03-07 Choe Hwanjin * src/ui.c: about 창 모양 개선 * po/ko.po: 번역 업데이트 2004-03-05 Choe Hwanjin * src/nabi.h src/main.c src/server.h src/server.c src/ui.c: xim_name이라는 컨피그 옵션과 --xim-name 이라는 커맨드 라인 옵션을 추가함. 이것을 지정하면 XMODIFIER값을 다른 것을 사용할 수 있음 2004-03-01 Choe Hwanjin * src/ui.c: GtkTextView를 사용하게 되면 GtkIMContext를 생성하게 되어 XIM 서버가 멈추는 위험한 상황이 자주 발생하므로 About 창에서 GtkTextView대신 GtkLabel를 사용하도록 수정함 2004-02-29 Choe Hwanjin * IMdkit/i18nIc.c IMdkit/i18nMethod.c IMdkit/i18nPtHdr.c: 바이트 오더 문제를 해결하기 위한 수정 2004-02-18 Choe Hwanjin * GNU gettext 대신 glib gettext를 사용하도록 수정 2004-02-16 Choe Hwanjin * src/candidate.c: 한자 선택창 페이지를 바꾸면서 화면에서 벗어나는 문제를 수정 (#300256) 2004-02-10 Choe Hwanjin * IMdkit/Makefile.am src/Makefile.am: -Wall 컴파일 옵션 제거(#300245) 2004-02-02 Choe Hwanjin * src/ui.c: 위젯을 만들기 전에 XMODIFIERS 환경변수를 지움 2004-01-29 Choe Hwanjin * src/candidate.c src/nabi.h src/server.c src/server.h src/ui.c: 설정값 candidate_font 추가, candidate 글자에 사용할 폰트 지정 2004-01-27 Choe Hwanjin * src/candidate.h src/candidate.c src/ic.c src/ic.h src/handler.c: candidate window에서 한자의 뜻을 보여주기 위해 GtkTable대신 GtkTreeView를 사용함 2004-01-09 Choe Hwanjin * src/candidate.c src/candidate.h src/ic.c src/nabi.h src/server.c src/server.h src/ui.c tables/Makefile.am tables/candidate/nabi.txt: 기존에 사용하던 static array를 버리고 외부의 파일로 저장된 candidate table을 사용하는 기능을 구현 2003-12-29 Choe Hwanjin * IMdkit/i18nIc.c,IMdkit/i18nPtHdr.c: 메모리 leak 문제 몇가지 해결 2003-12-23 Choe Hwanjin * src/server.h,src/server.c,src/automata.c: backspace정보를 통계 정보 구조체에 남기는 코드의 버그를 해결 2003-12-20 Choe Hwanjin * src/nabi.h,src/session.h,src/session.c,src/ui.c,src/main.c: 세션 기능을 구현, 세션저장만 하면 다음번에 제대로 다시 뜨게함, 또 프로그램이 죽게되면 자동으로 다시 띄우도록 기본값을 줌 2003-12-18 Choe Hwanjin * release 0.12 2003-12-16 Choe Hwanjin * src/ic.c: PreeditCallback 방식의 preedit style을 Underline에서 Reverse로 바꿈 트레이 아이콘이 사라지면서 죽던 문제 수정 2003-12-15 Choe Hwanjin * src/ui.c: icon의 크기를 좀더 똑똑하게 처리 메뉴의 위치를 마우스가 아닌 아이콘 위치 기준으로 설정 2003-12-14 Choe Hwanjin * src/server.h,src/server.c: iconv를 직접 쓰지 않고 g_iconv를 사용 * icon들 업데이트 (김석진님에게 감사드립니다) 2003-12-09 Choe Hwanjin * configure.in, themes/MSWindows2000/Makefile.am, themes/MSWindows2000/english.png, themes/MSWindows2000/hangul.png, themes/MSWindows2000/none.png, themes/Makefile.am: MSWindows2000 테마 추가 2003-12-05 Choe Hwanjin * src/handler.c, src/ic.c, src/ic.h: add utf8_to_compound_text() func. do not commit on ICReset, just send last preedit string 2003-12-03 Choe Hwanjin * src/ic.c: PreeditPosition에서 preedit window를 spot location보다 한픽셀 뒤로 밂 (커서위치를 보이게 하기 위함) 2003-12-02 Choe Hwanjin * src/ic.c: set overide-redirect to show preedit window correctly on Qt app 2003-11-29 Choe Hwanjin * po/ko.po: update po * ChangeLog: update ChangeLog * src/ui.c: set dialog variable to NULL when about window closed * src/ui.c: about window가 하나만 뜨게 함 * release 0.11 2003-11-28 Choe Hwanjin * src/ic.c, src/server.c, src/server.h: gc를 ic별로 관리하는 대신 server에 기본 gc를 하나 만들고 그걸 사용하도록 함 * AUTHORS, NEWS, TODO: 문서 업데이트 * configure.in: prepare for version up * po/ko.po: 번역 업데이트 * src/main.c, src/server.c, src/server.h, src/ui.c: xim 서버 종료시 gtk2 application들이 죽던 문제 해결, xim서버를 정상적으로 종료함 * po/Makevars: set variable MSGID_BUGS_ADDRESS * src/ui.c: update comment for parsing command line args routine 2003-11-27 Choe Hwanjin * src/candidate.c: candidate window에서 . 제거 2003-11-26 Choe Hwanjin * src/ui.c: rename function for root window event filtering 2003-11-25 Choe Hwanjin * src/main.c, src/nabi.h, src/server.c, src/ui.c: -s(--status-only) 옵션 추가(디버깅용도, 또는 상태 정보만 보여주기) 2003-11-24 Choe Hwanjin * src/main.c: 실수로 추가한 코드 제거 (server start 루틴 작동함) * src/main.c, src/ui.c: update main window * src/automata.c: 세벌식 오토마타에서 잘못돼 있던 goto update를 goto insert로 수정, OUTPUT_JAMO의 경우만 순서를 고려하지 않는 코드(모아치기)를 사용 2003-11-15 Choe Hwanjin * src/server.c: argument check, 안전한 프로그램을 위해 2003-11-13 Choe Hwanjin * src/ui.c: add tooltips on tray icon 2003-11-10 Choe Hwanjin * src/candidate.c: candidate window의 memory leak 2003-11-09 Choe Hwanjin * src/ic.c: PreeditPosition에서 preedit window 위치 조정 (xterm에서) * src/candidate.c: 각 글자를 x 방향도 맞추도록 함 2003-11-07 Choe Hwanjin * src/handler.c: candidate window에서 잘못된 인덱스 수정 * configure.in, po/ko.po: version up 0.10 2003-11-05 Choe Hwanjin * src/candidate.c, src/handler.c, src/ic.c: 단축키를 알파벳대신 숫자로 변경함 2003-11-04 Choe Hwanjin * src/handler.c: on focus out event close the candidate window * src/candidate.c: always show full window on screen * src/ic.c, src/symboltable.h, src/candidate.c, src/candidate.h, src/hanjatable.h: candidate selection window의 기본형을 wchar_t에서 unsigned short int로 변경 * src/Makefile.am: add symboltable.h to source list * src/handler.c: change default keymapping on symbol selection window 2003-11-03 Choe Hwanjin * src/candidate.c, src/candidate.h, src/handler.c, src/hanjatable.h, src/ic.c, src/symboltable.h: add symbol selection function 2003-11-02 Choe Hwanjin * ChangeLog, src/Makefile.am, src/candidate.c, src/candidate.h, src/handler.c, src/ic.c, src/ic.h, src/ui.c: Add new candidate window routine 2003-11-02 Choe Hwanjin * src/Makefile.am, src/candidate.c, src/candidate.h, src/handler.c, src/ic.c, src/ic.h, src/ui.c: Add new candidate window routine 2003-10-30 Choe Hwanjin * 텍스트 파일들의 인코딩을 UTF-8로 변환 2003-10-22 Choe Hwanjin * src/ic.c,src/nabi.h,src/ui.c,src/server.h,src/server.c: output_mode 옵션 추가 (syllable, jamo 가능) 2003-10-20 Choe Hwanjin * src/ui.c: gcc 3.3.2 에서 strict alias warning 안나게 2003-10-19 Choe Hwanjin * src/ic.c: unicode 범위의 keyval은 forwarding하지 않고 바로 commit 함 2003-10-15 Choe Hwanjin * src/automata.c,src/handler.c,src/ic.c,src/ic.h: 한글자모 이외의 글자를 처리하는 루틴을 개선 2003-10-14 Choe Hwanjin * release 0.9 2003-10-13 Choe Hwanjin * src/ic.c,src/hangul.c,src/hangul.h,src/server.c: XwcXXX 함수를 모두 Xutf8XXX 함수로 바꿈, UCS 코드를 UTF8 스트링으로 만드는 자체 루틴 추가, charset 체크에서도 WCHAR_T 대신 UTF-8 사용 (BSD 지원을 위해) BSD 서버 사용을 지원해주신 Perky(http://openlook.org/)님께 감사드립니다. 2003-10-10 Choe Hwanjin * src/ic.c: qt에서 한자 변환시 안보이던 문제 해결 2003-10-08 Choe Hwanjin * release 0.8 2003-10-08 Choe Hwanjin * src/automata.c: charset을 체크하는 부분을 더 추가 (ㅃㅞㄹㄱ의 경우 고려), 세벌식 자판에서도 charset 체크 강화 * src/automata.c, src/server.h, src/server.c, src/ui.c: 각 키별로 눌린 횟수를 저장해두는 기능을 추가함(about 창에서 볼수 있음) 2003-10-01 Choe Hwanjin * src/ic.c: XIMPreeditPosition 모드의 경우에는 commit한후에 preedit clear 하도록 수정함(Eterm의 경우는 preedit string을 지우고 commit 해도 정상적으로 입력이 되지만, gtk+1 app의 경우는 입력순서가 뒤바뀌는 경우가 있어서 XIMPreeditPosition의 경우는 기존의 방식대로 처리하도록 함, 따라서 XUnmapWindow()를 사용해도 입력순서에 영향을 미치지 않음 #284) 2003-09-26 Choe Hwanjin * release 0.7 2003-09-18 Choe Hwanjin * src/ic.c: XIM spec에 맞게 preedit clear 한후 commit 함 * src/handler.c: 한자 변환 기능을 "Hanja"키 말고 F9도 작동하게 함 2003-09-17 Choe Hwanjin * src/ui.c: set default icon 2003-09-16 Choe Hwanjin * release 0.6 * src/session.c,src/main.c,src/ui.c: session 종료시 같이 종료 2003-09-14 Choe Hwanjin * src/session.h,src/session.c: session 관련 코드 추가 2003-09-10 Choe Hwanjin * src/handler.c: 특수키들을 포워딩 함 * src/automata.c: 세벌식 오토마타의 잘못된 곳 수정 2003-09-09 Choe Hwanjin * src/server.h,src/server.c,src/ui.c: iconv를 이용한 charset 체크루틴 추가 * src/hangul.h,src/hangul.c: hangul_ucs_to_ksc 함수를 제거 2003-09-08 Choe Hwanjin * src/ui.c,src/ic.c,src/ic.h,src/nabi.h,src/hanjatable.h,src/handler.c: 한자 입력 기능 추가 * src/handler.c: preedit start/done을 제때에 맞게 호출하도록 수정 mozilla에서 한글 상태에서 창을 닫으면 죽던 문제 해결(#248) 2003-09-07 Choe Hwanjin * release 0.5 2003-08-31 Choe Hwanjin * src/ui.c,main.c: system tray가 닫혀도 프로그램을 종료하지 않음 * src/ui.c: dvorak 자판을 위한 설정을 메뉴에 추가 2003-08-29 Choe Hwanjin * src/ucs2ksc.h,src/hangul.c: usc_to_ksc 테이블을 wchar_t에서 uint16_t 형으로 바꿔서 크기를 줄임 2003-08-27 Choe Hwanjin * src/server.h,server.c,automata.c: dvorak 자판 지원 * src/server.h,server.c,nabi.h,ui.c: dvorak 설정 지원 * src/ui.c: 메뉴 아이콘 추가 2003-08-25 Choe Hwanjin * release 0.4 * src/ui.c,configure.in: 키보드 기본값을 DEFAULT_KEYBOARD로 사용 2003-08-23 Choe Hwanjin * src/handler.c,ic.c,ic.h,server.c,server.h: NabiConnect를 추가해서 connect_id 별로 한영 상태를 관리하도록 함 2003-08-21 Choe Hwanjin * src/main.c,server.h,server.c: nabi_server_stop 함수 추가 * src/fontset.h,fontset.c: fontset 관련 루틴 추가 * src/ic.c: nabi_fontset 관련 함수 사용하도록 수정 2003-08-11 Choe Hwanjin * src/ic.h,ic.c: preedit start 플래그 추가, preedit_start된 경우만 preedit_done 메세지를 보냄(mozilla flash player와 관련된 문제점) * src/ui.c: about 창에서 버젼 넘버 볼 수 있게 2003-08-09 Choe Hwanjin * configure.in: gtk+ 2.2를 필요로 하도록 함 2003-08-07 Choe Hwanjin * src/handler.c: vi 사용자를 위해 esc키일때 영문 상태로 자동 전환 2003-08-06 Choe Hwanjin * src/handler.c: CapsLock, NumLock 처리 못하는 버그 수정 * src/ui.c: NabiKeyboardMap.map을 free 하는 버그 수정 * IMdkit/IMConn.c: malloc.h 대신 stdlib.h 를 include 2003-08-05 Choe Hwanjin * Release nabi-1.0.0/IMdkit/0000755000175000017500000000000012100712170010572 500000000000000nabi-1.0.0/IMdkit/doc/0000755000175000017500000000000012100712170011337 500000000000000nabi-1.0.0/IMdkit/doc/Xi18n_sample/0000755000175000017500000000000012100712170013607 500000000000000nabi-1.0.0/IMdkit/doc/Xi18n_sample/Imakefile0000644000175000017500000000040411655153252015354 00000000000000IMDLIB = -L../IMdkit -lXimd DEPLIBS = $(DEPXONLYLIB) INCLUDES = -I../IMdkit LOCAL_LIBRARIES = $(IMDLIB) $(XONLYLIB) SRCS = sampleIM.c IC.c OBJS = sampleIM.o IC.o #CDEBUGFLAGS = -g -DX_LOCALE CDEBUGFLAGS = -g PROGRAM = sampleIM ComplexProgramTarget(sampleIM) nabi-1.0.0/IMdkit/doc/Xi18n_sample/IC.c0000644000175000017500000002463311655153252014214 00000000000000/****************************************************************** Copyright 1994, 1995 by Sun Microsystems, Inc. Copyright 1993, 1994 by Hewlett-Packard Company Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation, and that the name of Sun Microsystems, Inc. and Hewlett-Packard not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. Sun Microsystems, Inc. and Hewlett-Packard make no representations about the suitability of this software for any purpose. It is provided "as is" without express or implied warranty. SUN MICROSYSTEMS INC. AND HEWLETT-PACKARD COMPANY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SUN MICROSYSTEMS, INC. AND HEWLETT-PACKARD COMPANY BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. Author: Hidetoshi Tajima(tajima@Eng.Sun.COM) Sun Microsystems, Inc. ******************************************************************/ #include #include #include #include "IC.h" #include static IC *ic_list = (IC *)NULL; static IC *free_list = (IC *)NULL; static IC *NewIC() { static CARD16 icid = 0; IC *rec; if (free_list != NULL) { rec = free_list; free_list = free_list->next; } else { rec = (IC *)malloc(sizeof(IC)); } memset(rec, 0, sizeof(IC)); rec->id = ++icid; rec->next = ic_list; ic_list = rec; return rec; } IC *FindIC(icid) CARD16 icid; { IC *rec = ic_list; while (rec != NULL) { if (rec->id == icid) return rec; rec = rec->next; } return NULL; } static void DeleteIC(icid) CARD16 icid; { IC *rec, *last; last = NULL; for (rec = ic_list; rec != NULL; last = rec, rec = rec->next) { if (rec->id == icid) { if (last != NULL) last->next = rec->next; else ic_list = rec->next; rec->next = free_list; free_list = rec; return; } } return; } static int Is(char *attr, XICAttribute *attr_list) { return !strcmp(attr, attr_list->name); } static void StoreIC(rec, call_data) IC *rec; IMChangeICStruct *call_data; { XICAttribute *ic_attr = call_data->ic_attr; XICAttribute *pre_attr = call_data->preedit_attr; XICAttribute *sts_attr = call_data->status_attr; register int i; for (i = 0; i < (int)call_data->ic_attr_num; i++, ic_attr++) { if (Is (XNInputStyle, ic_attr)) rec->input_style = *(INT32*)ic_attr->value; else if (Is (XNClientWindow, ic_attr)) rec->client_win = *(Window*)ic_attr->value; else if (Is (XNFocusWindow, ic_attr)) rec->focus_win = *(Window*)ic_attr->value; else fprintf(stderr, "Unknown attr: %s\n", ic_attr->name); } for (i = 0; i < (int)call_data->preedit_attr_num; i++, pre_attr++) { if (Is (XNArea, pre_attr)) rec->pre_attr.area = *(XRectangle*)pre_attr->value; else if (Is (XNAreaNeeded, pre_attr)) rec->pre_attr.area_needed = *(XRectangle*)pre_attr->value; else if (Is (XNSpotLocation, pre_attr)) rec->pre_attr.spot_location = *(XPoint*)pre_attr->value; else if (Is (XNColormap, pre_attr)) rec->pre_attr.cmap = *(Colormap*)pre_attr->value; else if (Is (XNStdColormap, pre_attr)) rec->pre_attr.cmap = *(Colormap*)pre_attr->value; else if (Is (XNForeground, pre_attr)) rec->pre_attr.foreground = *(CARD32*)pre_attr->value; else if (Is (XNBackground, pre_attr)) rec->pre_attr.background = *(CARD32*)pre_attr->value; else if (Is (XNBackgroundPixmap, pre_attr)) rec->pre_attr.bg_pixmap = *(Pixmap*)pre_attr->value; else if (Is (XNFontSet, pre_attr)) { int str_length = strlen(pre_attr->value); if (rec->pre_attr.base_font != NULL) { if (Is (rec->pre_attr.base_font, pre_attr)) continue; XFree(rec->pre_attr.base_font); } rec->pre_attr.base_font = malloc(str_length + 1); strcpy(rec->pre_attr.base_font, pre_attr->value); } else if (Is (XNLineSpace, pre_attr)) rec->pre_attr.line_space = *(CARD32*)pre_attr->value; else if (Is (XNCursor, pre_attr)) rec->pre_attr.cursor = *(Cursor*)pre_attr->value; else fprintf(stderr, "Unknown attr: %s\n", ic_attr->name); } for (i = 0; i < (int)call_data->status_attr_num; i++, sts_attr++) { if (Is (XNArea, sts_attr)) rec->sts_attr.area = *(XRectangle*)sts_attr->value; else if (Is (XNAreaNeeded, sts_attr)) rec->sts_attr.area_needed = *(XRectangle*)sts_attr->value; else if (Is (XNColormap, sts_attr)) rec->sts_attr.cmap = *(Colormap*)sts_attr->value; else if (Is (XNStdColormap, sts_attr)) rec->sts_attr.cmap = *(Colormap*)sts_attr->value; else if (Is (XNForeground, sts_attr)) rec->sts_attr.foreground = *(CARD32*)sts_attr->value; else if (Is (XNBackground, sts_attr)) rec->sts_attr.background = *(CARD32*)sts_attr->value; else if (Is (XNBackgroundPixmap, sts_attr)) rec->sts_attr.bg_pixmap = *(Pixmap*)sts_attr->value; else if (Is (XNFontSet, sts_attr)) { int str_length = strlen(sts_attr->value); if (rec->sts_attr.base_font != NULL) { if (Is (rec->sts_attr.base_font, sts_attr)) continue; XFree(rec->sts_attr.base_font); } rec->sts_attr.base_font = malloc(str_length + 1); strcpy(rec->sts_attr.base_font, sts_attr->value); } else if (Is (XNLineSpace, sts_attr)) rec->sts_attr.line_space= *(CARD32*)sts_attr->value; else if (Is (XNCursor, sts_attr)) rec->sts_attr.cursor = *(Cursor*)sts_attr->value; else fprintf(stderr, "Unknown attr: %s\n", ic_attr->name); } } void CreateIC(call_data) IMChangeICStruct *call_data; { IC *rec; rec = NewIC(); if (rec == NULL) return; StoreIC(rec, call_data); call_data->icid = rec->id; return; } void DestroyIC(call_data) IMChangeICStruct *call_data; { DeleteIC(call_data->icid); return; } void SetIC(call_data) IMChangeICStruct *call_data; { IC *rec = FindIC(call_data->icid); if (rec == NULL) return; StoreIC(rec, call_data); return; } void GetIC(call_data) IMChangeICStruct *call_data; { XICAttribute *ic_attr = call_data->ic_attr; XICAttribute *pre_attr = call_data->preedit_attr; XICAttribute *sts_attr = call_data->status_attr; register int i; IC *rec = FindIC(call_data->icid); if (rec == NULL) return; for (i = 0; i < (int)call_data->ic_attr_num; i++, ic_attr++) { if (Is (XNFilterEvents, ic_attr)) { ic_attr->value = (void *)malloc(sizeof(CARD32)); *(CARD32*)ic_attr->value = KeyPressMask|KeyReleaseMask; ic_attr->value_length = sizeof(CARD32); } } /* preedit attributes */ for (i = 0; i < (int)call_data->preedit_attr_num; i++, pre_attr++) { if (Is (XNArea, pre_attr)) { pre_attr->value = (void *)malloc(sizeof(XRectangle)); *(XRectangle*)pre_attr->value = rec->pre_attr.area; pre_attr->value_length = sizeof(XRectangle); } else if (Is (XNAreaNeeded, pre_attr)) { pre_attr->value = (void *)malloc(sizeof(XRectangle)); *(XRectangle*)pre_attr->value = rec->pre_attr.area_needed; pre_attr->value_length = sizeof(XRectangle); } else if (Is (XNSpotLocation, pre_attr)) { pre_attr->value = (void *)malloc(sizeof(XPoint)); *(XPoint*)pre_attr->value = rec->pre_attr.spot_location; pre_attr->value_length = sizeof(XPoint); } else if (Is (XNFontSet, pre_attr)) { CARD16 base_len = (CARD16)strlen(rec->pre_attr.base_font); int total_len = sizeof(CARD16) + (CARD16)base_len; char *p; pre_attr->value = (void *)malloc(total_len); p = (char *)pre_attr->value; memmove(p, &base_len, sizeof(CARD16)); p += sizeof(CARD16); strncpy(p, rec->pre_attr.base_font, base_len); pre_attr->value_length = total_len; } else if (Is (XNForeground, pre_attr)) { pre_attr->value = (void *)malloc(sizeof(long)); *(long*)pre_attr->value = rec->pre_attr.foreground; pre_attr->value_length = sizeof(long); } else if (Is (XNBackground, pre_attr)) { pre_attr->value = (void *)malloc(sizeof(long)); *(long*)pre_attr->value = rec->pre_attr.background; pre_attr->value_length = sizeof(long); } else if (Is (XNLineSpace, pre_attr)) { pre_attr->value = (void *)malloc(sizeof(long)); #if 0 *(long*)pre_attr->value = rec->pre_attr.line_space; #endif *(long*)pre_attr->value = 18; pre_attr->value_length = sizeof(long); } } /* status attributes */ for (i = 0; i < (int)call_data->status_attr_num; i++, sts_attr++) { if (Is (XNArea, sts_attr)) { sts_attr->value = (void *)malloc(sizeof(XRectangle)); *(XRectangle*)sts_attr->value = rec->sts_attr.area; sts_attr->value_length = sizeof(XRectangle); } else if (Is (XNAreaNeeded, sts_attr)) { sts_attr->value = (void *)malloc(sizeof(XRectangle)); *(XRectangle*)sts_attr->value = rec->sts_attr.area_needed; sts_attr->value_length = sizeof(XRectangle); } else if (Is (XNFontSet, sts_attr)) { CARD16 base_len = (CARD16)strlen(rec->sts_attr.base_font); int total_len = sizeof(CARD16) + (CARD16)base_len; char *p; sts_attr->value = (void *)malloc(total_len); p = (char *)sts_attr->value; memmove(p, &base_len, sizeof(CARD16)); p += sizeof(CARD16); strncpy(p, rec->sts_attr.base_font, base_len); sts_attr->value_length = total_len; } else if (Is (XNForeground, sts_attr)) { sts_attr->value = (void *)malloc(sizeof(long)); *(long*)sts_attr->value = rec->sts_attr.foreground; sts_attr->value_length = sizeof(long); } else if (Is (XNBackground, sts_attr)) { sts_attr->value = (void *)malloc(sizeof(long)); *(long*)sts_attr->value = rec->sts_attr.background; sts_attr->value_length = sizeof(long); } else if (Is (XNLineSpace, sts_attr)) { sts_attr->value = (void *)malloc(sizeof(long)); #if 0 *(long*)sts_attr->value = rec->sts_attr.line_space; #endif *(long*)sts_attr->value = 18; sts_attr->value_length = sizeof(long); } } } nabi-1.0.0/IMdkit/doc/Xi18n_sample/IC.h0000644000175000017500000000533111655153252014213 00000000000000/****************************************************************** Copyright 1994, 1995 by Sun Microsystems, Inc. Copyright 1993, 1994 by Hewlett-Packard Company Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation, and that the name of Sun Microsystems, Inc. and Hewlett-Packard not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. Sun Microsystems, Inc. and Hewlett-Packard make no representations about the suitability of this software for any purpose. It is provided "as is" without express or implied warranty. SUN MICROSYSTEMS INC. AND HEWLETT-PACKARD COMPANY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SUN MICROSYSTEMS, INC. AND HEWLETT-PACKARD COMPANY BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. Author: Hidetoshi Tajima(tajima@Eng.Sun.COM) Sun Microsystems, Inc. ******************************************************************/ typedef struct { XRectangle area; /* area */ XRectangle area_needed; /* area needed */ XPoint spot_location; /* spot location */ Colormap cmap; /* colormap */ CARD32 foreground; /* foreground */ CARD32 background; /* background */ Pixmap bg_pixmap; /* background pixmap */ char *base_font; /* base font of fontset */ CARD32 line_space; /* line spacing */ Cursor cursor; /* cursor */ } PreeditAttributes; typedef struct { XRectangle area; /* area */ XRectangle area_needed; /* area needed */ Colormap cmap; /* colormap */ CARD32 foreground; /* foreground */ CARD32 background; /* background */ Pixmap bg_pixmap; /* background pixmap */ char *base_font; /* base font of fontset */ CARD32 line_space; /* line spacing */ Cursor cursor; /* cursor */ } StatusAttributes; typedef struct _IC { CARD16 id; /* ic id */ INT32 input_style; /* input style */ Window client_win; /* client window */ Window focus_win; /* focus window */ char *resource_name; /* resource name */ char *resource_class; /* resource class */ PreeditAttributes pre_attr; /* preedit attributes */ StatusAttributes sts_attr; /* status attributes */ struct _IC *next; } IC; nabi-1.0.0/IMdkit/doc/Xi18n_sample/Makefile.pu0000644000175000017500000003456011655153252015640 00000000000000# Makefile generated by imake - do not edit! # $XConsortium: imake.c,v 1.91 95/01/12 16:15:47 kaleb Exp $ # ---------------------------------------------------------------------- # Makefile generated from "Imake.tmpl" and # $XConsortium: Imake.tmpl,v 1.224 94/12/27 03:57:50 gildea Exp $ # .SUFFIXES: .i # $XConsortium: Imake.cf,v 1.19 95/01/05 19:24:32 kaleb Exp $ # ----------------------------------------------------------------------- # site-specific configuration parameters that need to come before # the platform-specific parameters - edit site.def to change # site: $XConsortium: site.sample,v 1.9 94/04/08 17:02:06 rws Exp $ # ----------------------------------------------------------------------- # platform-specific configuration parameters - edit sun.cf to change # platform: $XConsortium: sun.cf,v 1.139 95/01/12 15:30:26 kaleb Exp $ # operating system: SunOS 5.3 # $XConsortium: svr4.cf,v 1.11 95/01/25 16:32:39 kaleb Exp $ # $XConsortium: sv4Lib.rules,v 1.14 94/04/09 12:00:10 rws Exp $ # ----------------------------------------------------------------------- # site-specific configuration parameters that go after # the platform-specific parameters - edit site.def to change # site: $XConsortium: site.sample,v 1.9 94/04/08 17:02:06 rws Exp $ # ----------------------------------------------------------------------- # Imake rules for building libraries, programs, scripts, and data files # rules: $XConsortium: Imake.rules,v 1.197 94/12/05 19:30:41 gildea Exp $ PATHSEP = / SHELL = /bin/sh TOP = ../../../../xc CURRENT_DIR = ../contrib/lib/IMdkit/Xi18n_sample IMAKE = $(IMAKESRC)/imake DEPEND = $(DEPENDSRC)/makedepend MKDIRHIER = $(SHELL) $(CONFIGSRC)/util/mkdirhier.sh CONFIGSRC = $(TOP)/config IMAKESRC = $(CONFIGSRC)/imake DEPENDSRC = $(CONFIGSRC)/makedepend IXXSRC = $(UNSUPPORTEDSRC)/programs/ixx IXX = $(IXXSRC)/ixx IXXFLAGS = -s BaseObject -m TypeObj -r RequestObj -p Xf IXXINCLUDES = -i '' INCROOT = /usr/X11R6/include USRLIBDIR = /usr/X11R6/lib SHLIBDIR = /usr/X11R6/lib LINTLIBDIR = $(USRLIBDIR)/lint MANPATH = /usr/X11R6/man MANSOURCEPATH = $(MANPATH)/man MANDIR = $(MANSOURCEPATH)1 LIBMANDIR = $(MANSOURCEPATH)3 FILEMANDIR = $(MANSOURCEPATH)$(FILEMANSUFFIX) AR = /usr/ccs/bin/ar cq BOOTSTRAPCFLAGS = -DSVR4 CC = cc AS = /usr/ccs/bin/as COMPRESS = compress CPP = /usr/ccs/lib/cpp $(STD_CPP_DEFINES) PREPROCESSCMD = cc -E $(STD_CPP_DEFINES) INSTALL = $(SHELL) $(CONFIGSRC)/util/bsdinst.sh INSTALLFLAGS = -c LD = /usr/ccs/bin/ld LEX = /usr/ccs/bin/lex LEXLIB = -ll YACC = /usr/ccs/bin/yacc CCYACC = /usr/ccs/bin/yacc LINT = lint LINTLIBFLAG = -o LINTOPTS = -bh LN = ln -s MAKE = /usr/ccs/bin/make MV = mv CP = cp RM = rm -f MANSUFFIX = 1x LIBMANSUFFIX = 3x FILEMANSUFFIX = 4 TROFF = psroff MSMACROS = -ms TBL = tbl EQN = eqn DVIPS = dvips LATEX = latex STD_INCLUDES = STD_CPP_DEFINES = -Dsun -DSVR4 STD_DEFINES = -Dsun -DSVR4 EXTRA_LOAD_FLAGS = EXTRA_LDOPTIONS = EXTRA_LIBRARIES = -lsocket -lnsl TAGS = ctags SHAREDCODEDEF = SHLIBDEF = SHLIBLDFLAGS = -G -z text PICFLAGS = -Kpic CXXPICFLAGS = -K PIC PROTO_DEFINES = INSTPGMFLAGS = INSTBINFLAGS = -m 0755 INSTUIDFLAGS = -m 4755 INSTLIBFLAGS = -m 0644 INSTINCFLAGS = -m 0444 INSTMANFLAGS = -m 0444 INSTDATFLAGS = -m 0444 INSTKMEMFLAGS = -g sys -m 2755 PROJECTROOT = /usr/X11R6 TOP_INCLUDES = -I$(TOP) CDEBUGFLAGS = -O CCOPTIONS = -Xc ALLINCLUDES = $(INCLUDES) $(EXTRA_INCLUDES) $(TOP_INCLUDES) $(STD_INCLUDES) ALLDEFINES = $(ALLINCLUDES) $(STD_DEFINES) $(EXTRA_DEFINES) $(PROTO_DEFINES) $(THREADS_DEFINES) $(DEFINES) CFLAGS = $(CDEBUGFLAGS) $(CCOPTIONS) $(THREADS_CFLAGS) $(ALLDEFINES) LINTFLAGS = $(LINTOPTS) -DLINT $(ALLDEFINES) $(DEPEND_DEFINES) LDPRELIB = -L$(BUILDLIBDIR) LDPOSTLIB = LDOPTIONS = $(CDEBUGFLAGS) $(CCOPTIONS) $(EXTRA_LDOPTIONS) $(THREADS_LDFLAGS) $(LOCAL_LDFLAGS) $(LDPRELIB) CXXLDOPTIONS = $(CXXDEBUGFLAGS) $(CXXOPTIONS) $(EXTRA_LDOPTIONS) $(THREADS_CXXLDFLAGS) $(LOCAL_LDFLAGS) $(LDPRELIB) LDLIBS = $(LDPOSTLIB) $(THREADS_LIBS) $(SYS_LIBRARIES) $(EXTRA_LIBRARIES) CCENVSETUP = LD_RUN_PATH=$(USRLIBDIR) CCLINK = $(CCENVSETUP) purify $(CC) CXXENVSETUP = LD_RUN_PATH=$(USRLIBDIR) CXXLINK = $(CXXENVSETUP) $(CXX) LDSTRIPFLAGS = -x LDCOMBINEFLAGS = -r DEPENDFLAGS = MACROFILE = sun.cf RM_CMD = $(RM) IMAKE_DEFINES = IRULESRC = $(CONFIGSRC)/cf IMAKE_CMD = $(IMAKE) -I$(IRULESRC) $(IMAKE_DEFINES) ICONFIGFILES = $(IRULESRC)/Imake.tmpl $(IRULESRC)/Project.tmpl \ $(IRULESRC)/site.def $(IRULESRC)/$(MACROFILE) \ $(EXTRA_ICONFIGFILES) # ---------------------------------------------------------------------- # X Window System Build Parameters and Rules # $XConsortium: Project.tmpl,v 1.248 95/01/06 19:12:51 gildea Exp $ # ----------------------------------------------------------------------- # X Window System make variables; these need to be coordinated with rules BINDIR = /usr/X11R6/bin BUILDINCROOT = $(TOP) BUILDINCDIR = $(BUILDINCROOT)/X11 BUILDINCTOP = .. BUILDLIBDIR = $(TOP)/usrlib BUILDLIBTOP = .. INCDIR = $(INCROOT)/X11 ADMDIR = /usr/adm LIBDIR = $(USRLIBDIR)/X11 FONTDIR = $(LIBDIR)/fonts XINITDIR = $(LIBDIR)/xinit XDMDIR = $(LIBDIR)/xdm TWMDIR = $(LIBDIR)/twm XSMDIR = $(LIBDIR)/xsm NLSDIR = $(LIBDIR)/nls XLOCALEDIR = $(LIBDIR)/locale PEXAPIDIR = $(LIBDIR)/PEX XAPPLOADDIR = $(LIBDIR)/app-defaults FONTCFLAGS = -t INSTAPPFLAGS = $(INSTDATFLAGS) RGB = $(RGBSRC)/rgb FONTC = $(BDFTOPCFSRC)/bdftopcf MKFONTDIR = $(MKFONTDIRSRC)/mkfontdir DOCUTILSRC = $(TOP)/doc/util XDOCMACROS = $(DOCUTILSRC)/macros.t XIDXMACROS = $(DOCUTILSRC)/indexmacros.t PROGRAMSRC = $(TOP)/programs LIBSRC = $(TOP)/lib FONTSRC = $(TOP)/fonts INCLUDESRC = $(TOP)/X11 SERVERSRC = $(TOP)/programs/Xserver CONTRIBSRC = $(TOP)/../contrib UNSUPPORTEDSRC = $(TOP)/unsupported DOCSRC = $(TOP)/doc RGBSRC = $(TOP)/programs/rgb BDFTOPCFSRC = $(PROGRAMSRC)/bdftopcf MKFONTDIRSRC = $(PROGRAMSRC)/mkfontdir FONTSERVERSRC = $(PROGRAMSRC)/xfs FONTINCSRC = $(TOP)/include/fonts EXTINCSRC = $(TOP)/include/extensions TRANSCOMMSRC = $(LIBSRC)/xtrans TRANS_INCLUDES = -I$(TRANSCOMMSRC) # $XConsortium: sunLib.tmpl,v 1.36 94/04/08 19:13:50 rws Exp $ # $XConsortium: sv4Lib.tmpl,v 1.19 93/12/03 10:48:36 kaleb Exp $ XMULIBONLY = -lXmu XLIBSRC = $(LIBSRC)/X11 SOXLIBREV = 6.0 DEPXONLYLIB = XONLYLIB = -lX11 LINTXONLY = $(XLIBSRC)/llib-X11.ln XLIBONLY = $(XONLYLIB) XEXTLIBSRC = $(LIBSRC)/Xext SOXEXTREV = 6.0 DEPEXTENSIONLIB = EXTENSIONLIB = -lXext LINTEXTENSION = $(XEXTLIBSRC)/llib-Xext.ln LINTEXTENSIONLIB = $(LINTEXTENSION) DEPXLIB = $(DEPEXTENSIONLIB) $(DEPXONLYLIB) XLIB = $(EXTENSIONLIB) $(XONLYLIB) LINTXLIB = $(LINTXONLYLIB) XAUTHSRC = $(LIBSRC)/Xau DEPXAUTHLIB = $(BUILDLIBDIR)/libXau.a XAUTHLIB = -lXau LINTXAUTH = $(XAUTHSRC)/llib-Xau.ln XDMCPLIBSRC = $(LIBSRC)/Xdmcp DEPXDMCPLIB = $(BUILDLIBDIR)/libXdmcp.a XDMCPLIB = -lXdmcp LINTXDMCP = $(XDMCPLIBSRC)/llib-Xdmcp.ln XMUSRC = $(LIBSRC)/Xmu SOXMUREV = 6.0 DEPXMULIB = XMULIB = -lXmu LINTXMU = $(XMUSRC)/llib-Xmu.ln OLDXLIBSRC = $(LIBSRC)/oldX SOOLDXREV = 6.0 DEPOLDXLIB = OLDXLIB = -loldX LINTOLDX = $(OLDXLIBSRC)/llib-oldX.ln TOOLKITSRC = $(LIBSRC)/Xt SOXTREV = 6.0 DEPXTOOLONLYLIB = XTOOLONLYLIB = -lXt LINTXTOOLONLY = $(TOOLKITSRC)/llib-Xt.ln DEPXTOOLLIB = $(DEPXTOOLONLYLIB) $(DEPSMLIB) $(DEPICELIB) XTOOLLIB = $(XTOOLONLYLIB) $(SMLIB) $(ICELIB) LINTXTOOLLIB = $(LINTXTOOLONLYLIB) AWIDGETSRC = $(LIBSRC)/Xaw SOXAWREV = 6.0 DEPXAWLIB = XAWLIB = -lXaw LINTXAW = $(AWIDGETSRC)/llib-Xaw.ln XTFSRC = $(TOP)/workInProgress/Xtf SOXTFREV = 0.7 DEPXTFLIB = XTFLIB = -lXtf LINTXTF = $(XTFSRC)/llib-Xtf.ln FRESCOSRC = $(TOP)/workInProgress/Fresco SOFRESCOREV = 0.7 DEPFRESCOLIB = FRESCOLIB = -lFresco LINTFRESCO = $(FRESCOSRC)/src/llib-Fresco.ln XILIBSRC = $(LIBSRC)/Xi SOXINPUTREV = 6.0 DEPXILIB = XILIB = -lXi LINTXI = $(XILIBSRC)/llib-Xi.ln XTESTLIBSRC = $(LIBSRC)/Xtst SOXTESTREV = 6.0 DEPXTESTLIB = XTESTLIB = -lXtst LINTXTEST = $(XTESTLIBSRC)/llib-Xtst.ln PEXLIBSRC = $(LIBSRC)/PEX5 SOPEXREV = 6.0 DEPPEXLIB = PEXLIB = -lPEX5 LINTPEX = $(PEXLIBSRC)/llib-PEX5.ln XIELIBSRC = $(LIBSRC)/XIE SOXIEREV = 6.0 DEPXIELIB = XIELIB = -lXIE LINTXIE = $(XIELIBSRC)/llib-XIE.ln PHIGSLIBSRC = $(LIBSRC)/PHIGS DEPPHIGSLIB = $(BUILDLIBDIR)/libphigs.a PHIGSLIB = -lphigs LINTPHIGS = $(PHIGSLIBSRC)/llib-phigs.ln DEPXBSDLIB = $(BUILDLIBDIR)/libXbsd.a XBSDLIB = -lXbsd LINTXBSD = $(LIBSRC)/Xbsd/llib-Xbsd.ln ICESRC = $(LIBSRC)/ICE SOICEREV = 6.0 DEPICELIB = ICELIB = -lICE LINTICE = $(ICESRC)/llib-ICE.ln SMSRC = $(LIBSRC)/SM SOSMREV = 6.0 DEPSMLIB = SMLIB = -lSM LINTSM = $(SMSRC)/llib-SM.ln FSLIBSRC = $(LIBSRC)/FS DEPFSLIB = $(BUILDLIBDIR)/libFS.a FSLIB = -lFS LINTFS = $(FSLIBSRC)/llib-FS.ln FONTLIBSRC = $(LIBSRC)/font DEPFONTLIB = $(BUILDLIBDIR)/libfont.a FONTLIB = -lfont LINTFONT = $(FONTLIBSRC)/llib-font.ln DEPLIBS = $(DEPXAWLIB) $(DEPXMULIB) $(DEPXTOOLLIB) $(DEPXLIB) DEPLIBS1 = $(DEPLIBS) DEPLIBS2 = $(DEPLIBS) DEPLIBS3 = $(DEPLIBS) CONFIGDIR = $(LIBDIR)/config # ----------------------------------------------------------------------- # start of Imakefile IMDLIB = -L../IMdkit -lXimd DEPLIBS = $(DEPXONLYLIB) INCLUDES = -I../IMdkit LOCAL_LIBRARIES = $(IMDLIB) $(XONLYLIB) SRCS = sampleIM.c IC.c OBJS = sampleIM.o IC.o CDEBUGFLAGS = -g PROGRAM = sampleIM PROGRAM = sampleIM all:: sampleIM sampleIM: $(OBJS) $(DEPLIBS) $(RM) $@ $(CCLINK) -o $@ $(LDOPTIONS) $(OBJS) $(LOCAL_LIBRARIES) $(LDLIBS) $(EXTRA_LOAD_FLAGS) install:: sampleIM @if [ -d $(DESTDIR)$(BINDIR) ]; then set +x; \ else (set -x; $(MKDIRHIER) $(DESTDIR)$(BINDIR)); fi $(INSTALL) $(INSTALLFLAGS) $(INSTPGMFLAGS) sampleIM $(DESTDIR)$(BINDIR)/sampleIM install.man:: sampleIM.man @if [ -d $(DESTDIR)$(MANDIR) ]; then set +x; \ else (set -x; $(MKDIRHIER) $(DESTDIR)$(MANDIR)); fi $(INSTALL) $(INSTALLFLAGS) $(INSTMANFLAGS) sampleIM.man $(DESTDIR)$(MANDIR)/sampleIM.$(MANSUFFIX) depend:: $(DEPEND) $(DEPEND): @echo "checking $@ over in $(DEPENDSRC) first..."; \ cd $(DEPENDSRC); $(MAKE); \ echo "okay, continuing in $(CURRENT_DIR)" depend:: $(DEPEND) $(DEPENDFLAGS) -- $(ALLDEFINES) $(DEPEND_DEFINES) -- $(SRCS) lint: $(LINT) $(LINTFLAGS) $(SRCS) $(LINTLIBS) lint1: $(LINT) $(LINTFLAGS) $(FILE) $(LINTLIBS) clean:: $(RM) sampleIM # ----------------------------------------------------------------------- # common rules for all Makefiles - do not edit .c.i: $(RM) $@ $(CC) -E $(CFLAGS) $(_NOOP_) $*.c > $@ emptyrule:: clean:: $(RM_CMD) *.CKP *.ln *.BAK *.bak *.o core errs ,* *~ *.a .emacs_* tags TAGS make.log MakeOut "#"* Makefile:: $(IMAKE) $(IMAKE): -@(cd $(IMAKESRC); if [ -f Makefile ]; then \ echo "checking $@ in $(IMAKESRC) first..."; $(MAKE) all; else \ echo "bootstrapping $@ from Makefile.ini in $(IMAKESRC) first..."; \ $(MAKE) -f Makefile.ini BOOTSTRAPCFLAGS="$(BOOTSTRAPCFLAGS)"; fi; \ echo "okay, continuing in $(CURRENT_DIR)") Makefile:: -@if [ -f Makefile ]; then set -x; \ $(RM) Makefile.bak; $(MV) Makefile Makefile.bak; \ else exit 0; fi $(IMAKE_CMD) -DTOPDIR=$(TOP) -DCURDIR=$(CURRENT_DIR) tags:: $(TAGS) -w *.[ch] $(TAGS) -xw *.[ch] > TAGS # ----------------------------------------------------------------------- # empty rules for directories that do not have SUBDIRS - do not edit install:: @echo "install in $(CURRENT_DIR) done" install.man:: @echo "install.man in $(CURRENT_DIR) done" install.linkkit:: @echo "install.linkkit in $(CURRENT_DIR) done" Makefiles:: includes:: depend:: # ----------------------------------------------------------------------- # dependencies generated by makedepend # DO NOT DELETE sampleIM.o: /usr/include/stdio.h /usr/include/sys/feature_tests.h sampleIM.o: /usr/include/locale.h ../../../../xc/X11/Xlib.h sampleIM.o: /usr/include/sys/types.h /usr/include/sys/isa_defs.h sampleIM.o: /usr/include/sys/machtypes.h /usr/include/sys/select.h sampleIM.o: /usr/include/sys/time.h /usr/include/sys/time.h sampleIM.o: ../../../../xc/X11/X.h ../../../../xc/X11/Xfuncproto.h sampleIM.o: ../../../../xc/X11/Xosdefs.h /usr/include/stddef.h sampleIM.o: ../../../../xc/X11/Xutil.h ../../../../xc/X11/keysym.h sampleIM.o: ../../../../xc/X11/keysymdef.h ../../../../xc/X11/Ximd/IMdkit.h sampleIM.o: ../../../../xc/X11/Xmd.h ../../../../xc/X11/Ximd/Xi18n.h sampleIM.o: ../../../../xc/X11/Xfuncs.h /usr/include/string.h sampleIM.o: ../../../../xc/X11/Xos.h /usr/include/fcntl.h sampleIM.o: /usr/include/sys/fcntl.h /usr/include/unistd.h sampleIM.o: /usr/include/sys/unistd.h ../IMdkit/XimProto.h sampleIM.o: /usr/include/stdlib.h ../../../../xc/X11/Ximd/IMdkit.h IC.o: ../../../../xc/X11/Xlib.h /usr/include/sys/types.h IC.o: /usr/include/sys/feature_tests.h /usr/include/sys/isa_defs.h IC.o: /usr/include/sys/machtypes.h /usr/include/sys/select.h IC.o: /usr/include/sys/time.h /usr/include/sys/time.h ../../../../xc/X11/X.h IC.o: ../../../../xc/X11/Xfuncproto.h ../../../../xc/X11/Xosdefs.h IC.o: /usr/include/stddef.h ../../../../xc/X11/Ximd/IMdkit.h IC.o: ../../../../xc/X11/Xmd.h ../../../../xc/X11/Ximd/Xi18n.h IC.o: ../../../../xc/X11/Xfuncs.h /usr/include/string.h IC.o: ../../../../xc/X11/Xos.h /usr/include/fcntl.h /usr/include/sys/fcntl.h IC.o: /usr/include/unistd.h /usr/include/sys/unistd.h ../IMdkit/XimProto.h IC.o: /usr/include/stdlib.h ../../../../xc/X11/Ximd/IMdkit.h IC.h nabi-1.0.0/IMdkit/doc/Xi18n_sample/README0000644000175000017500000000522011655153252014424 00000000000000NAME sampleIM - sample Japanese Input Method Server using IMdkit SYNOPSIS sampleIM [-display displayname] [-name imname] [-static] [-dynamic] [-tcp] [-local] [-offkey] [-kl] DESCRIPTION SampleIM you see here is an sample Input Method Server which utilizes the IM Server Developers Kit so that it can connect with XIM client applications through the X Input Method Protocol(XIM Protocol) which is standardized in the X Window System, Version 11, Release 6. The sampleIM is just sample, so remember that it can be used just for test of IMServer Developers Kit, and note that it should be invoked under Japanese EUC locale such as "ja_JP.eucJP", because it contains the Japanese EUC localized characters for the sample committed string: for csh family % env LC_ALL=ja_JP.eucJP sampleIM for ksh family $ LC_ALL=ja_JP.eucJP sampleIM OPTIONS The sampleIM accepts the following options: -display displayname This options specifies the display name. -name imname This options specifies the name which is used as a part of the sampleIM identifiers by which XIM clients will search for the sampleIM. The default is "sampleIM". -static | -dynamic Each of these options specifies the type of the XIM Protocol event flow model, static or dynamic. Either of these should be given at the same time if any. The default is dynamic event flow model. For more information for event flow model, see "the X Input Method Protocol" document. -tcp | -local Each of these options changes the type of the transport connection mechanism. When -tcp is given, TCP/IP Internet domain will be used, while -local is given, TCP/IP internal domain will be used. Either of these should be given at the same time if any. If neither of these specifies, the default is X-based transport mechanism. -offkey This option indicates that the sampleIM should inform the IM library of off keys, as well as on keys, by which the input conversion will be terminated. (For more information, refer to the XIM_REGISTER_TRIGGERKEYS message in the IM Protocol document.) This option has an effect in case of the dynamic event flow model. When this option is specified, both on/off operation is kicked from the IM library, while unspecified, the off operation is kicked from the sampleIM and this is the default. -kl This option indicates that KeyRelease events should be also filtered by the sampleIM. OPERATIONS Shift-Space start and stop filtering key events. While filtering, the sampleIM just prints the string into the standard out instead of preediting. Ctrl-k commit the sample Japanese EUC characters: " IM γʸǤ" nabi-1.0.0/IMdkit/doc/Xi18n_sample/sampleIM.c0000644000175000017500000003260311655153252015424 00000000000000/****************************************************************** Copyright 1994, 1995 by Sun Microsystems, Inc. Copyright 1993, 1994 by Hewlett-Packard Company Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation, and that the name of Sun Microsystems, Inc. and Hewlett-Packard not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. Sun Microsystems, Inc. and Hewlett-Packard make no representations about the suitability of this software for any purpose. It is provided "as is" without express or implied warranty. SUN MICROSYSTEMS INC. AND HEWLETT-PACKARD COMPANY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SUN MICROSYSTEMS, INC. AND HEWLETT-PACKARD COMPANY BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. Author: Hidetoshi Tajima(tajima@Eng.Sun.COM) Sun Microsystems, Inc. ******************************************************************/ #include #include #include #include #include #include #include #define DEFAULT_IMNAME "sampleIM" #define DEFAULT_LOCALE "zh_TW,ja_JP" /* flags for debugging */ Bool use_trigger = True; /* Dynamic Event Flow is default */ Bool use_offkey = False; /* Register OFF Key for Dynamic Event Flow */ Bool use_tcp = False; /* Using TCP/IP Transport or not */ Bool use_local = False; /* Using Unix domain Tranport or not */ long filter_mask = KeyPressMask; /* Supported Inputstyles */ static XIMStyle Styles[] = { XIMPreeditCallbacks|XIMStatusCallbacks, XIMPreeditPosition|XIMStatusArea, XIMPreeditPosition|XIMStatusNothing, XIMPreeditArea|XIMStatusArea, XIMPreeditNothing|XIMStatusNothing, 0 }; /* Trigger Keys List */ static XIMTriggerKey Trigger_Keys[] = { {XK_space, ShiftMask, ShiftMask}, {0L, 0L, 0L} }; /* Conversion Keys List */ static XIMTriggerKey Conversion_Keys[] = { {XK_k, ControlMask, ControlMask}, {0L, 0L, 0L} }; /* Forward Keys List */ static XIMTriggerKey Forward_Keys[] = { {XK_Return, 0, 0}, {XK_Tab, 0, 0}, {0L, 0L, 0L} }; /* Supported Taiwanese Encodings */ static XIMEncoding zhEncodings[] = { "COMPOUND_TEXT", NULL }; MyGetICValuesHandler(ims, call_data) XIMS ims; IMChangeICStruct *call_data; { GetIC(call_data); return True; } MySetICValuesHandler(ims, call_data) XIMS ims; IMChangeICStruct *call_data; { SetIC(call_data); return True; } MyOpenHandler(ims, call_data) XIMS ims; IMOpenStruct *call_data; { #ifdef DEBUG printf("new_client lang = %s\n", call_data->lang.name); printf(" connect_id = 0x%x\n", (int)call_data->connect_id); #endif return True; } MyCloseHandler(ims, call_data) XIMS ims; IMOpenStruct *call_data; { #ifdef DEBUG printf("closing connect_id 0x%x\n", (int)call_data->connect_id); #endif return True; } MyCreateICHandler(ims, call_data) XIMS ims; IMChangeICStruct *call_data; { CreateIC(call_data); return True; } MyDestroyICHandler(ims, call_data) XIMS ims; IMChangeICStruct *call_data; { DestroyIC(call_data); return True; } #define STRBUFLEN 64 IsKey(ims, call_data, trigger) XIMS ims; IMForwardEventStruct *call_data; XIMTriggerKey *trigger; /* Searching for these keys */ { char strbuf[STRBUFLEN]; KeySym keysym; int i; int modifier; int modifier_mask; XKeyEvent *kev; memset(strbuf, 0, STRBUFLEN); kev = (XKeyEvent*)&call_data->event; XLookupString(kev, strbuf, STRBUFLEN, &keysym, NULL); for (i = 0; trigger[i].keysym != 0; i++) { modifier = trigger[i].modifier; modifier_mask = trigger[i].modifier_mask; if (((KeySym)trigger[i].keysym == keysym) && ((kev->state & modifier_mask) == modifier)) return True; } return False; } ProcessKey(ims, call_data) XIMS ims; IMForwardEventStruct *call_data; { char strbuf[STRBUFLEN]; KeySym keysym; XKeyEvent *kev; int count; fprintf(stderr, "Processing \n"); memset(strbuf, 0, STRBUFLEN); kev = (XKeyEvent*)&call_data->event; count = XLookupString(kev, strbuf, STRBUFLEN, &keysym, NULL); if (count > 0) { fprintf(stdout, "[%s] ", strbuf); } } MyForwardEventHandler(ims, call_data) XIMS ims; IMForwardEventStruct *call_data; { /* Lookup KeyPress Events only */ fprintf(stderr, "ForwardEventHandler\n"); if (call_data->event.type != KeyPress) { fprintf(stderr, "bogus event type, ignored\n"); return True; } /* In case of Static Event Flow */ if (!use_trigger) { static Bool preedit_state_flag = False; if (IsKey(ims, call_data, Trigger_Keys)) { preedit_state_flag = !preedit_state_flag; return True; } } /* In case of Dynamic Event Flow without registering OFF keys, the end of preediting must be notified from IMserver to IMlibrary. */ if (use_trigger && !use_offkey) { if (IsKey(ims, call_data, Trigger_Keys)) { return IMPreeditEnd(ims, (XPointer)call_data); } } if (IsKey(ims, call_data, Conversion_Keys)) { XTextProperty tp; Display *display = ims->core.display; /* char *text = "oO@ IM A"; */ char *text = "üy"; char **list_return; /* [20]; */ int count_return; /* [20]; */ fprintf(stderr, "matching ctrl-k...\n"); XmbTextListToTextProperty(display, (char **)&text, 1, XCompoundTextStyle, &tp); ((IMCommitStruct*)call_data)->flag |= XimLookupChars; ((IMCommitStruct*)call_data)->commit_string = (char *)tp.value; fprintf(stderr, "commiting string...(%s)\n", tp.value); IMCommitString(ims, (XPointer)call_data); #if 0 XmbTextPropertyToTextList(display, &tp, &list_return, &count_return); fprintf(stderr, "converted back: %s\n", *list_return); #endif XFree(tp.value); fprintf(stderr, "survived so far..\n"); } else if (IsKey(ims, call_data, Forward_Keys)) { IMForwardEventStruct forward_ev = *((IMForwardEventStruct *)call_data); fprintf(stderr, "TAB and RETURN forwarded...\n"); IMForwardEvent(ims, (XPointer)&forward_ev); } else { ProcessKey(ims, call_data); } return True; } MyTriggerNotifyHandler(ims, call_data) XIMS ims; IMTriggerNotifyStruct *call_data; { if (call_data->flag == 0) { /* on key */ /* Here, the start of preediting is notified from IMlibrary, which is the only way to start preediting in case of Dynamic Event Flow, because ON key is mandatary for Dynamic Event Flow. */ return True; } else if (use_offkey && call_data->flag == 1) { /* off key */ /* Here, the end of preediting is notified from the IMlibrary, which happens only if OFF key, which is optional for Dynamic Event Flow, has been registered by IMOpenIM or IMSetIMValues, otherwise, the end of preediting must be notified from the IMserver to the IMlibrary. */ return True; } else { /* never happens */ return False; } } MyPreeditStartReplyHandler(ims, call_data) XIMS ims; IMPreeditCBStruct *call_data; { } MyPreeditCaretReplyHandler(ims, call_data) XIMS ims; IMPreeditCBStruct *call_data; { } MyProtoHandler(ims, call_data) XIMS ims; IMProtocol *call_data; { switch (call_data->major_code) { case XIM_OPEN: fprintf(stderr, "XIM_OPEN:\n"); return MyOpenHandler(ims, call_data); case XIM_CLOSE: fprintf(stderr, "XIM_CLOSE:\n"); return MyCloseHandler(ims, call_data); case XIM_CREATE_IC: fprintf(stderr, "XIM_CREATE_IC:\n"); return MyCreateICHandler(ims, call_data); case XIM_DESTROY_IC: fprintf(stderr, "XIM_DESTROY_IC.\n"); return MyDestroyICHandler(ims, call_data); case XIM_SET_IC_VALUES: fprintf(stderr, "XIM_SET_IC_VALUES:\n"); return MySetICValuesHandler(ims, call_data); case XIM_GET_IC_VALUES: fprintf(stderr, "XIM_GET_IC_VALUES:\n"); return MyGetICValuesHandler(ims, call_data); case XIM_FORWARD_EVENT: return MyForwardEventHandler(ims, call_data); case XIM_SET_IC_FOCUS: fprintf(stderr, "XIM_SET_IC_FOCUS()\n"); return True; case XIM_UNSET_IC_FOCUS: fprintf(stderr, "XIM_UNSET_IC_FOCUS:\n"); return True; case XIM_RESET_IC: fprintf(stderr, "XIM_RESET_IC_FOCUS:\n"); return True; case XIM_TRIGGER_NOTIFY: fprintf(stderr, "XIM_TRIGGER_NOTIFY:\n"); return MyTriggerNotifyHandler(ims, call_data); case XIM_PREEDIT_START_REPLY: fprintf(stderr, "XIM_PREEDIT_START_REPLY:\n"); return MyPreeditStartReplyHandler(ims, call_data); case XIM_PREEDIT_CARET_REPLY: fprintf(stderr, "XIM_PREEDIT_CARET_REPLY:\n"); return MyPreeditCaretReplyHandler(ims, call_data); default: fprintf(stderr, "Unknown IMDKit Protocol message type\n"); break; } } void MyXEventHandler(im_window, event) Window im_window; XEvent *event; { fprintf(stderr, "Local Event\n"); switch (event->type) { case DestroyNotify: break; case ButtonPress: switch (event->xbutton.button) { case Button3: if (event->xbutton.window == im_window) goto Exit; break; } default: break; } return; Exit: XDestroyWindow(event->xbutton.display, im_window); exit(0); } main(argc, argv) int argc; char **argv; { char *display_name = NULL; Display *dpy; char *imname = NULL; XIMS ims; XIMStyles *input_styles, *styles2; XIMTriggerKeys *on_keys, *trigger2; XIMEncodings *encodings, *encoding2; Window im_window; register int i; char transport[80]; /* enough */ for (i = 1; i < argc; i++) { if (!strcmp(argv[i], "-name")) { imname = argv[++i]; } else if (!strcmp(argv[i], "-display")) { display_name = argv[++i]; } else if (!strcmp(argv[i], "-dynamic")) { use_trigger = True; } else if (!strcmp(argv[i], "-static")) { use_trigger = False; } else if (!strcmp(argv[i], "-tcp")) { use_tcp = True; } else if (!strcmp(argv[i], "-local")) { use_local = True; } else if (!strcmp(argv[i], "-offkey")) { use_offkey = True; } else if (!strcmp(argv[i], "-kl")) { filter_mask = (KeyPressMask|KeyReleaseMask); } } if (!imname) imname = DEFAULT_IMNAME; setlocale(LC_CTYPE, "zh_TW"); if ((dpy = XOpenDisplay(display_name)) == NULL) { fprintf(stderr, "Can't Open Display: %s\n", display_name); exit(1); } im_window = XCreateSimpleWindow(dpy, DefaultRootWindow(dpy), 0, 700, 400, 800-700, 0, WhitePixel(dpy, DefaultScreen(dpy)), WhitePixel(dpy, DefaultScreen(dpy))); if (im_window == (Window)NULL) { fprintf(stderr, "Can't Create Window\n"); exit(1); } XStoreName(dpy, im_window, "sampleIM"); XSetTransientForHint(dpy, im_window, im_window); if ((input_styles = (XIMStyles *)malloc(sizeof(XIMStyles))) == NULL) { fprintf(stderr, "Can't allocate\n"); exit(1); } input_styles->count_styles = sizeof(Styles)/sizeof(XIMStyle) - 1; input_styles->supported_styles = Styles; if ((on_keys = (XIMTriggerKeys *) malloc(sizeof(XIMTriggerKeys))) == NULL) { fprintf(stderr, "Can't allocate\n"); exit(1); } on_keys->count_keys = sizeof(Trigger_Keys)/sizeof(XIMTriggerKey) - 1; on_keys->keylist = Trigger_Keys; if ((encodings = (XIMEncodings *)malloc(sizeof(XIMEncodings))) == NULL) { fprintf(stderr, "Can't allocate\n"); exit(1); } encodings->count_encodings = sizeof(zhEncodings)/sizeof(XIMEncoding) - 1; encodings->supported_encodings = zhEncodings; if (use_local) { char hostname[64]; char *address = "/tmp/.ximsock"; gethostname(hostname, 64); sprintf(transport, "local/%s:%s", hostname, address); } else if (use_tcp) { char hostname[64]; int port_number = 9010; gethostname(hostname, 64); sprintf(transport, "tcp/%s:%d", hostname, port_number); } else { strcpy(transport, "X/"); } ims = IMOpenIM(dpy, IMModifiers, "Xi18n", IMServerWindow, im_window, IMServerName, imname, IMLocale, DEFAULT_LOCALE, IMServerTransport, transport, IMInputStyles, input_styles, NULL); if (ims == (XIMS)NULL) { fprintf(stderr, "Can't Open Input Method Service:\n"); fprintf(stderr, "\tInput Method Name :%s\n", imname); fprintf(stderr, "\tTranport Address:%s\n", transport); exit(1); } if (use_trigger) { if (use_offkey) IMSetIMValues(ims, IMOnKeysList, on_keys, IMOffKeysList, on_keys, NULL); else IMSetIMValues(ims, IMOnKeysList, on_keys, NULL); } IMSetIMValues(ims, IMEncodingList, encodings, IMProtocolHandler, MyProtoHandler, IMFilterEventMask, filter_mask, NULL); IMGetIMValues(ims, IMInputStyles, &styles2, IMOnKeysList, &trigger2, IMOffKeysList, &trigger2, IMEncodingList, &encoding2, NULL); XSelectInput(dpy, im_window, StructureNotifyMask|ButtonPressMask); XMapWindow(dpy, im_window); XFlush(dpy); /* necessary flush for tcp/ip connection */ for (;;) { XEvent event; XNextEvent(dpy, &event); if (XFilterEvent(&event, None) == True) { fprintf(stderr, "window %ld\n",event.xany.window); continue; } MyXEventHandler(im_window, &event); } } nabi-1.0.0/IMdkit/doc/API.text0000644000175000017500000007331411655153252012624 00000000000000 IM Server Developers Kit - C Language Interface Hidetoshi Tajima X11R6 Xi18n Implementation Group May 15, 1994 1. Functions List 1.1. Open IM Servive XIMS IMOpenIM(Display display,...) display specifies the connection to the X server. ... specifies the variable length argument list to set IMValues. For further information, see the Section 2 "IMValues". IMOpenIM initializes the connection for the Input Method Service, and also sets one or more IMValues which are specified by a variable length argument list programming interface, and when succeeding to open the connection, IMOpenIM allocates a new XIMS structure and returns it, otherwise IMOpenIM returns NULL. XIMS is an opaque data structure to abstract the Input Method Service. First, IMOpenIM initializes a preconnection method by which clients can search for the IMserver. The convention of the preconnection varies with the IMProtocol model as below, however, you don't have to pay much attention to such difference, because IMOpenIM encapsulates it. Preconnection for R5 Ximp IMserver must create the selection owner window of the ATOM for the string, such as "_XIMP_%locale" or something, which are used by clients to search for the IMserver. Preconnection for R6 IMProtocol IMserver must create the selection owner window of the ATOM for the string, such as "@server=%im_name", and registers the ATOM with the list of "XIM_SERVERS" property of the default root window, which contains a list of ATOMs, each of which represents each available IMservers on the display. Second, IMOpenIM initialize a transport connection on which clients and the IMserver can send and receive IMProtocols with each other. The procedures to initialize the transport connection varies with the transport mechanism as below, however, you don't have to pay any attention to such difference, either, because IMOpenIM also encapsulates it. Transport connection for X IMserver must intern a number of ATOMs for the properties which are used to set some IMserver specific feature and characteristic. Transport connection for TCP/IP IMserver must open a listening socket to wait for connection request from clients. 1.2. Set IM Attributes char *IMSetIMValues(XIMS ims,...) ims specifies the input method service. ... specifies the variable length argument list to set IMValues. IMSetIMValues registers one or more IMValues, which are specified by a variable length argument list programming interface, with the XIMS structure. Note that IMOpenIM is also used to set all IMValues, and some IMValues must be set when IMOpenIM is called. IMSetIMValues returns NULL if it succeeds to set all the IMValues, otherwise, it returns the name of the first argument whose value could not be registered. 1.3. Get IM Attributes char *IMGetIMValues(XIMS ims,...) ims specifies the input method service. ... specifies the variable length argument list to get IMValues. IMGetIMValues gets one or more IMValues, which are specified by a variable length argument list programming interface, from the XIMS structure. IMGetIMValues returns NULL if it succeeds to get all the IMValues, otherwise, it returns the name of the first argument whose value could not be obtained. 1.4. Close IM Service void IMCloseIM(XIMS ims) ims specifies the input method service to be closed. IMCloseIM closes the connection which was opened by IMOpenIM. IMCloseIM frees all the allocated data in the XIMS structure, then frees the XIMS itself. 1.5. Start Preediting int IMPreeditStart(XIMS ims, XPointer im_protocol) ims specifies the input method service. im_protocol specifies the Input Protocol data. IMPreeditStart is used to start preeditting in case of Dynamic Event Flow. The structure for im_protocol varies with the IMProtocol models: /* R5 Ximp */ typedef struct { INT32 type; CARD32 icid; Window focus_win; long fwin_sel_mask; CARD32 ximp_type_mask; Window client_win; } XIMPPreeditStateStruct; /* R6 IMProtocol */ typedef struct { int major_code; int minor_code; CARD16 connect_id; CARD16 icid; } IMPreeditStateStruct; 1.6. Stop Preediting int IMPreeditEnd(XIMS ims, XPointer im_protocol) ims specifies the input method service. im_protocol specifies the Input Protocol data. IMPreeditEnd is used to stop preeditting in case of Dynamic Event Flow. However, if you registered off-keys list using IMOffKeysList IMValue, you might not need to use IMPreeditEnd, because IMdkit calls IMPreeditEnd internally when it receives a key event matching one of the registered off-keys. So, you are greatly encouraged to use IMPreeditEnd only when you did *NOT* register any off-keys list. 1.7. Forward back KeyEvent void IMForwardEvent(XIMS ims, XPointer im_protocol) ims specifies the input method service. im_protocol specifies the Input Protocol data. IMForwardEvent is used to send back a non-filtered KeyPress/KeyRelease Event. The structure for im_protocol varies with the IMProtocol models: /* R5 Ximp */ typedef struct { INT32 type; CARD32 icid; Window focus_win; long fwin_sel_mask; CARD32 ximp_type_mask; Window client_win; CARD32 keycode; CARD32 state; CARD32 time; } XIMPKeyEventStruct; /* R6 IMProtocol */ typedef struct { int major_code; int minor_code; CARD16 connect_id; CARD16 icid; /* input context ID */ BITMASK16 sync_bit; /* precessed synchronously or not */ CARD16 serial_number; XEvent event; /* X event to be filtered */ } IMForwardEventStruct; 1.8. Commit Conversion String void IMCommitString(XIMS ims, XPointer im_protocol) ims specifies the input method service. im_protocol specifies the Input Protocol data. IMCommitString is used to send a committed string, which may contain a localized text converted by the IMserver. The structure for im_protocol varies with the IMProtocol models: /* R5 Ximp */ typedef struct { INT32 type; CARD32 icid; Window focus_win; long fwin_sel_mask; CARD32 ximp_type_mask; Window client_win; char *ctext; } XIMPCommitStringStruct; /* R6 IMProtocol */ typedef struct { int major_code; int minor_code; CARD16 connect_id; CARD16 icid; /* input context ID */ CARD16 flag; /* bit combination to tell the receiver what to do */ #0001 : process it synchroously, return XIM_SYNC_REPLY #0002 : Lookup Chars #0004 : Lookup KeySym #0006 : Lookup Both = Lookup Chars and KeySym */ KeySym keysym; /* returned keysym */ char *commit_string; /* string to commit to XIM client */ } IMCommitStruct; 1.9. Call Callback int IMCallCallback(XIMS ims, XPointer im_protocol) ims specifies the input method service. im_protocol specifies the Input Protocol data. IMCallCallback is used for your IMserver to send a callback request asynchronously with the previous IMProtocol request. The type of the callback request must be set in the proper members of the im_protocol data structure by your IMserver. In addition, it's up to you to declare a new IMProtocol structure before you begin the callback requests. The structures for im_protocol varies with the IMProtocol models: /* R6 IMProtocol */ The type of the callback request must be set in major_code and minor_code members in the IMProtocol structure, e.g., you can start geometry management callback as follows; IMGeometryCBStruct geometry; ... geometry.major_code = XIM_GEOMETRY; geometry.connect_id = previous_request->any.connect_id; ... IMCallCallback(ims, (IMProtocol)&geometry); The structures for R6 IMProtocol callbacks contain: /* for Geometry Callback */ typedef struct { int major_code; int minor_code; CARD16 connect_id; CARD16 icid; } IMGeometryCBStruct; /* for Preedit Callback */ typedef struct { int major_code; int minor_code; CARD16 connect_id; CARD16 icid; union { int return_value; /* PreeditStart */ XIMPreeditDrawCallbackStruct draw; /* PreeditDraw */ XIMPreeditCaretCallbackStruct caret; /* PreeditCaret */ } todo; } IMPreeditCBStruct; /* for Status Callback */ typedef struct { int major_code; int minor_code; CARD16 connect_id; CARD16 icid; union { XIMStatusDrawCallbackStruct draw; } todo; } IMStatusCBStruct; The structures for R5 Ximp callbacks contain: /* for Geometry Callback */ typedef struct { INT32 type; CARD32 icid; Window focus_win; long fwin_sel_mask; CARD32 ximp_type_mask; Window client_win; } XIMPAnyStruct; /* for Preedit Callback */ typedef struct { INT32 type; CARD32 icid; Window focus_win; long fwin_sel_mask; CARD32 ximp_type_mask; Window client_win; union { int return_value; /* PreeditStart */ XIMPreeditDrawCallbackStruct draw; /* PreeditDraw */ XIMPreeditCaretCallbackStruct caret; /* PreeditCaret */ } todo; } XIMPPreeditCBStruct; /* for Status Callback */ typedef struct { INT32 type; CARD32 icid; Window focus_win; long fwin_sel_mask; CARD32 ximp_type_mask; Window client_win; union { XIMStatusDrawCallbackStruct draw; /* StatusDraw */ } todo; } XIMPStatusCBStruct; 2. IMValues 2.1. IMModifiers The IMModifiers argument, of type string, specifies the name of the IMProtocol model. At the current release, only three names are accepted by IMdkit. "Xi18n" specifies the R6 standard IMProtocol model "XIMP" specifies the R5 Ximp model. The IMModifiers argument must be set only once when IMOpenIM is called, and never be changed on the fly. 2.2. IMServerWindow The IMServerWindow argument, of type Window, specifies the window which identifies a method of preconnection with XIM clients. In addition to this primary purpose, the IMServerWindow might be used for any other purposes, which depends on the IMProtocol model to be used. If this argument is unspecified, a default window might be provided by IMdkit, which depends on the IMProtocol model to be used, and if it is specified, it must be done only once by either IMOpenIM or IMSetIMValues, and never be changed on the fly. 2.3. IMServerName The IMServerName argument, of type string, specifies the name of the IMserver. This argument might be a part of the IMserver identifiers by which XIM clients will search for the IMserver. The IMServerName argument must be set only once when IMOpenIM is called, and never be changed on the fly. 2.4. IMLocale The IMLocale argument, of type string, specifies a list of locales the IMserver supports. This argument might be a part of the IMserver identifiers which is used for XIM clients to search for the IMserver. The IMLocale argument must be set only once when IMOpenIM is called, and never be changed on the fly. 2.5. IMServerTransport The IMServerTransport argument, of type string, specifies the name for the transport connection mechanism the IMserver uses. This argument might be a part of the IMserver identifiers which is used for XIM clients to search for the IMserver. The preregistered formats for this argument are as follows.(*1) (*1) Reter to "The Input Method Protocol", Appendix B: The list of transport specific IM Server address format registered TCP/IP Names ------------ Syntax for Internet domain names: ::= "tcp/"":" where is either symbolic or numeric decimal form of the host machine name, and is the port on which the IMserver is listening for connections. Syntax for system internal domain names: ::= "locale/"":" where is a path name of socket address. DECnet Names ------------ Syntax for DECnet names: ::= "decnet/""::IMSERVER$" where is either symbolic or numeric decimal form of the DECnet address, and is normal, case-insensitive DECnet object name. X Names ------- Syntax for X names: ::= "X/" The IMServerTransport argument must be set only once when IMOpenIM is called, and never be changed on the fly. 2.6. IMInputStyles The IMInputStyles argument, of type XIMStyles, specifies a list of the input styles the IMserver supports. If this argument is unspecified, a default list might be provided by IMdkit, which depends on the IMProtocol model to be used, and it can be set by either IMOpenIM or IMSetIMValues, but should not be changed on the fly. 2.7. IMProtocolHandler The IMProtocolHandler argument, of type IMProtoHandler, specifies the callback function which is called each time when IMMainLoop receives an IMProtocol input from XIM clients. The generic prototype of the IMProtocolHandler function is; typedef int (*IMProtoHandler)(); int ProtocolHandlerProc(ims, call_data) XIMS ims; XPointer call_data; call_data points to a IMProtocol structure. 2.8. IMOnKeysList The IMOnKeysList argument, of type XIMTriggerKeys, specifies the list of preediting start-keys for Dynamic Event Flow model. The IMOnKeysList IMValue is mandatary for IMserver to support Dynamic Event Flow Model, so that the IMlibrary can send the IMserver a request to start preediting with the apperance of one of these registered on-keys. If the IMOnKeysList is left unspecified, no default will be provided, and Static Event Flow model will be used. XIMTriggerKeys structure is defined by IMdkit as follows: typedef struct { CARD32 keysym; CARD32 modifier; CARD32 modifier_mask; } XIMTriggerKey; typedef struct { unsigned short count_keys; XIMTriggerKey *keylist; } XIMTriggerKeys; 2.9. IMOffKeysList The IMOnKeysList argument, of type XIMTriggerKeys, specifies the list of preediing end-keys for Dynamic Event Flow model. The IMOffKeysList IMValue is optional for IMserver to support Dynamic Event Flow Model. When it is specified, the IMlibrary can send the IMserver a request to stop preediting with the apperance of one of these registered off-keys, while it's unspecified, the IMserver calls IMPreeditEnd to notify the IMlibrary to stop preeditting when the IMserver would like to stop preeditring. If the IMOffKeysList is left unspecified, no default will be provided. 2.10. IMEncodingList The IMEncodingList argument, of type XIMEncodings, specifies the list of encodings the IMserver supports. XIM client will be notified of this argument immediately after it makes a connection with the IMserver. The IMEncdoingList argument is used to specify which encodings can be used to exchange localized-text between the IMserver and XIM clients. If it's left unspecified, only "COMPOUND_TEXT" encoding will be used as a fallback default. XIMEncodings structure is defined by IMdkit as follows: typedef char *XIMEncoding; typedef struct { unsigned short count_encodings; XIMEncoding *supported_encodings; } XIMEncodings; 2.11. IMFilterEventMask The IMFilterEventMask argument, of type long, specifies the events which should be filtered by the IMserver during the preeditting is on going. If it's left unspecified, KeyPressMask (1L<<0) will be fallback default. 2.12. IMProtocolDepend The IMProtocolDepend argument is used to specify special IM values for each IMProtocol model, if any. This attribute is passed to IMOpenIM, IMSetIMValues or IMGetIMValues as a nested variable length list generated with XVaCreateNestedList(). At this release, the names in the IMProtocolDepend list are defined only for R5 Ximp model, as below. 2.12.1. R5 Ximp dependent IM Values XIMPVersion The XIMPVersion argument, of type string, specifies the version of R5 Ximp model. value meaning --------------------------------------------- "3.5" supports Ximp version 3.5 model "4.0" supports Ximp version 4.0 model XIMPType The XIMPVersion argument, pointer to a list of type unsigned long, specifies a list of bitmask combinations, each of which indicates the event flow model your IMserver supports. All possible values to be appeared in the list are defined as follows.(*) (*) Refer to "Protocol Specification for the Distributes Input System on the X Window System, Version 11", which contains in X11R5 contribuion. XIMP_BE_TYPE1 back-end type, which IMlibrary recognizes registered keys and notifies a server to start processing key events. XIMP_FE_TYPE1 front-end type, which IMlibrary recognizes registered keys and notifies a server to start processing key events. XIMP_BE_TYPE2 back-end type, which IMlibrary does not recognize any registered keys and. IMserver will always the first to process key events. XIMP_FE_TYPE2 front-end type, which IMlibrary does not recognize any registered keys and. IMserver will always the first to process key events. XIMP_FE_TYPE3 front-end type, which key events are always passed to both IMserver and IMlibrary. Both of them recognize registered keys. XIMP_SYNC_BE_TYPE1 XIMP_BE_TYPE1 & KeyPress is transfered synchronously. XIMP_SYNC_BE_TYPE2 XIMP_BE_TYPE2 & KeyPress is transfered synchronously. XIMPExtension The XIMPExtension argument is used to set/unset the pre-registered extensions to be valid. This list is also a nested variable length list generated with XVaCreateNestedList(). At this release, the pre-registered extensins appeared in the XIMPExtension list are defined as below. XIMPExtStatusWin If it is appeared in the list, the XNExtXimp_StatusWindow input context attribute is valid to set the status window. The attribute value isn't evaluated. XIMPExtBackFront If it is appeared in the list, the XNExtXimp_Backfront input context is valid to select the front-end method or back-end method. The attribute value isn't evaluated. XIMPExtConversion If it is appeared in the list, the XNExtXimp_Conversion input context is valid to set the input mode. The attribute value isn't evaluated. 3. X IMProtocol Strucutures For each X IMProtocol input, a corresponding structure is defined in public header files of IMdkit. defines all IMProtocol structures for R6 standard IMProtocol model, and defines all for R5 Ximp model. 3.1. R6 IMProtocol 3.1.1. IMProtocol union data structure In R6 standard IMProtocol model, all the event structures have the following common members: typedef struct { int major_code; /* major code of last IMProtocol */ int minor_code; /* minor code of last IMProtocol */ CARD16 connect_id; /* client connection ID */ } IMAnyStruct; The major_code and minor_code specify the IMProtocol type constant name that uniquely identifies itself. In addition to the individual structures declared for each IMProtocol type, the IMProtocol structure is a union of the individual structures declared for each IMProtocol type. Depending on the type, you should access members of each IMProtocol by using the IMProtocol union. typedef union _IMProtocol { int major_code; IMAnyStruct any; IMConnectStruct imconnect; IMDisConnectStruct imdisconnect; IMOpenStruct imopen; IMCloseStruct imclose; IMQueryExtensionStruct queryext; IMGetIMValuesStruct getim; IMEncodingNegotiationStruct encodingnego; IMExtSetEventMaskStruct extsetevent; IMExtForwardKeyEventStruct extforward; IMExtMoveStruct extmove; IMSetEventMaskStruct setevent; IMChangeICStruct changeic; IMDestroyICStruct destroyic; IMResetICStruct resetic; IMChangeFocusStruct changefocus; IMCommitStruct commitstring; IMForwardEventStruct forwardevent; IMTriggerNotifyStruct triggernotify; IMErrorStruct imerror; IMGeometryCBStruct geometry_callback; IMPreeditCBStruct preedit_callback; IMStatusCBStruct status_callback; long pad[32]; } IMProtocol; The first two entries of any IMProtocol structure are always the major_code and minor_code members, which specifies the IMProtocol type. The third member is the connect_id member, just provided for IMdkit internal use to distinguish a client from each other. 3.1.2. Protocol Processing Some of IMProtocol requests sent by the IMlibrary are processed internally by IMdkit without passing them to your IMservers, because IMdkit can determin the answer to such IMProtocol requests only by using the IMValues which you have set in the XIMS structure. At this release, the following four IMProtocol requests is processed in IMdkit itself, and wouldn't forward to your IMserver: o XIM_CONNECT -> XIM_CONNECT_REPLY o XIM_DISCONNECT -> XIM_DISCONNECT_REPLY o XIM_QUERY_EXTENSION -> XIM_QUERY_EXTENSION_REPLY o XIM_GET_IM_VALUES -> XIM_GET_IM_VALUES_REPLY So, you don't have to know the details of the corresponding IMProtocol structures for these IMProtocol requests. On the other hand, you will need to deal with the following requests for yourselves: o XIM_OPEN o XIM_CLOSE o XIM_SET_IC_FOCUS and XIM_UNSET_IC_FOCUS o XIM_DESTROY_IC o XIM_RESET_IC o XIM_CREATE_IC, XIM_SET_IC_VALUES and XIM_GET_IC_VALUES o XIM_TRIGGER_NOTIFY o XIM_FORWARD_EVENT However, you don't have to receive any raw packets, but can receive the corresponding IMProtocol structures in your IMProtocolHandler callback function. Further, you don't have to send a reply for yourselves, but IMdkit will send a reply soon after your IMProtocolHandler returns. If your IMProtocolHandler returns True, IMdkit will send the proper reply to the previous request, and if it returns False, IMdkit will send XIM_ERROR reply to the XIM client. The following IMProtocol structures are what you will actually receive instead of IMProtocol requests in your IMProtocolHandler function. IMOpenStruct ------------ The IMOpenStruct structure is used for XIM_OPEN and XIM_OPEN_REPLY requests. The structure contains: typedef struct { int length; char *name; } XIMStr; typedef struct { int major_code; int minor_code; CARD16 connect_id; XIMStr lang; } IMOpenStruct; Your IMserver should check lang field to know which language service is required by the new client, which is identified with connect_id member. IMCloseStruct ------------- The IMCloseStruct structure is used for XIM_CLOSE and XIM_CLOSE_REPLY requests. The structure contains: typedef struct { int major_code; int minor_code; CARD16 connect_id; } IMCloseStruct; Your IMserver should check connect_id member to know which input method connection should be closed. IMChangeFocusStruct ------------------- The IMChangeFocusStruct structure is used for XIM_SET_IC_FOCUS and XIM_UNSET_IC_FOCUS requests. The structure contains: typedef struct { int major_code; int minor_code; CARD16 connect_id; CARD16 icid; /* input context ID to change focus */ } IMChangeFocusStruct; Your IMserver should check icid member to know which input context should be focusd or unfocusd. IMDestroyICStruct ----------------- The IMDestroyICStruct structure is used for XIM_DESTROY_IC and request. The structure contains: typedef struct { int major_code; int minor_code; CARD16 connect_id; CARD16 icid; /* input context ID to destroy */ } IMDestroyICStruct; Your IMserver should check icid member to know which input context should be destroyed. IMResetICStruct --------------- The IMResetICStruct structure is used for XIM_RESET_IC request. The structure contains: typedef struct { int major_code; int minor_code; CARD16 connect_id; CARD16 icid; /* input context ID to reset */ CARD16 length; /* length of committed string below */ char *commit_string; /* string to commit to XIM client */ } IMResetICStruct; Your IMserver should check icid member to know which input context should be reset. IMChangeICStruct ---------------- The IMChangeICStruct structure is used for XIM_CREATE_IC, XIM_SET_IC_VALUES and XIM_GET_IC_VALUES requests. The structures contain: /* * value type for IC defined in XimProto.h */ #define XimType_SeparatorOfNestedList 0 #define XimType_CARD8 1 #define XimType_CARD16 2 #define XimType_CARD32 3 #define XimType_STRING8 4 #define XimType_Window 5 #define XimType_XIMStyles 10 #define XimType_XRectangle 11 #define XimType_XPoint 12 #define XimType_XFontSet 13 #define XimType_XIMOptions 14 #define XimType_XIMHotKeyTriggers 15 #define XimType_XIMHotKeyState 16 #define XimType_XIMStringConversion 17 #define XimType_NEST 0x7fff typedef struct { int attribute_id; /* ID for this IC */ CARD16 name_length; /* length of IC name below */ char *name; /* IC name */ int value_length; /* length of IC value below */ void *value; /* IC value */ int type; /* value type for IC, see above */ } XICAttribute; typedef struct { int major_code; int minor_code; CARD16 connect_id; CARD16 icid; /* input context ID: for each CREATE, different ID is expected to be returned. for each SET, it shows the ID to set. for each GET, it shows the ID to get. */ CARD16 preedit_attr_num; /* number of preedit_attr list below */ CARD16 status_attr_num; /* number of preedit_attr list below */ CARD16 ic_attr_num; /* number of ic_attr list below */ XICAttribute *preedit_attr; /* IC values for preedit attribute */ XICAttribute *status_attr; /* IC values for status attribute */ XICAttribute *ic_attr; /* IC values for other attributes */ } IMChangeICStruct; When XIM_SET_IC_VALUES or XIM_GET_IC_VALUES, your IMserver should check icid member to know which input context should be specified. When XIM_CREATE_IC, your IMserver should set icid member to identify the input context newly created. IMTriggerNotifyStruct --------------------- The IMTriggerNotifyStruct structure is used for XIM_TRIGGER_NOTIFY request. The structure contains: typedef struct { int major_code; int minor_code; CARD16 connect_id; CARD16 icid; CARD32 flag; CARD32 key_index; CARD32 event_mask; } IMTriggerNotifyStruct; IMForwardEventStruct -------------------- The IMForwardEventStruct structure is used for XIM_FORWARD_EVENT request. The structure contains: typedef struct { int major_code; int minor_code; CARD16 connect_id; CARD16 icid; /* input context ID */ BITMASK16 sync_bit; /* precessed synchronously or not */ CARD16 serial_number; XEvent event; /* X event to be filtered */ } IMForwardEventStruct; 3.2. R5 Ximp IMProtocol 3.2.1. XIMProtocol union data structure In R5 Ximp IMProtocol model, all the event structures have the following common members: typedef struct { INT32 type; /* message type */ CARD32 icid; /* input context ID */ Window focus_win; /* focus window */ long fwin_sel_mask; /* focus window select-mask */ CARD32 ximp_type_mask; /* Ximp event flow type */ Window client_win; /* client window */ } XIMPAnyStruct; The type member specifies the Ximp IMProtocol type constant name that uniquely identies itself. In addition to the individual structures declared for each Ximp XIMProtocol type, the Ximp IMProtocol structure is a union of the individual structures declared for each Ximp IMProtocol type. Depending on the type, you should access members of each Ximp IMProtocol by using the XIMProtocol union. typedef union _IMPProtocol { int type; XIMPAnyStruct any; XIMPKeyEventStruct keyevent; XIMPICValuesStruct create; XIMPICValuesStruct setvalue; XIMPICValuesStruct getvalue; XIMPAnyStruct destroy; XIMPAnyStruct regkey; XIMPAnyStruct setfocus; XIMPAnyStruct unsetfocus; XIMPClientWindowStruct clientwin; XIMPFocusWindowStruct focuswin; XIMPMoveStruct move; XIMPEventMaskNotifyStruct evmasknotify; XIMPExtensionStruct extension; XIMPReadPropStruct readprop; XIMPResetStruct reset; XIMPCommitStringStruct commitstring; XIMPErrorStruct error; XIMPAnyStruct geometry_cb; XIMPPreeditCBStruct preedit_cb; XIMPStatusCBStruct status_cb; long pad[24]; } IMPProtocol; The first entry of any XIMProtocol structure is always the type member, which specifies the Ximp IMProtocol type. 4. Writing IMservers When writing an IMserver that uses the IMdkit, you should make sure that your IMserver performs the following: 1. Include in your IMserver programs. 2. Include . This header file defines all the necessary data types and IMdkit functions that you need to use. 3. Include for R6 standard IMProtocol, or for R5 Ximp IMProtocol, respectively. 4. Call the IMOpenIM function with all the necessary IMValues to initialize the connection. The names of each IMValues have a global symbol that begins with IM to help catch spelling errors. For example, IMModifiers is defined for the XIMProtocol model, and IMLocale is defined for the locale resource. For further information, see "Section 1.1 Open IM Service" and Section 2 "IMValues" 5. To set additional IMValues or override the existing IMValues you set by IMOpenIM, use IMSetIMValues. You can also use IMGetIMValues to look up at existing IMValues. Note that some of IMValues must be set at the IM service creation time, and never be changed by IMSetIMValues. 6. You must set the IMProtocol callback routine by the IMProtocolHandler argument with IMOpenIM or IMSetIMValues functions. This callback is called whenever the IMProtocol is delivered by XIM clients. 7. Now you should select all the necessary X events for your windows with XSelectInput function, and map the windows with XMapWindow function, then sit in a loop processing events as follows. for (;;) { XEvent event; XNextEvent(your_display, &event); if (XFilterEvent(&event, NULL) == True) continue; YourXEventHandler(&event); } Here, all the IMProtocols you need are passed to your IMProtocol callback routine by X Filtering mechanism of XFilterEvent function, and all unfiltered X events you want are passed to YourXEventHandler function above. 8. Link your IMserver with libXimd (the IMdkit library) and libX11 (the core X library). The following provides a sample command line: cc -o sampleIM sampleIM.c -lXimd -lX11 nabi-1.0.0/IMdkit/doc/CHANGELOG0000644000175000017500000000076711655153252012521 00000000000000By Tung-Han Hsieh, 2000/02/07 Fix many possible memory leaks. Fix several incorrect protocols. Change the Makefiles to be integrated to xcin-2.5. These changes are according to ami-1.0.1. This version by Steve Underwood, 1999/05/08 The first stage of a clean up and bug fix for IMdkit. This version removes the obsolete and buggy XIMP support. It fixes a number of memory leaks in Xi18n support. It has been tidied up somewhat. The clean up is far from complete There are still memory leaks. nabi-1.0.0/IMdkit/doc/README0000644000175000017500000001000211655153252012146 00000000000000 IM Server Developers Kit Release Notes Hidetoshi Tajima X11R6 Xi18n Implementation Group May 15, 1995 Here is an introduction of IMserver Developers Kit, in short IMdkit, which is distributed with X11R6 contributions. 1. Scope of IMdkit IMdkit has the following six primary features. 1.1. Providing C language Interface IMdkit provides a low level interface to IMProtocol. It binds each IMProtocol operation to the interface for C language, so that you will take less efforts to make your IMservers communicable with XIM clients rather than handling IMProtocol directly. An XIM client is defined as an application program which is internationalized by using XIM API defined in X11R6. 1.2. Encapsulating actual IMProtocol operations IMdkit is designed to encapsulate the details of IMProtocol model. Using this kit, you don't have to deal with the actual byte-stream packets for yourselves, instead, you can use a set of data structures, each of which is corresponding to each actual IMProtocols, and you can deal with them in the same way as you deal with XEvent data structures. 1.3. Encapsulating Transport mechanism difference IMdkit is designed to encapsulate the transport mechanism, such as X Protocol, TCP/IP, Decnet, which are used in transmission of IMProtocol packets between Input Method library(IMlibrary, a part of Xlib) and IMserver. 1.4. Encapsulating Byte Order difference IMdkit is designed to encapsulate the difference in Byte Order between IMserver and clients, so IMservers using IMdkit can serve both little endian clients and Big endian clients at the same time, without taking care of the difference for themselves. 1.5. Encapsulating multiple IMProtocol models IMdkit is designed to be, to some extent, independent of IMProtocol model. At the current release, it deals with two different IMProtocol models, Ximp model, one of R5 sample IMProtocol models, and the R6 standard IMProtocol model. 1.6. Modeled after XIM APIs IMdkit is to IMserver Developers what XIM is to I18N application Developers, so IMdkit is modeled after XIM APIs. For example: XIM has XOpenIM and XCloseIM, and IMdkit has IMOpenIM and IMCloseIM. XIM has a concept of IMValues and provides XSetIMValues and XGetIMValues to set and get them, and IMdkit also uses IMValues and provides IMSetIMValues and IMGetIMValues to set and get them. 2. Building There is one special build instruction. Please use xmkmf with -a option, and with the top directory(path to xc) and the path to the current directory from the top directory in order to make a Makefile, include all the necessary files and check dependency. Type: xmkmf -a path_to_top(xc)_directory \ path_from_top(xc)_to_current_directory This is because IMdkit refers to some files in xc/lib/xtrans directory to support X TransportServer mechinism. 3. Documents For any detailed information, please refer to the documentation in the doc/ subdirectory. 4. Testing The IMdkit has been built and tested with the current X11R6 release (patchlevel 1) on the following systems: FUJITSU DS 7742 UXP/DS V10L20 IBM RS/6000 320H AIX 3.2.5 Sony NWS-5000 NEWS-OS 6.0.2 SPARCstation SunOS 4.1 SPARCstation Solaris 2.3 SPARCstation Solaris 2.4 HP9000 S700 HP-UX9.01 5. Bug Reports If you find a reproducible bug in this software or the documentation, please send a bug report to the following destination address: tajima@Eng.Sun.Com 6. Acknowledgements I would like to thank all the members in xi18n sample implementation group for giving useful comments and suggestions and partcipating in tests of IMdkit: Takashi Fujiwara, Hideki Hiura, Yoshio Horiuchi, Makoto Inada, Hiromu Inukai, Hiroyuki Miyamoto, Makoto Wakamatsu, Masaki Wakao, Nobuyuki Tanaka, Shigeru Yamada and Katsuhisa Yano. And I would like to make special thanks to Hiromu Inukai, who is the principal author of the Ximp facilities, and special thanks to Makoto Inada and Hiroyuki Miyamoto for providing the Frame Manager Interfaces. nabi-1.0.0/IMdkit/Makefile.am0000644000175000017500000000105511655153252012565 00000000000000 noinst_LIBRARIES = libXimd.a libXimd_a_CFLAGS = $(X_CFLAGS) libXimd_a_SOURCES = \ FrameMgr.c \ FrameMgr.h \ IMConn.c \ IMMethod.c \ IMValues.c \ IMdkit.h \ Xi18n.h \ Xi18nX.h \ XimFunc.h \ XimProto.h \ i18nAttr.c \ i18nClbk.c \ i18nIMProto.c \ i18nIc.c \ i18nMethod.c \ i18nPtHdr.c \ i18nUtil.c \ i18nX.c EXTRA_DIST = \ doc/Xi18n_sample/Imakefile \ doc/Xi18n_sample/IC.c \ doc/Xi18n_sample/IC.h \ doc/Xi18n_sample/Makefile.pu \ doc/Xi18n_sample/README \ doc/Xi18n_sample/sampleIM.c \ doc/API.text \ doc/CHANGELOG \ doc/README nabi-1.0.0/IMdkit/Makefile.in0000644000175000017500000010602112066005053012565 00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = IMdkit DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) AR = ar ARFLAGS = cru libXimd_a_AR = $(AR) $(ARFLAGS) libXimd_a_LIBADD = am_libXimd_a_OBJECTS = libXimd_a-FrameMgr.$(OBJEXT) \ libXimd_a-IMConn.$(OBJEXT) libXimd_a-IMMethod.$(OBJEXT) \ libXimd_a-IMValues.$(OBJEXT) libXimd_a-i18nAttr.$(OBJEXT) \ libXimd_a-i18nClbk.$(OBJEXT) libXimd_a-i18nIMProto.$(OBJEXT) \ libXimd_a-i18nIc.$(OBJEXT) libXimd_a-i18nMethod.$(OBJEXT) \ libXimd_a-i18nPtHdr.$(OBJEXT) libXimd_a-i18nUtil.$(OBJEXT) \ libXimd_a-i18nX.$(OBJEXT) libXimd_a_OBJECTS = $(am_libXimd_a_OBJECTS) DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ SOURCES = $(libXimd_a_SOURCES) DIST_SOURCES = $(libXimd_a_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ LDFLAGS = @LDFLAGS@ LIBHANGUL_CFLAGS = @LIBHANGUL_CFLAGS@ LIBHANGUL_LIBS = @LIBHANGUL_LIBS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ NABI_DATA_DIR = @NABI_DATA_DIR@ NABI_THEMES_DIR = @NABI_THEMES_DIR@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LIBRARIES = libXimd.a libXimd_a_CFLAGS = $(X_CFLAGS) libXimd_a_SOURCES = \ FrameMgr.c \ FrameMgr.h \ IMConn.c \ IMMethod.c \ IMValues.c \ IMdkit.h \ Xi18n.h \ Xi18nX.h \ XimFunc.h \ XimProto.h \ i18nAttr.c \ i18nClbk.c \ i18nIMProto.c \ i18nIc.c \ i18nMethod.c \ i18nPtHdr.c \ i18nUtil.c \ i18nX.c EXTRA_DIST = \ doc/Xi18n_sample/Imakefile \ doc/Xi18n_sample/IC.c \ doc/Xi18n_sample/IC.h \ doc/Xi18n_sample/Makefile.pu \ doc/Xi18n_sample/README \ doc/Xi18n_sample/sampleIM.c \ doc/API.text \ doc/CHANGELOG \ doc/README all: all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu IMdkit/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu IMdkit/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libXimd.a: $(libXimd_a_OBJECTS) $(libXimd_a_DEPENDENCIES) -rm -f libXimd.a $(libXimd_a_AR) libXimd.a $(libXimd_a_OBJECTS) $(libXimd_a_LIBADD) $(RANLIB) libXimd.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libXimd_a-FrameMgr.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libXimd_a-IMConn.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libXimd_a-IMMethod.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libXimd_a-IMValues.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libXimd_a-i18nAttr.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libXimd_a-i18nClbk.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libXimd_a-i18nIMProto.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libXimd_a-i18nIc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libXimd_a-i18nMethod.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libXimd_a-i18nPtHdr.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libXimd_a-i18nUtil.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libXimd_a-i18nX.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` libXimd_a-FrameMgr.o: FrameMgr.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libXimd_a_CFLAGS) $(CFLAGS) -MT libXimd_a-FrameMgr.o -MD -MP -MF $(DEPDIR)/libXimd_a-FrameMgr.Tpo -c -o libXimd_a-FrameMgr.o `test -f 'FrameMgr.c' || echo '$(srcdir)/'`FrameMgr.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libXimd_a-FrameMgr.Tpo $(DEPDIR)/libXimd_a-FrameMgr.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='FrameMgr.c' object='libXimd_a-FrameMgr.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libXimd_a_CFLAGS) $(CFLAGS) -c -o libXimd_a-FrameMgr.o `test -f 'FrameMgr.c' || echo '$(srcdir)/'`FrameMgr.c libXimd_a-FrameMgr.obj: FrameMgr.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libXimd_a_CFLAGS) $(CFLAGS) -MT libXimd_a-FrameMgr.obj -MD -MP -MF $(DEPDIR)/libXimd_a-FrameMgr.Tpo -c -o libXimd_a-FrameMgr.obj `if test -f 'FrameMgr.c'; then $(CYGPATH_W) 'FrameMgr.c'; else $(CYGPATH_W) '$(srcdir)/FrameMgr.c'; fi` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libXimd_a-FrameMgr.Tpo $(DEPDIR)/libXimd_a-FrameMgr.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='FrameMgr.c' object='libXimd_a-FrameMgr.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libXimd_a_CFLAGS) $(CFLAGS) -c -o libXimd_a-FrameMgr.obj `if test -f 'FrameMgr.c'; then $(CYGPATH_W) 'FrameMgr.c'; else $(CYGPATH_W) '$(srcdir)/FrameMgr.c'; fi` libXimd_a-IMConn.o: IMConn.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libXimd_a_CFLAGS) $(CFLAGS) -MT libXimd_a-IMConn.o -MD -MP -MF $(DEPDIR)/libXimd_a-IMConn.Tpo -c -o libXimd_a-IMConn.o `test -f 'IMConn.c' || echo '$(srcdir)/'`IMConn.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libXimd_a-IMConn.Tpo $(DEPDIR)/libXimd_a-IMConn.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='IMConn.c' object='libXimd_a-IMConn.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libXimd_a_CFLAGS) $(CFLAGS) -c -o libXimd_a-IMConn.o `test -f 'IMConn.c' || echo '$(srcdir)/'`IMConn.c libXimd_a-IMConn.obj: IMConn.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libXimd_a_CFLAGS) $(CFLAGS) -MT libXimd_a-IMConn.obj -MD -MP -MF $(DEPDIR)/libXimd_a-IMConn.Tpo -c -o libXimd_a-IMConn.obj `if test -f 'IMConn.c'; then $(CYGPATH_W) 'IMConn.c'; else $(CYGPATH_W) '$(srcdir)/IMConn.c'; fi` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libXimd_a-IMConn.Tpo $(DEPDIR)/libXimd_a-IMConn.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='IMConn.c' object='libXimd_a-IMConn.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libXimd_a_CFLAGS) $(CFLAGS) -c -o libXimd_a-IMConn.obj `if test -f 'IMConn.c'; then $(CYGPATH_W) 'IMConn.c'; else $(CYGPATH_W) '$(srcdir)/IMConn.c'; fi` libXimd_a-IMMethod.o: IMMethod.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libXimd_a_CFLAGS) $(CFLAGS) -MT libXimd_a-IMMethod.o -MD -MP -MF $(DEPDIR)/libXimd_a-IMMethod.Tpo -c -o libXimd_a-IMMethod.o `test -f 'IMMethod.c' || echo '$(srcdir)/'`IMMethod.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libXimd_a-IMMethod.Tpo $(DEPDIR)/libXimd_a-IMMethod.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='IMMethod.c' object='libXimd_a-IMMethod.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libXimd_a_CFLAGS) $(CFLAGS) -c -o libXimd_a-IMMethod.o `test -f 'IMMethod.c' || echo '$(srcdir)/'`IMMethod.c libXimd_a-IMMethod.obj: IMMethod.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libXimd_a_CFLAGS) $(CFLAGS) -MT libXimd_a-IMMethod.obj -MD -MP -MF $(DEPDIR)/libXimd_a-IMMethod.Tpo -c -o libXimd_a-IMMethod.obj `if test -f 'IMMethod.c'; then $(CYGPATH_W) 'IMMethod.c'; else $(CYGPATH_W) '$(srcdir)/IMMethod.c'; fi` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libXimd_a-IMMethod.Tpo $(DEPDIR)/libXimd_a-IMMethod.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='IMMethod.c' object='libXimd_a-IMMethod.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libXimd_a_CFLAGS) $(CFLAGS) -c -o libXimd_a-IMMethod.obj `if test -f 'IMMethod.c'; then $(CYGPATH_W) 'IMMethod.c'; else $(CYGPATH_W) '$(srcdir)/IMMethod.c'; fi` libXimd_a-IMValues.o: IMValues.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libXimd_a_CFLAGS) $(CFLAGS) -MT libXimd_a-IMValues.o -MD -MP -MF $(DEPDIR)/libXimd_a-IMValues.Tpo -c -o libXimd_a-IMValues.o `test -f 'IMValues.c' || echo '$(srcdir)/'`IMValues.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libXimd_a-IMValues.Tpo $(DEPDIR)/libXimd_a-IMValues.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='IMValues.c' object='libXimd_a-IMValues.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libXimd_a_CFLAGS) $(CFLAGS) -c -o libXimd_a-IMValues.o `test -f 'IMValues.c' || echo '$(srcdir)/'`IMValues.c libXimd_a-IMValues.obj: IMValues.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libXimd_a_CFLAGS) $(CFLAGS) -MT libXimd_a-IMValues.obj -MD -MP -MF $(DEPDIR)/libXimd_a-IMValues.Tpo -c -o libXimd_a-IMValues.obj `if test -f 'IMValues.c'; then $(CYGPATH_W) 'IMValues.c'; else $(CYGPATH_W) '$(srcdir)/IMValues.c'; fi` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libXimd_a-IMValues.Tpo $(DEPDIR)/libXimd_a-IMValues.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='IMValues.c' object='libXimd_a-IMValues.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libXimd_a_CFLAGS) $(CFLAGS) -c -o libXimd_a-IMValues.obj `if test -f 'IMValues.c'; then $(CYGPATH_W) 'IMValues.c'; else $(CYGPATH_W) '$(srcdir)/IMValues.c'; fi` libXimd_a-i18nAttr.o: i18nAttr.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libXimd_a_CFLAGS) $(CFLAGS) -MT libXimd_a-i18nAttr.o -MD -MP -MF $(DEPDIR)/libXimd_a-i18nAttr.Tpo -c -o libXimd_a-i18nAttr.o `test -f 'i18nAttr.c' || echo '$(srcdir)/'`i18nAttr.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libXimd_a-i18nAttr.Tpo $(DEPDIR)/libXimd_a-i18nAttr.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='i18nAttr.c' object='libXimd_a-i18nAttr.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libXimd_a_CFLAGS) $(CFLAGS) -c -o libXimd_a-i18nAttr.o `test -f 'i18nAttr.c' || echo '$(srcdir)/'`i18nAttr.c libXimd_a-i18nAttr.obj: i18nAttr.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libXimd_a_CFLAGS) $(CFLAGS) -MT libXimd_a-i18nAttr.obj -MD -MP -MF $(DEPDIR)/libXimd_a-i18nAttr.Tpo -c -o libXimd_a-i18nAttr.obj `if test -f 'i18nAttr.c'; then $(CYGPATH_W) 'i18nAttr.c'; else $(CYGPATH_W) '$(srcdir)/i18nAttr.c'; fi` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libXimd_a-i18nAttr.Tpo $(DEPDIR)/libXimd_a-i18nAttr.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='i18nAttr.c' object='libXimd_a-i18nAttr.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libXimd_a_CFLAGS) $(CFLAGS) -c -o libXimd_a-i18nAttr.obj `if test -f 'i18nAttr.c'; then $(CYGPATH_W) 'i18nAttr.c'; else $(CYGPATH_W) '$(srcdir)/i18nAttr.c'; fi` libXimd_a-i18nClbk.o: i18nClbk.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libXimd_a_CFLAGS) $(CFLAGS) -MT libXimd_a-i18nClbk.o -MD -MP -MF $(DEPDIR)/libXimd_a-i18nClbk.Tpo -c -o libXimd_a-i18nClbk.o `test -f 'i18nClbk.c' || echo '$(srcdir)/'`i18nClbk.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libXimd_a-i18nClbk.Tpo $(DEPDIR)/libXimd_a-i18nClbk.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='i18nClbk.c' object='libXimd_a-i18nClbk.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libXimd_a_CFLAGS) $(CFLAGS) -c -o libXimd_a-i18nClbk.o `test -f 'i18nClbk.c' || echo '$(srcdir)/'`i18nClbk.c libXimd_a-i18nClbk.obj: i18nClbk.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libXimd_a_CFLAGS) $(CFLAGS) -MT libXimd_a-i18nClbk.obj -MD -MP -MF $(DEPDIR)/libXimd_a-i18nClbk.Tpo -c -o libXimd_a-i18nClbk.obj `if test -f 'i18nClbk.c'; then $(CYGPATH_W) 'i18nClbk.c'; else $(CYGPATH_W) '$(srcdir)/i18nClbk.c'; fi` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libXimd_a-i18nClbk.Tpo $(DEPDIR)/libXimd_a-i18nClbk.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='i18nClbk.c' object='libXimd_a-i18nClbk.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libXimd_a_CFLAGS) $(CFLAGS) -c -o libXimd_a-i18nClbk.obj `if test -f 'i18nClbk.c'; then $(CYGPATH_W) 'i18nClbk.c'; else $(CYGPATH_W) '$(srcdir)/i18nClbk.c'; fi` libXimd_a-i18nIMProto.o: i18nIMProto.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libXimd_a_CFLAGS) $(CFLAGS) -MT libXimd_a-i18nIMProto.o -MD -MP -MF $(DEPDIR)/libXimd_a-i18nIMProto.Tpo -c -o libXimd_a-i18nIMProto.o `test -f 'i18nIMProto.c' || echo '$(srcdir)/'`i18nIMProto.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libXimd_a-i18nIMProto.Tpo $(DEPDIR)/libXimd_a-i18nIMProto.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='i18nIMProto.c' object='libXimd_a-i18nIMProto.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libXimd_a_CFLAGS) $(CFLAGS) -c -o libXimd_a-i18nIMProto.o `test -f 'i18nIMProto.c' || echo '$(srcdir)/'`i18nIMProto.c libXimd_a-i18nIMProto.obj: i18nIMProto.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libXimd_a_CFLAGS) $(CFLAGS) -MT libXimd_a-i18nIMProto.obj -MD -MP -MF $(DEPDIR)/libXimd_a-i18nIMProto.Tpo -c -o libXimd_a-i18nIMProto.obj `if test -f 'i18nIMProto.c'; then $(CYGPATH_W) 'i18nIMProto.c'; else $(CYGPATH_W) '$(srcdir)/i18nIMProto.c'; fi` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libXimd_a-i18nIMProto.Tpo $(DEPDIR)/libXimd_a-i18nIMProto.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='i18nIMProto.c' object='libXimd_a-i18nIMProto.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libXimd_a_CFLAGS) $(CFLAGS) -c -o libXimd_a-i18nIMProto.obj `if test -f 'i18nIMProto.c'; then $(CYGPATH_W) 'i18nIMProto.c'; else $(CYGPATH_W) '$(srcdir)/i18nIMProto.c'; fi` libXimd_a-i18nIc.o: i18nIc.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libXimd_a_CFLAGS) $(CFLAGS) -MT libXimd_a-i18nIc.o -MD -MP -MF $(DEPDIR)/libXimd_a-i18nIc.Tpo -c -o libXimd_a-i18nIc.o `test -f 'i18nIc.c' || echo '$(srcdir)/'`i18nIc.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libXimd_a-i18nIc.Tpo $(DEPDIR)/libXimd_a-i18nIc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='i18nIc.c' object='libXimd_a-i18nIc.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libXimd_a_CFLAGS) $(CFLAGS) -c -o libXimd_a-i18nIc.o `test -f 'i18nIc.c' || echo '$(srcdir)/'`i18nIc.c libXimd_a-i18nIc.obj: i18nIc.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libXimd_a_CFLAGS) $(CFLAGS) -MT libXimd_a-i18nIc.obj -MD -MP -MF $(DEPDIR)/libXimd_a-i18nIc.Tpo -c -o libXimd_a-i18nIc.obj `if test -f 'i18nIc.c'; then $(CYGPATH_W) 'i18nIc.c'; else $(CYGPATH_W) '$(srcdir)/i18nIc.c'; fi` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libXimd_a-i18nIc.Tpo $(DEPDIR)/libXimd_a-i18nIc.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='i18nIc.c' object='libXimd_a-i18nIc.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libXimd_a_CFLAGS) $(CFLAGS) -c -o libXimd_a-i18nIc.obj `if test -f 'i18nIc.c'; then $(CYGPATH_W) 'i18nIc.c'; else $(CYGPATH_W) '$(srcdir)/i18nIc.c'; fi` libXimd_a-i18nMethod.o: i18nMethod.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libXimd_a_CFLAGS) $(CFLAGS) -MT libXimd_a-i18nMethod.o -MD -MP -MF $(DEPDIR)/libXimd_a-i18nMethod.Tpo -c -o libXimd_a-i18nMethod.o `test -f 'i18nMethod.c' || echo '$(srcdir)/'`i18nMethod.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libXimd_a-i18nMethod.Tpo $(DEPDIR)/libXimd_a-i18nMethod.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='i18nMethod.c' object='libXimd_a-i18nMethod.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libXimd_a_CFLAGS) $(CFLAGS) -c -o libXimd_a-i18nMethod.o `test -f 'i18nMethod.c' || echo '$(srcdir)/'`i18nMethod.c libXimd_a-i18nMethod.obj: i18nMethod.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libXimd_a_CFLAGS) $(CFLAGS) -MT libXimd_a-i18nMethod.obj -MD -MP -MF $(DEPDIR)/libXimd_a-i18nMethod.Tpo -c -o libXimd_a-i18nMethod.obj `if test -f 'i18nMethod.c'; then $(CYGPATH_W) 'i18nMethod.c'; else $(CYGPATH_W) '$(srcdir)/i18nMethod.c'; fi` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libXimd_a-i18nMethod.Tpo $(DEPDIR)/libXimd_a-i18nMethod.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='i18nMethod.c' object='libXimd_a-i18nMethod.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libXimd_a_CFLAGS) $(CFLAGS) -c -o libXimd_a-i18nMethod.obj `if test -f 'i18nMethod.c'; then $(CYGPATH_W) 'i18nMethod.c'; else $(CYGPATH_W) '$(srcdir)/i18nMethod.c'; fi` libXimd_a-i18nPtHdr.o: i18nPtHdr.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libXimd_a_CFLAGS) $(CFLAGS) -MT libXimd_a-i18nPtHdr.o -MD -MP -MF $(DEPDIR)/libXimd_a-i18nPtHdr.Tpo -c -o libXimd_a-i18nPtHdr.o `test -f 'i18nPtHdr.c' || echo '$(srcdir)/'`i18nPtHdr.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libXimd_a-i18nPtHdr.Tpo $(DEPDIR)/libXimd_a-i18nPtHdr.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='i18nPtHdr.c' object='libXimd_a-i18nPtHdr.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libXimd_a_CFLAGS) $(CFLAGS) -c -o libXimd_a-i18nPtHdr.o `test -f 'i18nPtHdr.c' || echo '$(srcdir)/'`i18nPtHdr.c libXimd_a-i18nPtHdr.obj: i18nPtHdr.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libXimd_a_CFLAGS) $(CFLAGS) -MT libXimd_a-i18nPtHdr.obj -MD -MP -MF $(DEPDIR)/libXimd_a-i18nPtHdr.Tpo -c -o libXimd_a-i18nPtHdr.obj `if test -f 'i18nPtHdr.c'; then $(CYGPATH_W) 'i18nPtHdr.c'; else $(CYGPATH_W) '$(srcdir)/i18nPtHdr.c'; fi` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libXimd_a-i18nPtHdr.Tpo $(DEPDIR)/libXimd_a-i18nPtHdr.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='i18nPtHdr.c' object='libXimd_a-i18nPtHdr.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libXimd_a_CFLAGS) $(CFLAGS) -c -o libXimd_a-i18nPtHdr.obj `if test -f 'i18nPtHdr.c'; then $(CYGPATH_W) 'i18nPtHdr.c'; else $(CYGPATH_W) '$(srcdir)/i18nPtHdr.c'; fi` libXimd_a-i18nUtil.o: i18nUtil.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libXimd_a_CFLAGS) $(CFLAGS) -MT libXimd_a-i18nUtil.o -MD -MP -MF $(DEPDIR)/libXimd_a-i18nUtil.Tpo -c -o libXimd_a-i18nUtil.o `test -f 'i18nUtil.c' || echo '$(srcdir)/'`i18nUtil.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libXimd_a-i18nUtil.Tpo $(DEPDIR)/libXimd_a-i18nUtil.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='i18nUtil.c' object='libXimd_a-i18nUtil.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libXimd_a_CFLAGS) $(CFLAGS) -c -o libXimd_a-i18nUtil.o `test -f 'i18nUtil.c' || echo '$(srcdir)/'`i18nUtil.c libXimd_a-i18nUtil.obj: i18nUtil.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libXimd_a_CFLAGS) $(CFLAGS) -MT libXimd_a-i18nUtil.obj -MD -MP -MF $(DEPDIR)/libXimd_a-i18nUtil.Tpo -c -o libXimd_a-i18nUtil.obj `if test -f 'i18nUtil.c'; then $(CYGPATH_W) 'i18nUtil.c'; else $(CYGPATH_W) '$(srcdir)/i18nUtil.c'; fi` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libXimd_a-i18nUtil.Tpo $(DEPDIR)/libXimd_a-i18nUtil.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='i18nUtil.c' object='libXimd_a-i18nUtil.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libXimd_a_CFLAGS) $(CFLAGS) -c -o libXimd_a-i18nUtil.obj `if test -f 'i18nUtil.c'; then $(CYGPATH_W) 'i18nUtil.c'; else $(CYGPATH_W) '$(srcdir)/i18nUtil.c'; fi` libXimd_a-i18nX.o: i18nX.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libXimd_a_CFLAGS) $(CFLAGS) -MT libXimd_a-i18nX.o -MD -MP -MF $(DEPDIR)/libXimd_a-i18nX.Tpo -c -o libXimd_a-i18nX.o `test -f 'i18nX.c' || echo '$(srcdir)/'`i18nX.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libXimd_a-i18nX.Tpo $(DEPDIR)/libXimd_a-i18nX.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='i18nX.c' object='libXimd_a-i18nX.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libXimd_a_CFLAGS) $(CFLAGS) -c -o libXimd_a-i18nX.o `test -f 'i18nX.c' || echo '$(srcdir)/'`i18nX.c libXimd_a-i18nX.obj: i18nX.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libXimd_a_CFLAGS) $(CFLAGS) -MT libXimd_a-i18nX.obj -MD -MP -MF $(DEPDIR)/libXimd_a-i18nX.Tpo -c -o libXimd_a-i18nX.obj `if test -f 'i18nX.c'; then $(CYGPATH_W) 'i18nX.c'; else $(CYGPATH_W) '$(srcdir)/i18nX.c'; fi` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libXimd_a-i18nX.Tpo $(DEPDIR)/libXimd_a-i18nX.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='i18nX.c' object='libXimd_a-i18nX.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libXimd_a_CFLAGS) $(CFLAGS) -c -o libXimd_a-i18nX.obj `if test -f 'i18nX.c'; then $(CYGPATH_W) 'i18nX.c'; else $(CYGPATH_W) '$(srcdir)/i18nX.c'; fi` ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-noinstLIBRARIES ctags distclean distclean-compile \ distclean-generic distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \ uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: nabi-1.0.0/IMdkit/FrameMgr.c0000644000175000017500000016705311655153252012410 00000000000000/****************************************************************** Copyright 1993, 1994 by Digital Equipment Corporation, Maynard, Massachusetts, All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation, and that the names of Digital or MIT not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. Author: Hiroyuki Miyamoto Digital Equipment Corporation miyamoto@jrd.dec.com This version tidied and debugged by Steve Underwood May 1999 ******************************************************************/ #include #include #include "FrameMgr.h" /* Convenient macro */ #define _UNIT(n) ((int)(n) & 0xFF) #define _NUMBER(n) (((int)(n) >> 8) & 0xFF) /* For byte swapping */ #define Swap16(p, n) ((p)->byte_swap ? \ (((n) << 8 & 0xFF00) | \ ((n) >> 8 & 0xFF) \ ) : n) #define Swap32(p, n) ((p)->byte_swap ? \ (((n) << 24 & 0xFF000000) | \ ((n) << 8 & 0xFF0000) | \ ((n) >> 8 & 0xFF00) | \ ((n) >> 24 & 0xFF) \ ) : n) #define Swap64(p, n) ((p)->byte_swap ? \ (((n) << 56 & 0xFF00000000000000) | \ ((n) << 40 & 0xFF000000000000) | \ ((n) << 24 & 0xFF0000000000) | \ ((n) << 8 & 0xFF00000000) | \ ((n) >> 8 & 0xFF000000) | \ ((n) >> 24 & 0xFF0000) | \ ((n) >> 40 & 0xFF00) | \ ((n) >> 56 & 0xFF) \ ) : n) /* Type definition */ typedef struct _Iter *Iter; typedef struct _FrameInst *FrameInst; typedef union { int num; /* For BARRAY */ FrameInst fi; /* For POINTER */ Iter iter; /* For ITER */ } ExtraDataRec, *ExtraData; typedef struct _Chain { ExtraDataRec d; int frame_no; struct _Chain *next; } ChainRec, *Chain; typedef struct _ChainMgr { Chain top; Chain tail; } ChainMgrRec, *ChainMgr; typedef struct _ChainIter { Chain cur; } ChainIterRec, *ChainIter; typedef struct _FrameIter { Iter iter; Bool counting; unsigned int counter; int end; struct _FrameIter* next; } FrameIterRec, *FrameIter; typedef struct _FrameInst { XimFrame template; ChainMgrRec cm; int cur_no; } FrameInstRec; typedef void (*IterStartWatchProc) (Iter it, void *client_data); typedef struct _Iter { XimFrame template; int max_count; Bool allow_expansion; ChainMgrRec cm; int cur_no; IterStartWatchProc start_watch_proc; void *client_data; Bool start_counter; } IterRec; typedef struct _FrameMgr { XimFrame frame; FrameInst fi; char *area; int idx; Bool byte_swap; int total_size; FrameIter iters; } FrameMgrRec; typedef union { int num; /* For BARRAY and PAD */ struct { /* For COUNTER_* */ Iter iter; Bool is_byte_len; } counter; } XimFrameTypeInfoRec, *XimFrameTypeInfo; /* Special values */ #define NO_VALUE -1 #define NO_VALID_FIELD -2 static FrameInst FrameInstInit(XimFrame frame); static void FrameInstFree(FrameInst fi); static XimFrameType FrameInstGetNextType(FrameInst fi, XimFrameTypeInfo info); static XimFrameType FrameInstPeekNextType(FrameInst fi, XimFrameTypeInfo info); static FmStatus FrameInstSetSize(FrameInst fi, int num); static FmStatus FrameInstSetIterCount(FrameInst fi, int num); static int FrameInstGetTotalSize(FrameInst fi); static void FrameInstReset(FrameInst fi); static Iter IterInit(XimFrame frame, int count); static void IterFree(Iter it); static int FrameInstGetSize(FrameInst fi); static int IterGetSize(Iter it); static XimFrameType IterGetNextType(Iter it, XimFrameTypeInfo info); static XimFrameType IterPeekNextType(Iter it, XimFrameTypeInfo info); static FmStatus IterSetSize(Iter it, int num); static FmStatus IterSetIterCount(Iter it, int num); static int IterGetTotalSize(Iter it); static void IterReset(Iter it); static Bool IterIsLoopEnd(Iter it, Bool* myself); static void IterSetStartWatch(Iter it, IterStartWatchProc proc, void* client_data); static void _IterStartWatch(Iter it, void* client_data); static ExtraData ChainMgrGetExtraData(ChainMgr cm, int frame_no); static ExtraData ChainMgrSetData(ChainMgr cm, int frame_no, ExtraDataRec data); static Bool ChainIterGetNext(ChainIter ci, int* frame_no, ExtraData d); static int _FrameInstIncrement(XimFrame frame, int count); static int _FrameInstDecrement(XimFrame frame, int count); static int _FrameInstGetItemSize(FrameInst fi, int cur_no); static Bool FrameInstIsIterLoopEnd(FrameInst fi); static FrameIter _FrameMgrAppendIter(FrameMgr fm, Iter it, int end); static FrameIter _FrameIterCounterIncr(FrameIter fitr, int i); static void _FrameMgrRemoveIter(FrameMgr fm, FrameIter it); static Bool _FrameMgrIsIterLoopEnd(FrameMgr fm); static Bool _FrameMgrProcessPadding(FrameMgr fm, FmStatus* status); #define IterGetIterCount(it) ((it)->allow_expansion ? \ NO_VALUE : (it)->max_count) #define IterFixIteration(it) ((it)->allow_expansion = False) #define IterSetStarter(it) ((it)->start_counter = True) #define ChainMgrInit(cm) (cm)->top = (cm)->tail = NULL #define ChainMgrFree(cm) \ { \ Chain tmp; \ Chain cur = (cm)->top; \ \ while (cur) \ { \ tmp = cur->next; \ Xfree (cur); \ cur = tmp; \ } \ } #define ChainIterInit(ci, cm) \ { \ (ci)->cur = (cm)->top; \ } /* ChainIterFree has nothing to do. */ #define ChainIterFree(ci) #define FrameInstIsEnd(fi) ((fi)->template[(fi)->cur_no].type == EOL) FrameMgr FrameMgrInit (XimFrame frame, char* area, Bool byte_swap) { FrameMgr fm; fm = (FrameMgr) Xmalloc (sizeof (FrameMgrRec)); fm->frame = frame; fm->fi = FrameInstInit (frame); fm->area = (char *) area; fm->idx = 0; fm->byte_swap = byte_swap; fm->total_size = NO_VALUE; fm->iters = NULL; return fm; } void FrameMgrInitWithData (FrameMgr fm, XimFrame frame, void * area, Bool byte_swap) { fm->frame = frame; fm->fi = FrameInstInit (frame); fm->area = (char *) area; fm->idx = 0; fm->byte_swap = byte_swap; fm->total_size = NO_VALUE; } void FrameMgrFree (FrameMgr fm) { FrameIter p, cur; p = fm->iters; cur = p; while (p != NULL) { p = p->next; Xfree(cur); cur = p; } FrameInstFree (fm->fi); Xfree (fm); } FmStatus FrameMgrSetBuffer (FrameMgr fm, void* area) { if (fm->area) return FmBufExist; fm->area = (char *) area; return FmSuccess; } FmStatus _FrameMgrPutToken (FrameMgr fm, void *data, int data_size) { XimFrameType type; XimFrameTypeInfoRec info; if (fm->total_size != NO_VALUE && fm->idx >= fm->total_size) return FmNoMoreData; /*endif*/ type = FrameInstGetNextType(fm->fi, &info); if (type & COUNTER_MASK) { unsigned long input_length; if (info.counter.is_byte_len) { if ((input_length = IterGetTotalSize (info.counter.iter)) == NO_VALUE) { return FmCannotCalc; } /*endif*/ } else { if ((input_length = IterGetIterCount (info.counter.iter)) == NO_VALUE) { return FmCannotCalc; } /*endif*/ } /*endif*/ switch (type) { case COUNTER_BIT8: *(CARD8 *) (fm->area + fm->idx) = input_length; fm->idx++; break; case COUNTER_BIT16: *(CARD16 *) (fm->area + fm->idx) = Swap16 (fm, input_length); fm->idx += 2; break; case COUNTER_BIT32: *(CARD32 *) (fm->area + fm->idx) = Swap32 (fm, input_length); fm->idx += 4; break; #if defined(_NEED64BIT) case COUNTER_BIT64: *(CARD64 *) (fm->area + fm->idx) = Swap64 (fm, input_length); fm->idx += 8; break; #endif default: break; } /*endswitch*/ _FrameMgrPutToken(fm, data, data_size); return FmSuccess; } /*endif*/ switch (type) { case BIT8: if (data_size == sizeof (unsigned char)) { unsigned long num = *(unsigned char *) data; *(CARD8 *) (fm->area + fm->idx) = num; } else if (data_size == sizeof (unsigned short)) { unsigned long num = *(unsigned short *) data; *(CARD8 *) (fm->area + fm->idx) = num; } else if (data_size == sizeof (unsigned int)) { unsigned long num = *(unsigned int *) data; *(CARD8 *) (fm->area + fm->idx) = num; } else if (data_size == sizeof (unsigned long)) { unsigned long num = *(unsigned long *) data; *(CARD8 *) (fm->area + fm->idx) = num; } else { ; /* Should never be reached */ } /*endif*/ fm->idx++; return FmSuccess; case BIT16: if (data_size == sizeof (unsigned char)) { unsigned long num = *(unsigned char *) data; *(CARD16*)(fm->area + fm->idx) = Swap16 (fm, num); } else if (data_size == sizeof (unsigned short)) { unsigned long num = *(unsigned short *) data; *(CARD16 *) (fm->area + fm->idx) = Swap16 (fm, num); } else if (data_size == sizeof (unsigned int)) { unsigned long num = *(unsigned int *) data; *(CARD16 *) (fm->area + fm->idx) = Swap16 (fm, num); } else if (data_size == sizeof (unsigned long)) { unsigned long num = *(unsigned long *) data; *(CARD16 *) (fm->area + fm->idx) = Swap16 (fm, num); } else { ; /* Should never reached */ } /*endif*/ fm->idx += 2; return FmSuccess; case BIT32: if (data_size == sizeof (unsigned char)) { unsigned long num = *(unsigned char *) data; *(CARD32 *) (fm->area + fm->idx) = Swap32 (fm, num); } else if (data_size == sizeof (unsigned short)) { unsigned long num = *(unsigned short *) data; *(CARD32 *) (fm->area + fm->idx) = Swap32 (fm, num); } else if (data_size == sizeof (unsigned int)) { unsigned long num = *(unsigned int *) data; *(CARD32 *) (fm->area + fm->idx) = Swap32 (fm, num); } else if (data_size == sizeof (unsigned long)) { unsigned long num = *(unsigned long *) data; *(CARD32 *) (fm->area + fm->idx) = Swap32 (fm, num); } else { ; /* Should never reached */ } /*endif*/ fm->idx += 4; return FmSuccess; #if defined(_NEED64BIT) case BIT64: if (data_size == sizeof (unsigned char)) { unsigned long num = *(unsigned char *) data; *(CARD64 *) (fm->area + fm->idx) = Swap64 (fm, num); } else if (data_size == sizeof (unsigned short)) { unsigned long num = *(unsigned short *) data; *(CARD64 *) (fm->area + fm->idx) = Swap64 (fm, num); } else if (data_size == sizeof (unsigned int)) { unsigned long num = *(unsigned int *) data; *(CARD64 *) (fm->area + fm->idx) = Swap64 (fm, num); } else if (data_size == sizeof (unsigned long)) { unsigned long num = *(unsigned long *) data; *(CARD64 *) (fm->area + fm->idx) = Swap64 (fm, num); } else { ; /* Should never reached */ } /*endif*/ fm->idx += 4; return FmSuccess; #endif case BARRAY: if (info.num == NO_VALUE) return FmInvalidCall; /*endif*/ if (info.num > 0) { bcopy (*(char **) data, fm->area + fm->idx, info.num); fm->idx += info.num; } /*endif*/ return FmSuccess; case PADDING: if (info.num == NO_VALUE) return FmInvalidCall; /*endif*/ fm->idx += info.num; return _FrameMgrPutToken(fm, data, data_size); case ITER: return FmInvalidCall; case EOL: return FmEOD; default: break; } /*endswitch*/ return (FmStatus) NULL; /* Should never be reached */ } FmStatus _FrameMgrGetToken (FrameMgr fm , void* data, int data_size) { XimFrameType type; static XimFrameTypeInfoRec info; /* memory */ FrameIter fitr; if (fm->total_size != NO_VALUE && fm->idx >= fm->total_size) return FmNoMoreData; /*endif*/ type = FrameInstGetNextType(fm->fi, &info); if (type & COUNTER_MASK) { int end=0; FrameIter client_data; type &= ~COUNTER_MASK; switch (type) { case BIT8: end = *(CARD8 *) (fm->area + fm->idx); break; case BIT16: end = Swap16 (fm, *(CARD16 *) (fm->area + fm->idx)); break; case BIT32: end = Swap32 (fm, *(CARD32 *) (fm->area + fm->idx)); break; #if defined(_NEED64BIT) case BIT64: end = Swap64 (fm, *(CARD64 *) (fm->area + fm->idx)); break; #endif default: break; } /*endswitch*/ if ((client_data = _FrameMgrAppendIter (fm, info.counter.iter, end))) { IterSetStarter (info.counter.iter); IterSetStartWatch (info.counter.iter, _IterStartWatch, (void *) client_data); } /*endif*/ } /*endif*/ type &= ~COUNTER_MASK; switch (type) { case BIT8: if (data_size == sizeof (unsigned char)) { *(unsigned char*) data = *(CARD8 *) (fm->area + fm->idx); } else if (data_size == sizeof (unsigned short)) { *(unsigned short *) data = *(CARD8 *) (fm->area + fm->idx); } else if (data_size == sizeof (unsigned int)) { *(unsigned int *) data = *(CARD8 *) (fm->area + fm->idx); } else if (data_size == sizeof (unsigned long)) { *(unsigned long *) data = *(CARD8 *) (fm->area + fm->idx); } else { ; /* Should never reached */ } /*endif*/ fm->idx++; if ((fitr = _FrameIterCounterIncr (fm->iters, 1/*BIT8*/))) _FrameMgrRemoveIter (fm, fitr); /*endif*/ return FmSuccess; case BIT16: if (data_size == sizeof (unsigned char)) { *(unsigned char *) data = Swap16 (fm, *(CARD16 *) (fm->area + fm->idx)); } else if (data_size == sizeof (unsigned short)) { *(unsigned short *) data = Swap16 (fm, *(CARD16 *) (fm->area + fm->idx)); } else if (data_size == sizeof (unsigned int)) { *(unsigned int *) data = Swap16 (fm, *(CARD16 *) (fm->area + fm->idx)); } else if (data_size == sizeof (unsigned long)) { *(unsigned long *) data = Swap16 (fm, *(CARD16 *) (fm->area + fm->idx)); } else { ; /* Should never reached */ } /*endif*/ fm->idx += 2; if ((fitr = _FrameIterCounterIncr (fm->iters, 2/*BIT16*/))) _FrameMgrRemoveIter(fm, fitr); /*endif*/ return FmSuccess; case BIT32: if (data_size == sizeof (unsigned char)) { *(unsigned char *) data = Swap32 (fm, *(CARD32 *) (fm->area + fm->idx)); } else if (data_size == sizeof (unsigned short)) { *(unsigned short *) data = Swap32 (fm, *(CARD32 *) (fm->area + fm->idx)); } else if (data_size == sizeof (unsigned int)) { *(unsigned int *) data = Swap32 (fm, *(CARD32 *) (fm->area + fm->idx)); } else if (data_size == sizeof (unsigned long)) { *(unsigned long *) data = Swap32 (fm, *(CARD32 *) (fm->area + fm->idx)); } else { ; /* Should never reached */ } /*endif*/ fm->idx += 4; if ((fitr = _FrameIterCounterIncr (fm->iters, 4/*BIT32*/))) _FrameMgrRemoveIter (fm, fitr); /*endif*/ return FmSuccess; #if defined(_NEED64BIT) case BIT64: if (data_size == sizeof (unsigned char)) { *(unsigned char *) data = Swap64 (fm, *(CARD64 *) (fm->area + fm->idx)); } else if (data_size == sizeof (unsigned short)) { *(unsigned short *) data = Swap64 (fm, *(CARD64 *) (fm->area + fm->idx)); } else if (data_size == sizeof (unsigned int)) { *(unsigned int *) data = Swap64 (fm, *(CARD64 *) (fm->area + fm->idx)); } else if (data_size == sizeof (unsigned long)) { *(unsigned long *) data = Swap64 (fm, *(CARD64 *) (fm->area + fm->idx)); } else { ; /* Should never reached */ } /*endif*/ fm->idx += 8; if ((fitr = _FrameIterCounterIncr (fm->iters, 8/*BIT64*/))) _FrameMgrRemoveIter (fm, fitr); /*endif*/ return FmSuccess; #endif case BARRAY: if (info.num == NO_VALUE) return FmInvalidCall; /*endif*/ if (info.num > 0) { *(char **) data = fm->area + fm->idx; fm->idx += info.num; if ((fitr = _FrameIterCounterIncr (fm->iters, info.num))) _FrameMgrRemoveIter (fm, fitr); /*endif*/ } else { *(char **) data = NULL; } /*endif*/ return FmSuccess; case PADDING: if (info.num == NO_VALUE) return FmInvalidCall; /*endif*/ fm->idx += info.num; if ((fitr = _FrameIterCounterIncr (fm->iters, info.num))) _FrameMgrRemoveIter (fm, fitr); /*endif*/ return _FrameMgrGetToken (fm, data, data_size); case ITER: return FmInvalidCall; /* if comes here, it's a bug! */ case EOL: return FmEOD; default: break; } /*endswitch*/ return (FmStatus) NULL; /* Should never be reached */ } FmStatus FrameMgrSetSize (FrameMgr fm, int barray_size) { if (FrameInstSetSize (fm->fi, barray_size) == FmSuccess) return FmSuccess; /*endif*/ return FmNoMoreData; } FmStatus FrameMgrSetIterCount (FrameMgr fm, int count) { if (FrameInstSetIterCount (fm->fi, count) == FmSuccess) return FmSuccess; /*endif*/ return FmNoMoreData; } FmStatus FrameMgrSetTotalSize (FrameMgr fm, int total_size) { fm->total_size = total_size; return FmSuccess; } int FrameMgrGetTotalSize (FrameMgr fm) { return FrameInstGetTotalSize (fm->fi); } int FrameMgrGetSize (FrameMgr fm) { register int ret_size; ret_size = FrameInstGetSize (fm->fi); if (ret_size == NO_VALID_FIELD) return NO_VALUE; /*endif*/ return ret_size; } FmStatus FrameMgrSkipToken (FrameMgr fm, int skip_count) { XimFrameType type; XimFrameTypeInfoRec info; register int i; if (fm->total_size != NO_VALUE && fm->idx >= fm->total_size) return FmNoMoreData; /*endif*/ for (i = 0; i < skip_count; i++) { type = FrameInstGetNextType (fm->fi, &info); type &= ~COUNTER_MASK; switch (type) { case BIT8: fm->idx++; break; case BIT16: fm->idx += 2; break; case BIT32: fm->idx += 4; break; case BIT64: fm->idx += 8; break; case BARRAY: if (info.num == NO_VALUE) return FmInvalidCall; /*endif*/ fm->idx += info.num; break; case PADDING: if (info.num == NO_VALUE) return FmInvalidCall; /*endif*/ fm->idx += info.num; return FrameMgrSkipToken (fm, skip_count); case ITER: return FmInvalidCall; case EOL: return FmEOD; default: break; } /*endswitch*/ } /*endfor*/ return FmSuccess; } void FrameMgrReset (FrameMgr fm) { fm->idx = 0; FrameInstReset (fm->fi); } Bool FrameMgrIsIterLoopEnd (FrameMgr fm, FmStatus* status) { do { if (_FrameMgrIsIterLoopEnd (fm)) return True; /*endif*/ } while (_FrameMgrProcessPadding (fm, status)); return False; } /* Internal routines */ static Bool _FrameMgrIsIterLoopEnd (FrameMgr fm) { return FrameInstIsIterLoopEnd (fm->fi); } static Bool _FrameMgrProcessPadding (FrameMgr fm, FmStatus* status) { XimFrameTypeInfoRec info; XimFrameType next_type = FrameInstPeekNextType (fm->fi, &info); FrameIter fitr; if (next_type == PADDING) { if (info.num == NO_VALUE) { *status = FmInvalidCall; return True; } /*endif*/ next_type = FrameInstGetNextType (fm->fi, &info); fm->idx += info.num; if ((fitr = _FrameIterCounterIncr (fm->iters, info.num))) _FrameMgrRemoveIter (fm, fitr); /*endif*/ *status = FmSuccess; return True; } /*endif*/ *status = FmSuccess; return False; } static FrameInst FrameInstInit (XimFrame frame) { FrameInst fi; fi = (FrameInst) Xmalloc (sizeof (FrameInstRec)); fi->template = frame; fi->cur_no = 0; ChainMgrInit (&fi->cm); return fi; } static void FrameInstFree (FrameInst fi) { ChainIterRec ci; int frame_no; ExtraDataRec d; ChainIterInit (&ci, &fi->cm); while (ChainIterGetNext (&ci, &frame_no, &d)) { register XimFrameType type; type = fi->template[frame_no].type; if (type == ITER) { if (d.iter) IterFree (d.iter); /*endif*/ } else if (type == POINTER) { if (d.fi) FrameInstFree (d.fi); /*endif*/ } /*endif*/ } /*endwhile*/ ChainIterFree (&ci); ChainMgrFree (&fi->cm); Xfree (fi); } static XimFrameType FrameInstGetNextType(FrameInst fi, XimFrameTypeInfo info) { XimFrameType ret_type; ret_type = fi->template[fi->cur_no].type; switch (ret_type) { case BIT8: case BIT16: case BIT32: case BIT64: case EOL: fi->cur_no = _FrameInstIncrement(fi->template, fi->cur_no); break; case COUNTER_BIT8: case COUNTER_BIT16: case COUNTER_BIT32: case COUNTER_BIT64: if (info) { register int offset, iter_idx; info->counter.is_byte_len = (((long) fi->template[fi->cur_no].data & 0xFF)) == FmCounterByte; offset = ((long) fi->template[fi->cur_no].data) >> 8; iter_idx = fi->cur_no + offset; if (fi->template[iter_idx].type == ITER) { ExtraData d; ExtraDataRec dr; if ((d = ChainMgrGetExtraData (&fi->cm, iter_idx)) == NULL) { dr.iter = IterInit (&fi->template[iter_idx + 1], NO_VALUE); d = ChainMgrSetData (&fi->cm, iter_idx, dr); } /*endif*/ info->counter.iter = d->iter; } else { /* Should never reach here */ } /*endif*/ } /*endif*/ fi->cur_no = _FrameInstIncrement (fi->template, fi->cur_no); break; case BARRAY: if (info) { ExtraData d; if ((d = ChainMgrGetExtraData (&fi->cm, fi->cur_no)) == NULL) info->num = NO_VALUE; else info->num = d->num; /*endif*/ } /*endif*/ fi->cur_no = _FrameInstIncrement (fi->template, fi->cur_no); break; case PADDING: if (info) { register int unit; register int number; register int size; register int i; unit = _UNIT ((long) fi->template[fi->cur_no].data); number = _NUMBER ((long) fi->template[fi->cur_no].data); i = fi->cur_no; size = 0; while (number > 0) { i = _FrameInstDecrement (fi->template, i); size += _FrameInstGetItemSize (fi, i); number--; } /*endwhile*/ info->num = (unit - (size%unit))%unit; } /*endif*/ fi->cur_no = _FrameInstIncrement (fi->template, fi->cur_no); break; case ITER: { ExtraData d; ExtraDataRec dr; XimFrameType sub_type; if ((d = ChainMgrGetExtraData (&fi->cm, fi->cur_no)) == NULL) { dr.iter = IterInit (&fi->template[fi->cur_no + 1], NO_VALUE); d = ChainMgrSetData (&fi->cm, fi->cur_no, dr); } /*endif*/ sub_type = IterGetNextType (d->iter, info); if (sub_type == EOL) { fi->cur_no = _FrameInstIncrement (fi->template, fi->cur_no); ret_type = FrameInstGetNextType (fi, info); } else { ret_type = sub_type; } /*endif*/ } break; case POINTER: { ExtraData d; ExtraDataRec dr; XimFrameType sub_type; if ((d = ChainMgrGetExtraData (&fi->cm, fi->cur_no)) == NULL) { dr.fi = FrameInstInit (fi->template[fi->cur_no + 1].data); d = ChainMgrSetData (&fi->cm, fi->cur_no, dr); } /*endif*/ sub_type = FrameInstGetNextType (d->fi, info); if (sub_type == EOL) { fi->cur_no = _FrameInstIncrement (fi->template, fi->cur_no); ret_type = FrameInstGetNextType (fi, info); } else { ret_type = sub_type; } /*endif*/ } break; default: break; } /*endswitch*/ return ret_type; } static XimFrameType FrameInstPeekNextType (FrameInst fi, XimFrameTypeInfo info) { XimFrameType ret_type; ret_type = fi->template[fi->cur_no].type; switch (ret_type) { case BIT8: case BIT16: case BIT32: case BIT64: case EOL: break; case COUNTER_BIT8: case COUNTER_BIT16: case COUNTER_BIT32: case COUNTER_BIT64: if (info) { register int offset; register int iter_idx; info->counter.is_byte_len = (((long) fi->template[fi->cur_no].data) & 0xFF) == FmCounterByte; offset = ((long)fi->template[fi->cur_no].data) >> 8; iter_idx = fi->cur_no + offset; if (fi->template[iter_idx].type == ITER) { ExtraData d; ExtraDataRec dr; if ((d = ChainMgrGetExtraData (&fi->cm, iter_idx)) == NULL) { dr.iter = IterInit (&fi->template[iter_idx + 1], NO_VALUE); d = ChainMgrSetData (&fi->cm, iter_idx, dr); } /*endif*/ info->counter.iter = d->iter; } else { /* Should not be reached here */ } /*endif*/ } /*endif*/ break; case BARRAY: if (info) { ExtraData d; if ((d = ChainMgrGetExtraData (&fi->cm, fi->cur_no)) == NULL) info->num = NO_VALUE; else info->num = d->num; /*endif*/ } /*endif*/ break; case PADDING: if (info) { register int unit; register int number; register int size; register int i; unit = _UNIT ((long) fi->template[fi->cur_no].data); number = _NUMBER ((long) fi->template[fi->cur_no].data); i = fi->cur_no; size = 0; while (number > 0) { i = _FrameInstDecrement (fi->template, i); size += _FrameInstGetItemSize (fi, i); number--; } /*endwhile*/ info->num = (unit - (size%unit))%unit; } /*endif*/ break; case ITER: { ExtraData d; ExtraDataRec dr; XimFrameType sub_type; if ((d = ChainMgrGetExtraData (&fi->cm, fi->cur_no)) == NULL) { dr.iter = IterInit (&fi->template[fi->cur_no + 1], NO_VALUE); d = ChainMgrSetData (&fi->cm, fi->cur_no, dr); } /*endif*/ sub_type = IterPeekNextType (d->iter, info); if (sub_type == EOL) ret_type = FrameInstPeekNextType (fi, info); else ret_type = sub_type; /*endif*/ } break; case POINTER: { ExtraData d; ExtraDataRec dr; XimFrameType sub_type; if ((d = ChainMgrGetExtraData (&fi->cm, fi->cur_no)) == NULL) { dr.fi = FrameInstInit (fi->template[fi->cur_no + 1].data); d = ChainMgrSetData (&fi->cm, fi->cur_no, dr); } /*endif*/ sub_type = FrameInstPeekNextType (d->fi, info); if (sub_type == EOL) ret_type = FrameInstPeekNextType (fi, info); else ret_type = sub_type; /*endif*/ default: break; } break; } /*endswitch*/ return ret_type; } static Bool FrameInstIsIterLoopEnd (FrameInst fi) { Bool ret = False; if (fi->template[fi->cur_no].type == ITER) { ExtraData d = ChainMgrGetExtraData (&fi->cm, fi->cur_no); Bool yourself; if (d) { ret = IterIsLoopEnd (d->iter, &yourself); if (ret && yourself) fi->cur_no = _FrameInstIncrement (fi->template, fi->cur_no); /*endif*/ } /*endif*/ } /*endif*/ return (ret); } static FrameIter _FrameMgrAppendIter (FrameMgr fm, Iter it, int end) { FrameIter p = fm->iters; while (p && p->next) p = p->next; /*endwhile*/ if (!p) { fm->iters = p = (FrameIter) Xmalloc (sizeof (FrameIterRec)); } else { p->next = (FrameIter) Xmalloc (sizeof (FrameIterRec)); p = p->next; } /*endif*/ if (p) { p->iter = it; p->counting = False; p->counter = 0; p->end = end; p->next = NULL; } /*endif*/ return (p); } static void _FrameMgrRemoveIter (FrameMgr fm, FrameIter it) { FrameIter prev; FrameIter p; prev = NULL; p = fm->iters; while (p) { if (p == it) { if (prev) prev->next = p->next; else fm->iters = p->next; /*endif*/ Xfree (p); break; } /*endif*/ prev = p; p = p->next; } /*endwhile*/ } static FrameIter _FrameIterCounterIncr (FrameIter fitr, int i) { FrameIter p = fitr; while (p) { if (p->counting) { p->counter += i; if (p->counter >= p->end) { IterFixIteration (p->iter); return (p); } /*endif*/ } /*endif*/ p = p->next; } /*endwhile*/ return (NULL); } static void _IterStartWatch (Iter it, void *client_data) { FrameIter p = (FrameIter) client_data; p->counting = True; } static FmStatus FrameInstSetSize (FrameInst fi, int num) { ExtraData d; ExtraDataRec dr; XimFrameType type; register int i; i = 0; while ((type = fi->template[i].type) != EOL) { switch (type) { case BARRAY: if ((d = ChainMgrGetExtraData (&fi->cm, i)) == NULL) { dr.num = -1; d = ChainMgrSetData (&fi->cm, i, dr); } /*endif*/ if (d->num == NO_VALUE) { d->num = num; return FmSuccess; } /*endif*/ break; case ITER: if ((d = ChainMgrGetExtraData (&fi->cm, i)) == NULL) { dr.iter = IterInit (&fi->template[i + 1], NO_VALUE); d = ChainMgrSetData (&fi->cm, i, dr); } /*endif*/ if (IterSetSize (d->iter, num) == FmSuccess) return FmSuccess; /*endif*/ break; case POINTER: if ((d = ChainMgrGetExtraData(&fi->cm, i)) == NULL) { dr.fi = FrameInstInit(fi->template[i + 1].data); d = ChainMgrSetData(&fi->cm, i, dr); } /*endif*/ if (FrameInstSetSize(d->fi, num) == FmSuccess) return FmSuccess; /*endif*/ break; default: break; } /*endswitch*/ i = _FrameInstIncrement(fi->template, i); } /*endwhile*/ return FmNoMoreData; } static int FrameInstGetSize (FrameInst fi) { XimFrameType type; register int i; ExtraData d; ExtraDataRec dr; int ret_size; i = fi->cur_no; while ((type = fi->template[i].type) != EOL) { switch (type) { case BARRAY: if ((d = ChainMgrGetExtraData (&fi->cm, i)) == NULL) return NO_VALUE; /*endif*/ return d->num; case ITER: if ((d = ChainMgrGetExtraData (&fi->cm, i)) == NULL) { dr.iter = IterInit (&fi->template[i + 1], NO_VALUE); d = ChainMgrSetData (&fi->cm, i, dr); } /*endif*/ ret_size = IterGetSize(d->iter); if (ret_size != NO_VALID_FIELD) return ret_size; /*endif*/ break; case POINTER: if ((d = ChainMgrGetExtraData (&fi->cm, i)) == NULL) { dr.fi = FrameInstInit (fi->template[i + 1].data); d = ChainMgrSetData (&fi->cm, i, dr); } /*endif*/ ret_size = FrameInstGetSize (d->fi); if (ret_size != NO_VALID_FIELD) return ret_size; /*endif*/ break; default: break; } /*endswitch*/ i = _FrameInstIncrement (fi->template, i); } /*endwhile*/ return NO_VALID_FIELD; } static FmStatus FrameInstSetIterCount (FrameInst fi, int num) { ExtraData d; ExtraDataRec dr; register int i; XimFrameType type; i = 0; while ((type = fi->template[i].type) != EOL) { switch (type) { case ITER: if ((d = ChainMgrGetExtraData (&fi->cm, i)) == NULL) { dr.iter = IterInit (&fi->template[i + 1], num); (void)ChainMgrSetData (&fi->cm, i, dr); return FmSuccess; } /*endif*/ if (IterSetIterCount (d->iter, num) == FmSuccess) return FmSuccess; /*endif*/ break; case POINTER: if ((d = ChainMgrGetExtraData (&fi->cm, i)) == NULL) { dr.fi = FrameInstInit (fi->template[i + 1].data); d = ChainMgrSetData (&fi->cm, i, dr); } /*endif*/ if (FrameInstSetIterCount (d->fi, num) == FmSuccess) return FmSuccess; /*endif*/ break; default: break; } /*endswitch*/ i = _FrameInstIncrement (fi->template, i); } /*endwhile*/ return FmNoMoreData; } static int FrameInstGetTotalSize (FrameInst fi) { register int size; register int i; size = 0; i = 0; while (fi->template[i].type != EOL) { size += _FrameInstGetItemSize (fi, i); i = _FrameInstIncrement (fi->template, i); } /*endwhile*/ return size; } static void FrameInstReset (FrameInst fi) { ChainIterRec ci; int frame_no; ExtraDataRec d; ChainIterInit (&ci, &fi->cm); while (ChainIterGetNext (&ci, &frame_no, &d)) { register XimFrameType type; type = fi->template[frame_no].type; if (type == ITER) { if (d.iter) IterReset (d.iter); /*endif*/ } else if (type == POINTER) { if (d.fi) FrameInstReset (d.fi); /*endif*/ } /*endif*/ } /*endwhile*/ ChainIterFree (&ci); fi->cur_no = 0; } static Iter IterInit (XimFrame frame, int count) { Iter it; register XimFrameType type; it = (Iter) Xmalloc (sizeof (IterRec)); it->template = frame; it->max_count = (count == NO_VALUE) ? 0 : count; it->allow_expansion = (count == NO_VALUE); it->cur_no = 0; it->start_watch_proc = NULL; it->client_data = NULL; it->start_counter = False; type = frame->type; if (type & COUNTER_MASK) { /* COUNTER_XXX cannot be an item of a ITER */ Xfree (it); return NULL; } /*endif*/ switch (type) { case BIT8: case BIT16: case BIT32: case BIT64: /* Do nothing */ break; case BARRAY: case ITER: case POINTER: ChainMgrInit (&it->cm); break; default: Xfree (it); return NULL; /* This should never occur */ } /*endswitch*/ return it; } static void IterFree (Iter it) { switch (it->template->type) { case BARRAY: ChainMgrFree (&it->cm); break; case ITER: { ChainIterRec ci; int count; ExtraDataRec d; ChainIterInit (&ci, &it->cm); while (ChainIterGetNext (&ci, &count, &d)) IterFree (d.iter); /*endwhile*/ ChainIterFree (&ci); ChainMgrFree (&it->cm); } break; case POINTER: { ChainIterRec ci; int count; ExtraDataRec dr; ChainIterInit (&ci, &it->cm); while (ChainIterGetNext (&ci, &count, &dr)) FrameInstFree (dr.fi); /*endwhile*/ ChainIterFree (&ci); ChainMgrFree (&it->cm); } break; default: break; } /*endswitch*/ Xfree (it); } static Bool IterIsLoopEnd (Iter it, Bool *myself) { Bool ret = False; *myself = False; if (!it->allow_expansion && (it->cur_no == it->max_count)) { *myself = True; return True; } /*endif*/ if (it->template->type == POINTER) { ExtraData d = ChainMgrGetExtraData (&it->cm, it->cur_no); if (d) { if (FrameInstIsIterLoopEnd (d->fi)) { ret = True; } else { if (FrameInstIsEnd (d->fi)) { it->cur_no++; if (!it->allow_expansion && it->cur_no == it->max_count) { *myself = True; ret = True; } /*endif*/ } /*endif*/ } /*endif*/ } /*endif*/ } else if (it->template->type == ITER) { ExtraData d = ChainMgrGetExtraData (&it->cm, it->cur_no); if (d) { Bool yourself; if (IterIsLoopEnd (d->iter, &yourself)) ret = True; /*endif*/ } /*endif*/ } /*endif*/ return ret; } static XimFrameType IterGetNextType (Iter it, XimFrameTypeInfo info) { XimFrameType type = it->template->type; if (it->start_counter) { (*it->start_watch_proc) (it, it->client_data); it->start_counter = False; } /*endif*/ if (it->cur_no >= it->max_count) { if (it->allow_expansion) it->max_count = it->cur_no + 1; else return EOL; /*endif*/ } /*endif*/ switch (type) { case BIT8: case BIT16: case BIT32: case BIT64: it->cur_no++; return type; case BARRAY: if (info) { ExtraData d; if ((d = ChainMgrGetExtraData (&it->cm, it->cur_no)) == NULL) info->num = NO_VALUE; else info->num = d->num; /*endif*/ } /*endif*/ it->cur_no++; return BARRAY; case ITER: { XimFrameType ret_type; ExtraData d; ExtraDataRec dr; if ((d = ChainMgrGetExtraData (&it->cm, it->cur_no)) == NULL) { dr.iter = IterInit (it->template + 1, NO_VALUE); d = ChainMgrSetData (&it->cm, it->cur_no, dr); } /*endif*/ ret_type = IterGetNextType (d->iter, info); if (ret_type == EOL) { it->cur_no++; ret_type = IterGetNextType (it, info); } /*endif*/ return ret_type; } case POINTER: { XimFrameType ret_type; ExtraData d; ExtraDataRec dr; if ((d = ChainMgrGetExtraData (&it->cm, it->cur_no)) == NULL) { dr.fi = FrameInstInit (it->template[1].data); d = ChainMgrSetData (&it->cm, it->cur_no, dr); } /*endif*/ ret_type = FrameInstGetNextType (d->fi, info); if (ret_type == EOL) { it->cur_no++; ret_type = IterGetNextType (it, info); } /*endif*/ return ret_type; } default: return (XimFrameType) NULL; } /*endswitch*/ return (XimFrameType) NULL; /* This should never occur */ } static XimFrameType IterPeekNextType (Iter it, XimFrameTypeInfo info) { XimFrameType type = it->template->type; if (!it->allow_expansion && it->cur_no >= it->max_count) return (EOL); /*endif*/ switch (type) { case BIT8: case BIT16: case BIT32: case BIT64: return type; case BARRAY: if (info) { ExtraData d; if ((d = ChainMgrGetExtraData (&it->cm, it->cur_no)) == NULL) info->num = NO_VALUE; else info->num = d->num; /*endif*/ } /*endif*/ return BARRAY; case ITER: { XimFrameType ret_type; ExtraData d; ExtraDataRec dr; if ((d = ChainMgrGetExtraData (&it->cm, it->cur_no)) == NULL) { dr.iter = IterInit (it->template + 1, NO_VALUE); d = ChainMgrSetData (&it->cm, it->cur_no, dr); } /*endif*/ ret_type = IterPeekNextType (d->iter, info); if (ret_type == EOL) ret_type = IterPeekNextType (it, info); /*endif*/ return ret_type; } case POINTER: { XimFrameType ret_type; ExtraData d; ExtraDataRec dr; if ((d = ChainMgrGetExtraData (&it->cm, it->cur_no)) == NULL) { dr.fi = FrameInstInit (it->template[1].data); d = ChainMgrSetData (&it->cm, it->cur_no, dr); } /*endif*/ ret_type = FrameInstPeekNextType (d->fi, info); if (ret_type == EOL) ret_type = IterPeekNextType (it, info); /*endif*/ return (ret_type); } default: break; } /*endswitch*/ /* Reaching here is a bug! */ return (XimFrameType) NULL; } static FmStatus IterSetSize (Iter it, int num) { XimFrameType type; register int i; if (!it->allow_expansion && it->max_count == 0) return FmNoMoreData; /*endif*/ type = it->template->type; switch (type) { case BARRAY: { ExtraData d; ExtraDataRec dr; for (i = 0; i < it->max_count; i++) { if ((d = ChainMgrGetExtraData (&it->cm, i)) == NULL) { dr.num = NO_VALUE; d = ChainMgrSetData (&it->cm, i, dr); } /*endif*/ if (d->num == NO_VALUE) { d->num = num; return FmSuccess; } /*endif*/ } /*endfor*/ if (it->allow_expansion) { ExtraDataRec dr; dr.num = num; ChainMgrSetData (&it->cm, it->max_count, dr); it->max_count++; return FmSuccess; } /*endif*/ } return FmNoMoreData; case ITER: { ExtraData d; ExtraDataRec dr; for (i = 0; i < it->max_count; i++) { if ((d = ChainMgrGetExtraData (&it->cm, i)) == NULL) { dr.iter = IterInit (it->template + 1, NO_VALUE); d = ChainMgrSetData (&it->cm, i, dr); } /*endif*/ if (IterSetSize (d->iter, num) == FmSuccess) return FmSuccess; /*endif*/ } /*endfor*/ if (it->allow_expansion) { ExtraDataRec dr; dr.iter = IterInit (it->template + 1, NO_VALUE); ChainMgrSetData (&it->cm, it->max_count, dr); it->max_count++; if (IterSetSize(dr.iter, num) == FmSuccess) return FmSuccess; /*endif*/ } /*endif*/ } return FmNoMoreData; case POINTER: { ExtraData d; ExtraDataRec dr; for (i = 0; i < it->max_count; i++) { if ((d = ChainMgrGetExtraData (&it->cm, i)) == NULL) { dr.fi = FrameInstInit (it->template[1].data); d = ChainMgrSetData (&it->cm, i, dr); } /*endif*/ if (FrameInstSetSize (d->fi, num) == FmSuccess) return FmSuccess; /*endif*/ } /*endfor*/ if (it->allow_expansion) { ExtraDataRec dr; dr.fi = FrameInstInit (it->template[1].data); ChainMgrSetData (&it->cm, it->max_count, dr); it->max_count++; if (FrameInstSetSize (dr.fi, num) == FmSuccess) return FmSuccess; /*endif*/ } /*endif*/ } return FmNoMoreData; default: break; } /*endswitch*/ return FmNoMoreData; } static int IterGetSize (Iter it) { register int i; ExtraData d; ExtraDataRec dr; if (it->cur_no >= it->max_count) return NO_VALID_FIELD; /*endif*/ switch (it->template->type) { case BARRAY: if ((d = ChainMgrGetExtraData (&it->cm, it->cur_no)) == NULL) return NO_VALUE; /*endif*/ return d->num; case ITER: for (i = it->cur_no; i < it->max_count; i++) { int ret_size; if ((d = ChainMgrGetExtraData (&it->cm, i)) == NULL) { dr.iter = IterInit (it->template + 1, NO_VALUE); d = ChainMgrSetData (&it->cm, i, dr); } /*endif*/ ret_size = IterGetSize (d->iter); if (ret_size != NO_VALID_FIELD) return ret_size; /*endif*/ } /*endfor*/ return NO_VALID_FIELD; case POINTER: for (i = it->cur_no; i < it->max_count; i++) { int ret_size; if ((d = ChainMgrGetExtraData (&it->cm, i)) == NULL) { dr.fi = FrameInstInit (it->template[1].data); d = ChainMgrSetData (&it->cm, i, dr); } /*endif*/ ret_size = FrameInstGetSize (d->fi); if (ret_size != NO_VALID_FIELD) return ret_size; /*endif*/ } /*endfor*/ return NO_VALID_FIELD; default: break; } /*endswitch*/ return NO_VALID_FIELD; } static FmStatus IterSetIterCount (Iter it, int num) { register int i; if (it->allow_expansion) { it->max_count = num; it->allow_expansion = False; return FmSuccess; } /*endif*/ if (it->max_count == 0) return FmNoMoreData; /*endif*/ switch (it->template->type) { case ITER: for (i = 0; i < it->max_count; i++) { ExtraData d; ExtraDataRec dr; if ((d = ChainMgrGetExtraData(&it->cm, i)) == NULL) { dr.iter = IterInit(it->template + 1, num); (void)ChainMgrSetData(&it->cm, i, dr); return FmSuccess; } /*endif*/ if (IterSetIterCount(d->iter, num) == FmSuccess) return FmSuccess; /*endif*/ } /*endfor*/ if (it->allow_expansion) { ExtraDataRec dr; dr.iter = IterInit (it->template + 1, num); ChainMgrSetData (&it->cm, it->max_count, dr); it->max_count++; return FmSuccess; } /*endif*/ break; case POINTER: for (i = 0; i < it->max_count; i++) { ExtraData d; ExtraDataRec dr; if ((d = ChainMgrGetExtraData (&it->cm, i)) == NULL) { dr.fi = FrameInstInit (it->template[1].data); d = ChainMgrSetData (&it->cm, i, dr); } /*endif*/ if (FrameInstSetIterCount (d->fi, num) == FmSuccess) return FmSuccess; /*endif*/ } /*endfor*/ if (it->allow_expansion) { ExtraDataRec dr; dr.fi = FrameInstInit (it->template[1].data); ChainMgrSetData (&it->cm, it->max_count, dr); it->max_count++; if (FrameInstSetIterCount (dr.fi, num) == FmSuccess) return FmSuccess; /*endif*/ } /*endif*/ break; default: break; } /*endswitch*/ return FmNoMoreData; } static int IterGetTotalSize (Iter it) { register int size, i; XimFrameType type; if (it->allow_expansion) return NO_VALUE; /*endif*/ if (it->max_count == 0) return 0; /*endif*/ size = 0; type = it->template->type; switch (type) { case BIT8: size = it->max_count; break; case BIT16: size = it->max_count*2; break; case BIT32: size = it->max_count*4; break; case BIT64: size = it->max_count*8; break; case BARRAY: for (i = 0; i < it->max_count; i++) { register int num; ExtraData d; if ((d = ChainMgrGetExtraData (&it->cm, i)) == NULL) return NO_VALUE; /*endif*/ if ((num = d->num) == NO_VALUE) return NO_VALUE; /*endif*/ size += num; } /*endfor*/ break; case ITER: for (i = 0; i < it->max_count; i++) { register int num; ExtraData d; if ((d = ChainMgrGetExtraData (&it->cm, i)) == NULL) return NO_VALUE; /*endif*/ if ((num = IterGetTotalSize (d->iter)) == NO_VALUE) return NO_VALUE; /*endif*/ size += num; } /*endfor*/ break; case POINTER: for (i = 0; i < it->max_count; i++) { register int num; ExtraData d; ExtraDataRec dr; if ((d = ChainMgrGetExtraData (&it->cm, i)) == NULL) { dr.fi = FrameInstInit (it->template[1].data); d = ChainMgrSetData (&it->cm, i, dr); } /*endif*/ if ((num = FrameInstGetTotalSize (d->fi)) == NO_VALUE) return NO_VALUE; /*endif*/ size += num; } /*endfor*/ break; default: break; } /*endswitch*/ return size; } static void IterReset (Iter it) { ChainIterRec ci; int count; ExtraDataRec d; switch (it->template->type) { case ITER: ChainIterInit (&ci, &it->cm); while (ChainIterGetNext (&ci, &count, &d)) IterReset (d.iter); /*endwhile*/ ChainIterFree (&ci); break; case POINTER: ChainIterInit (&ci, &it->cm); while (ChainIterGetNext (&ci, &count, &d)) FrameInstReset (d.fi); /*endwhile*/ ChainIterFree (&ci); break; default: break; } /*endswitch*/ it->cur_no = 0; } static void IterSetStartWatch (Iter it, IterStartWatchProc proc, void *client_data) { it->start_watch_proc = proc; it->client_data = client_data; } static ExtraData ChainMgrSetData (ChainMgr cm, int frame_no, ExtraDataRec data) { Chain cur = (Chain) Xmalloc (sizeof (ChainRec)); cur->frame_no = frame_no; cur->d = data; cur->next = NULL; if (cm->top == NULL) { cm->top = cm->tail = cur; } else { cm->tail->next = cur; cm->tail = cur; } /*endif*/ return &cur->d; } static ExtraData ChainMgrGetExtraData (ChainMgr cm, int frame_no) { Chain cur; cur = cm->top; while (cur) { if (cur->frame_no == frame_no) return &cur->d; /*endif*/ cur = cur->next; } /*endwhile*/ return NULL; } static Bool ChainIterGetNext (ChainIter ci, int *frame_no, ExtraData d) { if (ci->cur == NULL) return False; /*endif*/ *frame_no = ci->cur->frame_no; *d = ci->cur->d; ci->cur = ci->cur->next; return True; } static int _FrameInstIncrement (XimFrame frame, int count) { XimFrameType type; type = frame[count].type; type &= ~COUNTER_MASK; switch (type) { case BIT8: case BIT16: case BIT32: case BIT64: case BARRAY: case PADDING: return count + 1; case POINTER: return count + 2; case ITER: return _FrameInstIncrement (frame, count + 1); default: break; } /*endswitch*/ return - 1; /* Error */ } static int _FrameInstDecrement (XimFrame frame, int count) { register int i; XimFrameType type; if (count == 0) return - 1; /* cannot decrement */ /*endif*/ if (count == 1) return 0; /* BOGUS - It should check the contents of data */ /*endif*/ type = frame[count - 2].type; type &= ~COUNTER_MASK; switch (type) { case BIT8: case BIT16: case BIT32: case BIT64: case BARRAY: case PADDING: case PTR_ITEM: return count - 1; case POINTER: case ITER: i = count - 3; while (i >= 0) { if (frame[i].type != ITER) return i + 1; /*endif*/ i--; } /*endwhile*/ return 0; default: break; } /*enswitch*/ return - 1; /* Error */ } static int _FrameInstGetItemSize (FrameInst fi, int cur_no) { XimFrameType type; type = fi->template[cur_no].type; type &= ~COUNTER_MASK; switch (type) { case BIT8: return 1; case BIT16: return 2; case BIT32: return 4; case BIT64: return 8; case BARRAY: { ExtraData d; if ((d = ChainMgrGetExtraData (&fi->cm, cur_no)) == NULL) return NO_VALUE; /*endif*/ if (d->num == NO_VALUE) return NO_VALUE; /*endif*/ return d->num; } case PADDING: { register int unit; register int number; register int size; register int i; unit = _UNIT ((long) fi->template[cur_no].data); number = _NUMBER ((long) fi->template[cur_no].data); i = cur_no; size = 0; while (number > 0) { i = _FrameInstDecrement (fi->template, i); size += _FrameInstGetItemSize (fi, i); number--; } /*endwhile*/ size = (unit - (size%unit))%unit; return size; } case ITER: { ExtraData d; int sub_size; if ((d = ChainMgrGetExtraData (&fi->cm, cur_no)) == NULL) return NO_VALUE; /*endif*/ sub_size = IterGetTotalSize (d->iter); if (sub_size == NO_VALUE) return NO_VALUE; /*endif*/ return sub_size; } case POINTER: { ExtraData d; int sub_size; if ((d = ChainMgrGetExtraData (&fi->cm, cur_no)) == NULL) return NO_VALUE; /*endif*/ sub_size = FrameInstGetTotalSize (d->fi); if (sub_size == NO_VALUE) return NO_VALUE; /*endif*/ return sub_size; } default: break; } /*endswitch*/ return NO_VALUE; } nabi-1.0.0/IMdkit/FrameMgr.h0000644000175000017500000001072711655153252012410 00000000000000/****************************************************************** Copyright 1993, 1994 by Digital Equipment Corporation, Maynard, Massachusetts, All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation, and that the names of Digital or MIT not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. Author: Hiroyuki Miyamoto Digital Equipment Corporation miyamoto@jrd.dec.com This version tidied and debugged by Steve Underwood May 1999 ******************************************************************/ #ifndef FRAMEMGR_H #define FRAMEMGR_H #include #include #include #if defined(VAXC) && !defined(__DECC) #define xim_externalref globalref #define xim_externaldef globaldef #else #define xim_externalref extern #define xim_externaldef #endif /* Definitions for FrameMgr */ #define COUNTER_MASK 0x10 typedef enum { BIT8 = 0x1, /* {CARD8* | INT8*} */ BIT16 = 0x2, /* {CARD16* | INT16*} */ BIT32 = 0x3, /* {CARD32* | INT32*} */ BIT64 = 0x4, /* {CARD64* | INT64*} */ BARRAY = 0x5, /* int*, void* */ ITER = 0x6, /* int* */ POINTER = 0x7, /* specifies next item is a PTR_ITEM */ PTR_ITEM = 0x8, /* specifies the item has a pointer */ /* BOGUS - POINTER and PTR_ITEM * In the current implementation, PTR_ITEM should be lead by * POINTER. But actually, it's just redundant logically. Someone * may remove this redundancy and POINTER from the enum member but he * should also modify the logic in FrameMgr program. */ PADDING = 0x9, /* specifies that a padding is needed. * This requires extra data in data field. */ EOL = 0xA, /* specifies the end of list */ COUNTER_BIT8 = COUNTER_MASK | 0x1, COUNTER_BIT16 = COUNTER_MASK | 0x2, COUNTER_BIT32 = COUNTER_MASK | 0x3, COUNTER_BIT64 = COUNTER_MASK | 0x4 } XimFrameType; /* Convenient macro */ #define _FRAME(a) {a, NULL} #define _PTR(p) {PTR_ITEM, (void *)p} /* PADDING's usage of data field * B15-B8 : Shows the number of effective items. * B7-B0 : Shows padding unit. ex) 04 shows 4 unit padding. */ #define _PAD2(n) {PADDING, (void*)((n)<<8|2)} #define _PAD4(n) {PADDING, (void*)((n)<<8|4)} #define FmCounterByte 0 #define FmCounterNumber 1 #define _BYTE_COUNTER(type, offset) \ {(COUNTER_MASK|type), (void*)((offset)<<8|FmCounterByte)} #define _NUMBER_COUNTER(type, offset) \ {(COUNTER_MASK|type), (void*)((offset)<<8|FmCounterNumber)} typedef struct _XimFrame { XimFrameType type; void* data; /* For PTR_ITEM and PADDING */ } XimFrameRec, *XimFrame; typedef enum { FmSuccess, FmEOD, FmInvalidCall, FmBufExist, FmCannotCalc, FmNoMoreData } FmStatus; typedef struct _FrameMgr *FrameMgr; FrameMgr FrameMgrInit(XimFrame frame, char* area, Bool byte_swap); void FrameMgrInitWithData(FrameMgr fm, XimFrame frame, void* area, Bool byte_swap); void FrameMgrFree(FrameMgr fm); FmStatus FrameMgrSetBuffer(FrameMgr, void*); FmStatus _FrameMgrPutToken(FrameMgr, void*, int); FmStatus _FrameMgrGetToken(FrameMgr, void*, int); FmStatus FrameMgrSetSize(FrameMgr, int); FmStatus FrameMgrSetIterCount(FrameMgr, int); FmStatus FrameMgrSetTotalSize(FrameMgr, int); int FrameMgrGetTotalSize(FrameMgr); int FrameMgrGetSize(FrameMgr); FmStatus FrameMgrSkipToken(FrameMgr, int); void FrameMgrReset(FrameMgr); Bool FrameMgrIsIterLoopEnd(FrameMgr, FmStatus*); #define FrameMgrPutToken(fm, obj) _FrameMgrPutToken((fm), &(obj), sizeof(obj)) #define FrameMgrGetToken(fm, obj) _FrameMgrGetToken((fm), &(obj), sizeof(obj)) #endif /* FRAMEMGR_H */ nabi-1.0.0/IMdkit/IMConn.c0000644000175000017500000001020111655153252012011 00000000000000/****************************************************************** Copyright 1994, 1995 by Sun Microsystems, Inc. Copyright 1993, 1994 by Hewlett-Packard Company Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation, and that the name of Sun Microsystems, Inc. and Hewlett-Packard not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. Sun Microsystems, Inc. and Hewlett-Packard make no representations about the suitability of this software for any purpose. It is provided "as is" without express or implied warranty. SUN MICROSYSTEMS INC. AND HEWLETT-PACKARD COMPANY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SUN MICROSYSTEMS, INC. AND HEWLETT-PACKARD COMPANY BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. Author: Hidetoshi Tajima(tajima@Eng.Sun.COM) Sun Microsystems, Inc. This version tidied and debugged by Steve Underwood May 1999 ******************************************************************/ #include #include #include #include "IMdkit.h" #include #define Va_start(a,b) va_start(a,b) static void _IMCountVaList(va_list var, int *total_count) { char *attr; *total_count = 0; for (attr = va_arg (var, char*); attr; attr = va_arg (var, char*)) { (void)va_arg (var, XIMArg *); ++(*total_count); } /*endfor*/ } static void _IMVaToNestedList(va_list var, int max_count, XIMArg **args_return) { XIMArg *args; char *attr; if (max_count <= 0) { *args_return = (XIMArg *) NULL; return; } /*endif*/ args = (XIMArg *) malloc ((unsigned) (max_count + 1)*sizeof (XIMArg)); *args_return = args; if (!args) return; /*endif*/ for (attr = va_arg (var, char*); attr; attr = va_arg (var, char *)) { args->name = attr; args->value = va_arg (var, XPointer); args++; } /*endfor*/ args->name = (char*)NULL; } static char *_FindModifiers (XIMArg *args) { char *modifiers; while (args->name) { if (strcmp (args->name, IMModifiers) == 0) { modifiers = args->value; return modifiers; } else { args++; } /*endif*/ } /*endwhile*/ return NULL; } XIMS _GetIMS (char *modifiers) { XIMS ims; extern IMMethodsRec Xi18n_im_methods; if ((ims = (XIMS) malloc (sizeof (XIMProtocolRec))) == (XIMS) NULL) return ((XIMS) NULL); /*endif*/ memset ((void *) ims, 0, sizeof (XIMProtocolRec)); if (modifiers == NULL || modifiers[0] == '\0' || strcmp (modifiers, "Xi18n") == 0) { ims->methods = &Xi18n_im_methods; return ims; } /*endif*/ free (ims); return (XIMS) NULL; } XIMS IMOpenIM (Display *display, ...) { va_list var; int total_count; XIMArg *args; XIMS ims; char *modifiers; Status ret; Va_start (var, display); _IMCountVaList (var, &total_count); va_end (var); Va_start (var, display); _IMVaToNestedList (var, total_count, &args); va_end (var); modifiers = _FindModifiers (args); ims = _GetIMS (modifiers); if (ims == (XIMS) NULL) return (XIMS) NULL; /*endif*/ ims->core.display = display; ims->protocol = (*ims->methods->setup) (display, args); XFree (args); if (ims->protocol == (void *) NULL) { XFree (ims); return (XIMS) NULL; } /*endif*/ ret = (ims->methods->openIM) (ims); if (ret == False) { XFree (ims); return (XIMS) NULL; } /*endif*/ return (XIMS) ims; } Status IMCloseIM (XIMS ims) { (ims->methods->closeIM) (ims); XFree (ims); return True; } nabi-1.0.0/IMdkit/IMMethod.c0000644000175000017500000000443011655153252012343 00000000000000/****************************************************************** Copyright 1994, 1995 by Sun Microsystems, Inc. Copyright 1993, 1994 by Hewlett-Packard Company Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation, and that the name of Sun Microsystems, Inc. and Hewlett-Packard not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. Sun Microsystems, Inc. and Hewlett-Packard make no representations about the suitability of this software for any purpose. It is provided "as is" without express or implied warranty. SUN MICROSYSTEMS INC. AND HEWLETT-PACKARD COMPANY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SUN MICROSYSTEMS, INC. AND HEWLETT-PACKARD COMPANY BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. Author: Hidetoshi Tajima(tajima@Eng.Sun.COM) Sun Microsystems, Inc. This version tidied and debugged by Steve Underwood May 1999 ******************************************************************/ #include #include "IMdkit.h" /* Public Function */ void IMForwardEvent (XIMS ims, XPointer call_data) { (ims->methods->forwardEvent) (ims, call_data); } void IMCommitString (XIMS ims, XPointer call_data) { (ims->methods->commitString) (ims, call_data); } int IMCallCallback (XIMS ims, XPointer call_data) { return (ims->methods->callCallback) (ims, call_data); } int IMPreeditStart (XIMS ims, XPointer call_data) { return (ims->methods->preeditStart) (ims, call_data); } int IMPreeditEnd (XIMS ims, XPointer call_data) { return (ims->methods->preeditEnd) (ims, call_data); } int IMSyncXlib(XIMS ims, XPointer call_data) { ims->sync = True; return (ims->methods->syncXlib) (ims, call_data); } nabi-1.0.0/IMdkit/IMValues.c0000644000175000017500000000644511655153252012372 00000000000000/****************************************************************** Copyright 1994, 1995 by Sun Microsystems, Inc. Copyright 1993, 1994 by Hewlett-Packard Company Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation, and that the name of Sun Microsystems, Inc. and Hewlett-Packard not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. Sun Microsystems, Inc. and Hewlett-Packard make no representations about the suitability of this software for any purpose. It is provided "as is" without express or implied warranty. SUN MICROSYSTEMS INC. AND HEWLETT-PACKARD COMPANY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SUN MICROSYSTEMS, INC. AND HEWLETT-PACKARD COMPANY BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. Author: Hidetoshi Tajima(tajima@Eng.Sun.COM) Sun Microsystems, Inc. This version tidied and debugged by Steve Underwood May 1999 ******************************************************************/ #include #include #include "IMdkit.h" #include #define Va_start(a,b) va_start(a,b) static void _IMCountVaList (va_list var, int *total_count) { char *attr; *total_count = 0; for (attr = va_arg (var, char *); attr; attr = va_arg (var, char *)) { (void)va_arg (var, XIMArg *); ++(*total_count); } /*endfor*/ } static void _IMVaToNestedList (va_list var, int max_count, XIMArg **args_return) { XIMArg *args; char *attr; if (max_count <= 0) { *args_return = (XIMArg *) NULL; return; } /*endif*/ args = (XIMArg *) malloc ((unsigned) (max_count + 1)*sizeof (XIMArg)); *args_return = args; if (!args) return; /*endif*/ for (attr = va_arg (var, char *); attr; attr = va_arg (var, char *)) { args->name = attr; args->value = va_arg (var, XPointer); args++; } /*endfor*/ args->name = (char *) NULL; } char *IMGetIMValues (XIMS ims, ...) { va_list var; int total_count; XIMArg *args; char *ret; Va_start (var, ims); _IMCountVaList (var, &total_count); va_end (var); Va_start (var, ims); _IMVaToNestedList (var, total_count, &args); va_end (var); ret = (*ims->methods->getIMValues) (ims, args); if (args) XFree ((char *) args); /*endif*/ return ret; } char *IMSetIMValues (XIMS ims, ...) { va_list var; int total_count; XIMArg *args; char *ret; Va_start (var, ims); _IMCountVaList (var, &total_count); va_end (var); Va_start (var, ims); _IMVaToNestedList (var, total_count, &args); va_end (var); ret = (*ims->methods->setIMValues) (ims, args); if (args) XFree ((char *) args); /*endif*/ return ret; } nabi-1.0.0/IMdkit/IMdkit.h0000644000175000017500000001026611655153252012067 00000000000000/****************************************************************** Copyright 1994, 1995 by Sun Microsystems, Inc. Copyright 1993, 1994 by Hewlett-Packard Company Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation, and that the name of Sun Microsystems, Inc. and Hewlett-Packard not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. Sun Microsystems, Inc. and Hewlett-Packard make no representations about the suitability of this software for any purpose. It is provided "as is" without express or implied warranty. SUN MICROSYSTEMS INC. AND HEWLETT-PACKARD COMPANY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SUN MICROSYSTEMS, INC. AND HEWLETT-PACKARD COMPANY BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. Author: Hidetoshi Tajima(tajima@Eng.Sun.COM) Sun Microsystems, Inc. This version tidied and debugged by Steve Underwood May 1999 ******************************************************************/ #ifndef _IMdkit_h #define _IMdkit_h #include /* IM Attributes Name */ #define IMModifiers "modifiers" #define IMServerWindow "serverWindow" #define IMServerName "serverName" #define IMServerTransport "serverTransport" #define IMLocale "locale" #define IMInputStyles "inputStyles" #define IMProtocolHandler "protocolHandler" #define IMOnKeysList "onKeysList" #define IMOffKeysList "offKeysList" #define IMEncodingList "encodingList" #define IMFilterEventMask "filterEventMask" #define IMProtocolDepend "protocolDepend" /* Masks for IM Attributes Name */ #define I18N_IMSERVER_WIN 0x0001 /* IMServerWindow */ #define I18N_IM_NAME 0x0002 /* IMServerName */ #define I18N_IM_LOCALE 0x0004 /* IMLocale */ #define I18N_IM_ADDRESS 0x0008 /* IMServerTransport */ #define I18N_INPUT_STYLES 0x0010 /* IMInputStyles */ #define I18N_ON_KEYS 0x0020 /* IMOnKeysList */ #define I18N_OFF_KEYS 0x0040 /* IMOffKeysList */ #define I18N_IM_HANDLER 0x0080 /* IMProtocolHander */ #define I18N_ENCODINGS 0x0100 /* IMEncodingList */ #define I18N_FILTERMASK 0x0200 /* IMFilterEventMask */ #define I18N_PROTO_DEPEND 0x0400 /* IMProtoDepend */ typedef struct { char *name; XPointer value; } XIMArg; typedef struct { CARD32 keysym; CARD32 modifier; CARD32 modifier_mask; } XIMTriggerKey; typedef struct { unsigned short count_keys; XIMTriggerKey *keylist; } XIMTriggerKeys; typedef char *XIMEncoding; typedef struct { unsigned short count_encodings; XIMEncoding *supported_encodings; } XIMEncodings; typedef struct _XIMS *XIMS; typedef struct { void* (*setup) (Display *, XIMArg *); Status (*openIM) (XIMS); Status (*closeIM) (XIMS); char* (*setIMValues) (XIMS, XIMArg *); char* (*getIMValues) (XIMS, XIMArg *); Status (*forwardEvent) (XIMS, XPointer); Status (*commitString) (XIMS, XPointer); int (*callCallback) (XIMS, XPointer); int (*preeditStart) (XIMS, XPointer); int (*preeditEnd) (XIMS, XPointer); int (*syncXlib) (XIMS, XPointer); } IMMethodsRec, *IMMethods; typedef struct { Display *display; int screen; } IMCoreRec, *IMCore; typedef struct _XIMS { IMMethods methods; IMCoreRec core; Bool sync; void *protocol; } XIMProtocolRec; /* * X function declarations. */ extern XIMS IMOpenIM (Display *, ...); extern Status IMCloseIM (XIMS); extern char *IMSetIMValues (XIMS, ...); extern char *IMGetIMValues (XIMS, ...); void IMForwardEvent (XIMS, XPointer); void IMCommitString (XIMS, XPointer); int IMCallCallback (XIMS, XPointer); int IMPreeditStart (XIMS, XPointer); int IMPreeditEnd (XIMS, XPointer); int IMSyncXlib (XIMS, XPointer); #endif /* IMdkit_h */ nabi-1.0.0/IMdkit/Xi18n.h0000644000175000017500000002536111655153252011617 00000000000000/****************************************************************** Copyright 1994, 1995 by Sun Microsystems, Inc. Copyright 1993, 1994 by Hewlett-Packard Company Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation, and that the name of Sun Microsystems, Inc. and Hewlett-Packard not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. Sun Microsystems, Inc. and Hewlett-Packard make no representations about the suitability of this software for any purpose. It is provided "as is" without express or implied warranty. SUN MICROSYSTEMS INC. AND HEWLETT-PACKARD COMPANY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SUN MICROSYSTEMS, INC. AND HEWLETT-PACKARD COMPANY BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. Author: Hidetoshi Tajima(tajima@Eng.Sun.COM) Sun Microsystems, Inc. This version tidied and debugged by Steve Underwood May 1999 ******************************************************************/ #ifndef _Xi18n_h #define _Xi18n_h #include #include #include #include "XimProto.h" /* * Minor Protocol Number for Extension Protocol */ #define XIM_EXTENSION 128 #define XIM_EXT_SET_EVENT_MASK (0x30) #define XIM_EXT_FORWARD_KEYEVENT (0x32) #define XIM_EXT_MOVE (0x33) #define COMMON_EXTENSIONS_NUM 3 #include #include "IMdkit.h" /* XI18N Valid Attribute Name Definition */ #define ExtForwardKeyEvent "extForwardKeyEvent" #define ExtMove "extMove" #define ExtSetEventMask "extSetEventMask" /* * Padding macro */ #define IMPAD(length) ((4 - ((length)%4))%4) /* * Target Atom for Transport Connection */ #define LOCALES "LOCALES" #define TRANSPORT "TRANSPORT" #define I18N_OPEN 0 #define I18N_SET 1 #define I18N_GET 2 typedef struct { char *transportname; int namelen; Bool (*checkAddr) (); } TransportSW; typedef struct _XIMPending { unsigned char *p; struct _XIMPending *next; } XIMPending; typedef struct _XimProtoHdr { CARD8 major_opcode; CARD8 minor_opcode; CARD16 length; } XimProtoHdr; typedef struct { CARD16 attribute_id; CARD16 type; CARD16 length; char *name; } XIMAttr; typedef struct { CARD16 attribute_id; CARD16 type; CARD16 length; char *name; } XICAttr; typedef struct { int attribute_id; CARD16 name_length; char *name; int value_length; void *value; int type; } XIMAttribute; typedef struct { int attribute_id; CARD16 name_length; char *name; int value_length; void *value; int type; } XICAttribute; typedef struct { int length; char *name; } XIMStr; typedef struct { CARD16 major_opcode; CARD16 minor_opcode; CARD16 length; char *name; } XIMExt; typedef struct _Xi18nClient { int connect_id; CARD8 byte_order; /* '?': initial value 'B': for Big-Endian 'l': for little-endian */ int sync; XIMPending *pending; void *trans_rec; /* contains transport specific data */ struct _Xi18nClient *next; } Xi18nClient; typedef struct _Xi18nCore *Xi18n; /* * Callback Struct for XIM Protocol */ typedef struct { int major_code; int minor_code; CARD16 connect_id; } IMAnyStruct; typedef struct { int major_code; int minor_code; CARD16 connect_id; CARD8 byte_order; CARD16 major_version; CARD16 minor_version; } IMConnectStruct; typedef struct { int major_code; int minor_code; CARD16 connect_id; } IMDisConnectStruct; typedef struct { int major_code; int minor_code; CARD16 connect_id; XIMStr lang; } IMOpenStruct; typedef struct { int major_code; int minor_code; CARD16 connect_id; } IMCloseStruct; typedef struct { int major_code; int minor_code; CARD16 connect_id; CARD16 number; XIMStr *extension; } IMQueryExtensionStruct; typedef struct { int major_code; int minor_code; CARD16 connect_id; CARD16 number; char **im_attr_list; } IMGetIMValuesStruct; typedef struct { int major_code; int minor_code; CARD16 connect_id; CARD16 icid; CARD16 preedit_attr_num; CARD16 status_attr_num; CARD16 ic_attr_num; XICAttribute *preedit_attr; XICAttribute *status_attr; XICAttribute *ic_attr; } IMChangeICStruct; typedef struct { int major_code; int minor_code; CARD16 connect_id; CARD16 icid; } IMDestroyICStruct; typedef struct { int major_code; int minor_code; CARD16 connect_id; CARD16 icid; CARD16 length; char *commit_string; } IMResetICStruct; typedef struct { int major_code; int minor_code; CARD16 connect_id; CARD16 icid; } IMChangeFocusStruct; typedef struct { int major_code; int minor_code; CARD16 connect_id; CARD16 icid; BITMASK16 sync_bit; CARD16 serial_number; XEvent event; } IMForwardEventStruct; typedef struct { int major_code; int minor_code; CARD16 connect_id; CARD16 icid; CARD16 flag; KeySym keysym; char *commit_string; } IMCommitStruct; typedef struct { int major_code; int minor_code; CARD16 connect_id; CARD16 icid; CARD32 flag; CARD32 key_index; CARD32 event_mask; } IMTriggerNotifyStruct; typedef struct { int major_code; int minor_code; CARD16 connect_id; CARD16 encoding_number; XIMStr *encoding; /* name information */ CARD16 encoding_info_number; XIMStr *encodinginfo; /* detailed information */ CARD16 category; /* #0 for name, #1 for detail */ INT16 enc_index; /* index of the encoding determined */ } IMEncodingNegotiationStruct; typedef struct { int major_code; int minor_code; CARD16 connect_id; CARD16 icid; CARD32 flag; CARD32 forward_event_mask; CARD32 sync_event_mask; } IMSetEventMaskStruct; typedef struct { int major_code; int minor_code; CARD16 connect_id; CARD16 icid; CARD32 filter_event_mask; CARD32 intercept_event_mask; CARD32 select_event_mask; CARD32 forward_event_mask; CARD32 sync_event_mask; } IMExtSetEventMaskStruct; typedef struct { int major_code; int minor_code; CARD16 connect_id; CARD16 icid; CARD16 x; CARD16 y; } IMMoveStruct; typedef struct { int major_code; int minor_code; CARD16 connect_id; CARD16 icid; BITMASK16 flag; CARD16 error_code; CARD16 str_length; CARD16 error_type; char *error_detail; } IMErrorStruct; typedef struct { int major_code; int minor_code; CARD16 connect_id; CARD16 icid; } IMPreeditStateStruct; /* Callbacks */ typedef struct { int major_code; int minor_code; CARD16 connect_id; CARD16 icid; } IMGeometryCBStruct; typedef struct { int major_code; int minor_code; CARD16 connect_id; CARD16 icid; union { int return_value; /* PreeditStart */ XIMPreeditDrawCallbackStruct draw; /* PreeditDraw */ XIMPreeditCaretCallbackStruct caret; /* PreeditCaret */ } todo; } IMPreeditCBStruct; typedef struct { int major_code; int minor_code; CARD16 connect_id; CARD16 icid; union { XIMStatusDrawCallbackStruct draw; /* StatusDraw */ } todo; } IMStatusCBStruct; typedef struct { int major_code; int minor_code; CARD16 connect_id; CARD16 icid; XIMStringConversionCallbackStruct strconv; } IMStrConvCBStruct; typedef struct { int major_code; int minor_code; CARD16 connect_id; CARD16 icid; } IMSyncXlibStruct; typedef union _IMProtocol { int major_code; IMAnyStruct any; IMConnectStruct imconnect; IMDisConnectStruct imdisconnect; IMOpenStruct imopen; IMCloseStruct imclose; IMQueryExtensionStruct queryext; IMGetIMValuesStruct getim; IMEncodingNegotiationStruct encodingnego; IMExtSetEventMaskStruct extsetevent; IMMoveStruct extmove; IMSetEventMaskStruct setevent; IMChangeICStruct changeic; IMDestroyICStruct destroyic; IMResetICStruct resetic; IMChangeFocusStruct changefocus; IMCommitStruct commitstring; IMForwardEventStruct forwardevent; IMTriggerNotifyStruct triggernotify; IMPreeditStateStruct preedit_state; IMErrorStruct imerror; IMGeometryCBStruct geometry_callback; IMPreeditCBStruct preedit_callback; IMStatusCBStruct status_callback; IMStrConvCBStruct strconv_callback; IMSyncXlibStruct sync_xlib; long pad[32]; } IMProtocol; typedef int (*IMProtoHandler) (XIMS, IMProtocol*); #define DEFAULT_FILTER_MASK (KeyPressMask) /* Xi18nAddressRec structure */ typedef struct _Xi18nAddressRec { Display *dpy; CARD8 im_byteOrder; /* byte order 'B' or 'l' */ /* IM Values */ long imvalue_mask; Window im_window; /* IMServerWindow */ char *im_name; /* IMServerName */ char *im_locale; /* IMLocale */ char *im_addr; /* IMServerTransport */ XIMStyles input_styles; /* IMInputStyles */ XIMTriggerKeys on_keys; /* IMOnKeysList */ XIMTriggerKeys off_keys; /* IMOffKeysList */ XIMEncodings encoding_list; /* IMEncodingList */ IMProtoHandler improto; /* IMProtocolHander */ long filterevent_mask; /* IMFilterEventMask */ /* XIM_SERVERS target Atoms */ Atom selection; Atom Localename; Atom Transportname; /* XIM/XIC Attr */ int im_attr_num; XIMAttr *xim_attr; int ic_attr_num; XICAttr *xic_attr; CARD16 preeditAttr_id; CARD16 statusAttr_id; CARD16 separatorAttr_id; /* XIMExtension List */ int ext_num; XIMExt extension[COMMON_EXTENSIONS_NUM]; /* transport specific connection address */ void *connect_addr; /* actual data is defined: XSpecRec in Xi18nX.h for X-based connection. TransSpecRec in Xi18nTr.h for Socket-based connection. */ /* clients table */ Xi18nClient *clients; Xi18nClient *free_clients; } Xi18nAddressRec; typedef struct _Xi18nMethodsRec { Bool (*begin) (XIMS); Bool (*end) (XIMS); Bool (*send) (XIMS, CARD16, unsigned char*, long); Bool (*wait) (XIMS, CARD16, CARD8, CARD8); Bool (*disconnect) (XIMS, CARD16); } Xi18nMethodsRec; typedef struct _Xi18nCore { Xi18nAddressRec address; Xi18nMethodsRec methods; } Xi18nCore; #endif nabi-1.0.0/IMdkit/Xi18nX.h0000644000175000017500000000365411655153252011750 00000000000000/****************************************************************** Copyright 1994, 1995 by Sun Microsystems, Inc. Copyright 1993, 1994 by Hewlett-Packard Company Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation, and that the name of Sun Microsystems, Inc. and Hewlett-Packard not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. Sun Microsystems, Inc. and Hewlett-Packard make no representations about the suitability of this software for any purpose. It is provided "as is" without express or implied warranty. SUN MICROSYSTEMS INC. AND HEWLETT-PACKARD COMPANY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SUN MICROSYSTEMS, INC. AND HEWLETT-PACKARD COMPANY BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. Author: Hidetoshi Tajima(tajima@Eng.Sun.COM) Sun Microsystems, Inc. This version tidied and debugged by Steve Underwood May 1999 ******************************************************************/ #ifndef _Xi18nTrX_h #define _Xi18nTrX_h #define _XIM_PROTOCOL "_XIM_PROTOCOL" #define _XIM_XCONNECT "_XIM_XCONNECT" #define XCM_DATA_LIMIT 20 typedef struct _XClient { Window client_win; /* client window */ Window accept_win; /* accept window */ } XClient; typedef struct { Atom xim_request; Atom connect_request; } XSpecRec; #endif nabi-1.0.0/IMdkit/XimFunc.h0000644000175000017500000000665011655153252012261 00000000000000/****************************************************************** Copyright 1994, 1995 by Sun Microsystems, Inc. Copyright 1993, 1994 by Hewlett-Packard Company Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation, and that the name of Sun Microsystems, Inc. and Hewlett-Packard not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. Sun Microsystems, Inc. and Hewlett-Packard make no representations about the suitability of this software for any purpose. It is provided "as is" without express or implied warranty. SUN MICROSYSTEMS INC. AND HEWLETT-PACKARD COMPANY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SUN MICROSYSTEMS, INC. AND HEWLETT-PACKARD COMPANY BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. Author: Hidetoshi Tajima(tajima@Eng.Sun.COM) Sun Microsystems, Inc. This version tidied and debugged by Steve Underwood May 1999 ******************************************************************/ #ifndef _XimFunc_h #define _XimFunc_h /* i18nAttr.c */ void _Xi18nInitAttrList (Xi18n i18n_core); void _Xi18nInitExtension(Xi18n i18n_core); /* i18nClbk.c */ int _Xi18nGeometryCallback (XIMS ims, IMProtocol *call_data); int _Xi18nPreeditStartCallback (XIMS ims, IMProtocol *call_data); int _Xi18nPreeditDrawCallback (XIMS ims, IMProtocol *call_data); int _Xi18nPreeditCaretCallback (XIMS ims, IMProtocol *call_data); int _Xi18nPreeditDoneCallback (XIMS ims, IMProtocol *call_data); int _Xi18nStatusStartCallback (XIMS ims, IMProtocol *call_data); int _Xi18nStatusDrawCallback (XIMS ims, IMProtocol *call_data); int _Xi18nStatusDoneCallback (XIMS ims, IMProtocol *call_data); int _Xi18nStringConversionCallback (XIMS ims, IMProtocol *call_data); /* i18nIc.c */ void _Xi18nChangeIC (XIMS ims, IMProtocol *call_data, unsigned char *p, int create_flag); void _Xi18nGetIC (XIMS ims, IMProtocol *call_data, unsigned char *p); /* i18nUtil.c */ int _Xi18nNeedSwap (Xi18n i18n_core, CARD16 connect_id); Xi18nClient *_Xi18nNewClient(Xi18n i18n_core); Xi18nClient *_Xi18nFindClient (Xi18n i18n_core, CARD16 connect_id); void _Xi18nDeleteClient (Xi18n i18n_core, CARD16 connect_id); void _Xi18nDeleteAllClients (Xi18n i18n_core); void _Xi18nDeleteFreeClients (Xi18n i18n_core); void _Xi18nSendMessage (XIMS ims, CARD16 connect_id, CARD8 major_opcode, CARD8 minor_opcode, unsigned char *data, long length); void _Xi18nSendTriggerKey (XIMS ims, CARD16 connect_id); void _Xi18nSetEventMask (XIMS ims, CARD16 connect_id, CARD16 im_id, CARD16 ic_id, CARD32 forward_mask, CARD32 sync_mask); /* Xlib internal */ void _XRegisterFilterByType(Display*, Window, int, int, Bool (*filter)(Display*, Window, XEvent*, XPointer), XPointer); void _XUnregisterFilter(Display*, Window, Bool (*filter)(Display*, Window, XEvent*, XPointer), XPointer); #endif nabi-1.0.0/IMdkit/XimProto.h0000644000175000017500000001426711655153252012474 00000000000000/* $XConsortium: XimProto.h,v 1.2 94/01/20 18:02:24 rws Exp $ */ /****************************************************************** Copyright 1992, 1993, 1994 by FUJITSU LIMITED Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation, and that the name of FUJITSU LIMITED not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. FUJITSU LIMITED makes no representations about the suitability of this software for any purpose. It is provided "as is" without express or implied warranty. FUJITSU LIMITED DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL FUJITSU LIMITED BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. Author: Takashi Fujiwara FUJITSU LIMITED fujiwara@a80.tech.yk.fujitsu.co.jp This version tidied and debugged by Steve Underwood May 1999 ******************************************************************/ #ifndef _XIMPROTO_H #define _XIMPROTO_H /* * Default Preconnection selection target */ #define XIM_SERVERS "XIM_SERVERS" #define XIM_LOCALES "LOCALES" #define XIM_TRANSPORT "TRANSPORT" /* * categories in XIM_SERVERS */ #define XIM_SERVER_CATEGORY "@server=" #define XIM_LOCAL_CATEGORY "@locale=" #define XIM_TRANSPORT_CATEGORY "@transport=" /* * Xim implementation revision */ #define PROTOCOLMAJORVERSION 0 #define PROTOCOLMINORVERSION 0 /* * Major Protocol number */ #define XIM_CONNECT 1 #define XIM_CONNECT_REPLY 2 #define XIM_DISCONNECT 3 #define XIM_DISCONNECT_REPLY 4 #define XIM_AUTH_REQUIRED 10 #define XIM_AUTH_REPLY 11 #define XIM_AUTH_NEXT 12 #define XIM_AUTH_SETUP 13 #define XIM_AUTH_NG 14 #define XIM_ERROR 20 #define XIM_OPEN 30 #define XIM_OPEN_REPLY 31 #define XIM_CLOSE 32 #define XIM_CLOSE_REPLY 33 #define XIM_REGISTER_TRIGGERKEYS 34 #define XIM_TRIGGER_NOTIFY 35 #define XIM_TRIGGER_NOTIFY_REPLY 36 #define XIM_SET_EVENT_MASK 37 #define XIM_ENCODING_NEGOTIATION 38 #define XIM_ENCODING_NEGOTIATION_REPLY 39 #define XIM_QUERY_EXTENSION 40 #define XIM_QUERY_EXTENSION_REPLY 41 #define XIM_SET_IM_VALUES 42 #define XIM_SET_IM_VALUES_REPLY 43 #define XIM_GET_IM_VALUES 44 #define XIM_GET_IM_VALUES_REPLY 45 #define XIM_CREATE_IC 50 #define XIM_CREATE_IC_REPLY 51 #define XIM_DESTROY_IC 52 #define XIM_DESTROY_IC_REPLY 53 #define XIM_SET_IC_VALUES 54 #define XIM_SET_IC_VALUES_REPLY 55 #define XIM_GET_IC_VALUES 56 #define XIM_GET_IC_VALUES_REPLY 57 #define XIM_SET_IC_FOCUS 58 #define XIM_UNSET_IC_FOCUS 59 #define XIM_FORWARD_EVENT 60 #define XIM_SYNC 61 #define XIM_SYNC_REPLY 62 #define XIM_COMMIT 63 #define XIM_RESET_IC 64 #define XIM_RESET_IC_REPLY 65 #define XIM_GEOMETRY 70 #define XIM_STR_CONVERSION 71 #define XIM_STR_CONVERSION_REPLY 72 #define XIM_PREEDIT_START 73 #define XIM_PREEDIT_START_REPLY 74 #define XIM_PREEDIT_DRAW 75 #define XIM_PREEDIT_CARET 76 #define XIM_PREEDIT_CARET_REPLY 77 #define XIM_PREEDIT_DONE 78 #define XIM_STATUS_START 79 #define XIM_STATUS_DRAW 80 #define XIM_STATUS_DONE 81 /* * values for the flag of XIM_ERROR */ #define XIM_IMID_VALID 0x0001 #define XIM_ICID_VALID 0x0002 /* * XIM Error Code */ #define XIM_BadAlloc 1 #define XIM_BadStyle 2 #define XIM_BadClientWindow 3 #define XIM_BadFocusWindow 4 #define XIM_BadArea 5 #define XIM_BadSpotLocation 6 #define XIM_BadColormap 7 #define XIM_BadAtom 8 #define XIM_BadPixel 9 #define XIM_BadPixmap 10 #define XIM_BadName 11 #define XIM_BadCursor 12 #define XIM_BadProtocol 13 #define XIM_BadForeground 14 #define XIM_BadBackground 15 #define XIM_LocaleNotSupported 16 #define XIM_BadSomething 999 /* * byte order */ #define BIGENDIAN (CARD8) 0x42 /* MSB first */ #define LITTLEENDIAN (CARD8) 0x6c /* LSB first */ /* * values for the type of XIMATTR & XICATTR */ #define XimType_SeparatorOfNestedList 0 #define XimType_CARD8 1 #define XimType_CARD16 2 #define XimType_CARD32 3 #define XimType_STRING8 4 #define XimType_Window 5 #define XimType_XIMStyles 10 #define XimType_XRectangle 11 #define XimType_XPoint 12 #define XimType_XFontSet 13 #define XimType_XIMOptions 14 #define XimType_XIMHotKeyTriggers 15 #define XimType_XIMHotKeyState 16 #define XimType_XIMStringConversion 17 #define XimType_XIMPreeditState 18 #define XimType_XIMResetState 19 #define XimType_XIMValuesList 20 #define XimType_NEST 0x7FFF /* * values for the category of XIM_ENCODING_NEGOTIATON_REPLY */ #define XIM_Encoding_NameCategory 0 #define XIM_Encoding_DetailCategory 1 /* * value for the index of XIM_ENCODING_NEGOTIATON_REPLY */ #define XIM_Default_Encoding_IDX -1 /* * value for the flag of XIM_FORWARD_EVENT, XIM_COMMIT */ #define XimSYNCHRONUS 0x0001 #define XimLookupChars 0x0002 #define XimLookupKeySym 0x0004 #define XimLookupBoth 0x0006 /* * request packet header size */ #define XIM_HEADER_SIZE \ sizeof(CARD8) /* sizeof mejor-opcode */ \ + sizeof(CARD8) /* sizeof minor-opcode */ \ + sizeof(INT16) /* sizeof length */ /* * Client Message data size */ #define XIM_CM_DATA_SIZE 20 /* * XIM data structure */ typedef CARD16 BITMASK16; typedef CARD32 BITMASK32; typedef CARD32 EVENTMASK; typedef CARD16 XIMID; /* Input Method ID */ typedef CARD16 XICID; /* Input Context ID */ /* * Padding macro */ #define XIM_PAD(length) ((4 - ((length) % 4)) % 4) #define XIM_SET_PAD(ptr, length) \ { \ register int Counter = XIM_PAD((int)length); \ if (Counter) { \ register char *Ptr = (char *)(ptr) + (length); \ length += Counter; \ for (; Counter; --Counter, ++Ptr) \ *Ptr = '\0'; \ } \ } #endif nabi-1.0.0/IMdkit/i18nAttr.c0000644000175000017500000001374111655153252012314 00000000000000/****************************************************************** Copyright 1994, 1995 by Sun Microsystems, Inc. Copyright 1993, 1994 by Hewlett-Packard Company Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation, and that the name of Sun Microsystems, Inc. and Hewlett-Packard not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. Sun Microsystems, Inc. and Hewlett-Packard make no representations about the suitability of this software for any purpose. It is provided "as is" without express or implied warranty. SUN MICROSYSTEMS INC. AND HEWLETT-PACKARD COMPANY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SUN MICROSYSTEMS, INC. AND HEWLETT-PACKARD COMPANY BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. Author: Hidetoshi Tajima(tajima@Eng.Sun.COM) Sun Microsystems, Inc. This version tidied and debugged by Steve Underwood May 1999 ******************************************************************/ #include #include #include "IMdkit.h" #include "Xi18n.h" #include "XimFunc.h" typedef struct { char *name; CARD16 type; } IMListOfAttr; typedef struct { char *name; CARD8 major_opcode; CARD8 minor_opcode; } IMExtList; IMListOfAttr Default_IMattr[] = { {XNQueryInputStyle, XimType_XIMStyles}, {XNQueryIMValuesList, XimType_XIMValuesList}, {XNQueryICValuesList, XimType_XIMValuesList}, {(char *) NULL, (CARD16) 0} }; IMListOfAttr Default_ICattr[] = { {XNInputStyle, XimType_CARD32}, {XNClientWindow, XimType_Window}, {XNFocusWindow, XimType_Window}, {XNFilterEvents, XimType_CARD32}, {XNPreeditAttributes, XimType_NEST}, {XNStatusAttributes, XimType_NEST}, {XNFontSet, XimType_XFontSet}, {XNArea, XimType_XRectangle}, {XNAreaNeeded, XimType_XRectangle}, {XNColormap, XimType_CARD32}, {XNStdColormap, XimType_CARD32}, {XNForeground, XimType_CARD32}, {XNBackground, XimType_CARD32}, {XNBackgroundPixmap, XimType_CARD32}, {XNSpotLocation, XimType_XPoint}, {XNLineSpace, XimType_CARD32}, {XNPreeditState, XimType_CARD32}, {XNPreeditStartCallback, XimType_CARD32}, {XNPreeditDoneCallback, XimType_CARD32}, {XNPreeditDrawCallback, XimType_CARD32}, {XNStringConversionCallback, XimType_CARD32}, {XNStringConversion, XimType_CARD32}, {XNSeparatorofNestedList, XimType_SeparatorOfNestedList}, {(char *) NULL, (CARD16) 0} }; IMExtList Default_Extension[] = { {"XIM_EXT_MOVE", XIM_EXTENSION, XIM_EXT_MOVE}, {"XIM_EXT_SET_EVENT_MASK", XIM_EXTENSION, XIM_EXT_SET_EVENT_MASK}, {"XIM_EXT_FORWARD_KEYEVENT", XIM_EXTENSION, XIM_EXT_FORWARD_KEYEVENT}, {(char *) NULL, (CARD8) 0, (CARD8) 0} }; static void CountAttrList(IMListOfAttr *attr, int *total_count) { *total_count = 0; while (attr->name != NULL) { attr++; ++(*total_count); } } static XIMAttr *CreateAttrList (Xi18n i18n_core, IMListOfAttr *attr, int *total_count) { XIMAttr *args, *p; unsigned int buf_size; CountAttrList(attr, total_count); buf_size = (unsigned) (*total_count + 1)*sizeof (XIMAttr); args = (XIMAttr *) malloc (buf_size); if (!args) return (XIMAttr *) NULL; /*endif*/ memset (args, 0, buf_size); for (p = args; attr->name != NULL; attr++, p++) { p->name = attr->name; p->length = strlen (attr->name); p->type = (CARD16) attr->type; p->attribute_id = XrmStringToQuark (p->name); if (strcmp (p->name, XNPreeditAttributes) == 0) i18n_core->address.preeditAttr_id = p->attribute_id; else if (strcmp (p->name, XNStatusAttributes) == 0) i18n_core->address.statusAttr_id = p->attribute_id; else if (strcmp (p->name, XNSeparatorofNestedList) == 0) i18n_core->address.separatorAttr_id = p->attribute_id; /*endif*/ } /*endfor*/ p->name = (char *) NULL; return args; } void _Xi18nInitAttrList (Xi18n i18n_core) { XIMAttr *args; int total_count; /* init IMAttr list */ if (i18n_core->address.xim_attr) XFree ((char *)i18n_core->address.xim_attr); /*endif*/ args = CreateAttrList (i18n_core, Default_IMattr, &total_count); i18n_core->address.im_attr_num = total_count; i18n_core->address.xim_attr = (XIMAttr *)args; /* init ICAttr list */ if (i18n_core->address.xic_attr) XFree ((char *) i18n_core->address.xic_attr); /*endif*/ args = CreateAttrList (i18n_core, Default_ICattr, &total_count); i18n_core->address.ic_attr_num = total_count; i18n_core->address.xic_attr = (XICAttr *) args; } void _Xi18nInitExtension(Xi18n i18n_core) { register int i; IMExtList *extensions = (IMExtList *) Default_Extension; XIMExt *ext_list = (XIMExt *) i18n_core->address.extension; for (i = 0; extensions->name; i++, ext_list++, extensions++) { ext_list->major_opcode = extensions->major_opcode; ext_list->minor_opcode = extensions->minor_opcode; ext_list->name = extensions->name; ext_list->length = strlen(ext_list->name); } /*endfor*/ i18n_core->address.ext_num = i; } nabi-1.0.0/IMdkit/i18nClbk.c0000644000175000017500000004035611655153252012257 00000000000000/****************************************************************** Copyright 1994, 1995 by Sun Microsystems, Inc. Copyright 1993, 1994 by Hewlett-Packard Company Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation, and that the name of Sun Microsystems, Inc. and Hewlett-Packard not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. Sun Microsystems, Inc. and Hewlett-Packard make no representations about the suitability of this software for any purpose. It is provided "as is" without express or implied warranty. SUN MICROSYSTEMS INC. AND HEWLETT-PACKARD COMPANY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SUN MICROSYSTEMS, INC. AND HEWLETT-PACKARD COMPANY BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. Author: Hidetoshi Tajima(tajima@Eng.Sun.COM) Sun Microsystems, Inc. This version tidied and debugged by Steve Underwood May 1999 ******************************************************************/ #include #include "IMdkit.h" #include "Xi18n.h" #include "FrameMgr.h" #include "XimFunc.h" int _Xi18nGeometryCallback (XIMS ims, IMProtocol *call_data) { Xi18n i18n_core = ims->protocol; FrameMgr fm; extern XimFrameRec geometry_fr[]; register int total_size; unsigned char *reply = NULL; IMGeometryCBStruct *geometry_CB = (IMGeometryCBStruct *) &call_data->geometry_callback; CARD16 connect_id = call_data->any.connect_id; fm = FrameMgrInit (geometry_fr, NULL, _Xi18nNeedSwap (i18n_core, connect_id)); total_size = FrameMgrGetTotalSize (fm); reply = (unsigned char *) malloc (total_size); if (!reply) { _Xi18nSendMessage (ims, connect_id, XIM_ERROR, 0, 0, 0); return False; } /*endif*/ memset (reply, 0, total_size); FrameMgrSetBuffer (fm, reply); FrameMgrPutToken (fm, connect_id); FrameMgrPutToken (fm, geometry_CB->icid); _Xi18nSendMessage (ims, connect_id, XIM_GEOMETRY, 0, reply, total_size); FrameMgrFree (fm); free (reply); /* XIM_GEOMETRY is an asyncronous protocol, so return immediately. */ return True; } int _Xi18nPreeditStartCallback (XIMS ims, IMProtocol *call_data) { Xi18n i18n_core = ims->protocol; FrameMgr fm; extern XimFrameRec preedit_start_fr[]; register int total_size; unsigned char *reply = NULL; IMPreeditCBStruct *preedit_CB = (IMPreeditCBStruct*) &call_data->preedit_callback; CARD16 connect_id = call_data->any.connect_id; fm = FrameMgrInit (preedit_start_fr, NULL, _Xi18nNeedSwap (i18n_core, connect_id)); total_size = FrameMgrGetTotalSize (fm); reply = (unsigned char *) malloc (total_size); if (!reply) { _Xi18nSendMessage(ims, connect_id, XIM_ERROR, 0, 0, 0); return False; } /*endif*/ memset (reply, 0, total_size); FrameMgrSetBuffer (fm, reply); FrameMgrPutToken (fm, connect_id); FrameMgrPutToken (fm, preedit_CB->icid); _Xi18nSendMessage (ims, connect_id, XIM_PREEDIT_START, 0, reply, total_size); FrameMgrFree (fm); free (reply); return True; } int _Xi18nPreeditDrawCallback (XIMS ims, IMProtocol *call_data) { Xi18n i18n_core = ims->protocol; FrameMgr fm; extern XimFrameRec preedit_draw_fr[]; register int total_size; unsigned char *reply = NULL; IMPreeditCBStruct *preedit_CB = (IMPreeditCBStruct *) &call_data->preedit_callback; XIMPreeditDrawCallbackStruct *draw = (XIMPreeditDrawCallbackStruct *) &preedit_CB->todo.draw; CARD16 connect_id = call_data->any.connect_id; register int feedback_count; register int i; BITMASK32 status = 0x0; if (draw->text->length == 0) status = 0x00000001; else if (draw->text->feedback[0] == 0) status = 0x00000002; /*endif*/ fm = FrameMgrInit (preedit_draw_fr, NULL, _Xi18nNeedSwap (i18n_core, connect_id)); /* set length of preedit string */ FrameMgrSetSize (fm, draw->text->length); /* set iteration count for list of feedback */ for (i = 0; draw->text->feedback[i] != 0; i++) ; /*endfor*/ feedback_count = i; FrameMgrSetIterCount (fm, feedback_count); total_size = FrameMgrGetTotalSize (fm); reply = (unsigned char *) malloc (total_size); if (!reply) { _Xi18nSendMessage (ims, connect_id, XIM_ERROR, 0, 0, 0); return False; } /*endif*/ memset (reply, 0, total_size); FrameMgrSetBuffer (fm, reply); FrameMgrPutToken (fm, connect_id); FrameMgrPutToken (fm, preedit_CB->icid); FrameMgrPutToken (fm, draw->caret); FrameMgrPutToken (fm, draw->chg_first); FrameMgrPutToken (fm, draw->chg_length); FrameMgrPutToken (fm, status); FrameMgrPutToken (fm, draw->text->length); FrameMgrPutToken (fm, draw->text->string); for (i = 0; i < feedback_count; i++) FrameMgrPutToken (fm, draw->text->feedback[i]); /*endfor*/ _Xi18nSendMessage (ims, connect_id, XIM_PREEDIT_DRAW, 0, reply, total_size); FrameMgrFree (fm); free (reply); /* XIM_PREEDIT_DRAW is an asyncronous protocol, so return immediately. */ return True; } int _Xi18nPreeditCaretCallback (XIMS ims, IMProtocol *call_data) { Xi18n i18n_core = ims->protocol; FrameMgr fm; extern XimFrameRec preedit_caret_fr[]; register int total_size; unsigned char *reply = NULL; IMPreeditCBStruct *preedit_CB = (IMPreeditCBStruct*) &call_data->preedit_callback; XIMPreeditCaretCallbackStruct *caret = (XIMPreeditCaretCallbackStruct *) &preedit_CB->todo.caret; CARD16 connect_id = call_data->any.connect_id; fm = FrameMgrInit (preedit_caret_fr, NULL, _Xi18nNeedSwap (i18n_core, connect_id)); total_size = FrameMgrGetTotalSize (fm); reply = (unsigned char *) malloc (total_size); if (!reply) { _Xi18nSendMessage (ims, connect_id, XIM_ERROR, 0, 0, 0); return False; } /*endif*/ memset (reply, 0, total_size); FrameMgrSetBuffer (fm, reply); FrameMgrPutToken (fm, connect_id); FrameMgrPutToken (fm, preedit_CB->icid); FrameMgrPutToken (fm, caret->position); FrameMgrPutToken (fm, caret->direction); FrameMgrPutToken (fm, caret->style); _Xi18nSendMessage (ims, connect_id, XIM_PREEDIT_CARET, 0, reply, total_size); FrameMgrFree (fm); free (reply); return True; } int _Xi18nPreeditDoneCallback (XIMS ims, IMProtocol *call_data) { Xi18n i18n_core = ims->protocol; FrameMgr fm; extern XimFrameRec preedit_done_fr[]; register int total_size; unsigned char *reply = NULL; IMPreeditCBStruct *preedit_CB = (IMPreeditCBStruct *) &call_data->preedit_callback; CARD16 connect_id = call_data->any.connect_id; fm = FrameMgrInit (preedit_done_fr, NULL, _Xi18nNeedSwap (i18n_core, connect_id)); total_size = FrameMgrGetTotalSize (fm); reply = (unsigned char *) malloc (total_size); if (!reply) { _Xi18nSendMessage (ims, connect_id, XIM_ERROR, 0, 0, 0); return False; } /*endif*/ memset (reply, 0, total_size); FrameMgrSetBuffer (fm, reply); FrameMgrPutToken (fm, connect_id); FrameMgrPutToken (fm, preedit_CB->icid); _Xi18nSendMessage (ims, connect_id, XIM_PREEDIT_DONE, 0, reply, total_size); FrameMgrFree (fm); free (reply); /* XIM_PREEDIT_DONE is an asyncronous protocol, so return immediately. */ return True; } int _Xi18nStatusStartCallback (XIMS ims, IMProtocol *call_data) { Xi18n i18n_core = ims->protocol; FrameMgr fm; extern XimFrameRec status_start_fr[]; register int total_size; unsigned char *reply = NULL; IMStatusCBStruct *status_CB = (IMStatusCBStruct*) &call_data->status_callback; CARD16 connect_id = call_data->any.connect_id; fm = FrameMgrInit (status_start_fr, NULL, _Xi18nNeedSwap (i18n_core, connect_id)); total_size = FrameMgrGetTotalSize (fm); reply = (unsigned char *) malloc (total_size); if (!reply) { _Xi18nSendMessage (ims, connect_id, XIM_ERROR, 0, 0, 0); return False; } /*endif*/ memset (reply, 0, total_size); FrameMgrSetBuffer (fm, reply); FrameMgrPutToken (fm, connect_id); FrameMgrPutToken (fm, status_CB->icid); _Xi18nSendMessage (ims, connect_id, XIM_STATUS_START, 0, reply, total_size); FrameMgrFree (fm); free (reply); /* XIM_STATUS_START is an asyncronous protocol, so return immediately. */ return True; } int _Xi18nStatusDrawCallback (XIMS ims, IMProtocol *call_data) { Xi18n i18n_core = ims->protocol; FrameMgr fm = (FrameMgr)0; extern XimFrameRec status_draw_text_fr[]; extern XimFrameRec status_draw_bitmap_fr[]; register int total_size = 0; unsigned char *reply = NULL; IMStatusCBStruct *status_CB = (IMStatusCBStruct *) &call_data->status_callback; XIMStatusDrawCallbackStruct *draw = (XIMStatusDrawCallbackStruct *) &status_CB->todo.draw; CARD16 connect_id = call_data->any.connect_id; register int feedback_count; register int i; BITMASK32 status = 0x0; switch (draw->type) { case XIMTextType: fm = FrameMgrInit (status_draw_text_fr, NULL, _Xi18nNeedSwap (i18n_core, connect_id)); if (draw->data.text->length == 0) status = 0x00000001; else if (draw->data.text->feedback[0] == 0) status = 0x00000002; /*endif*/ /* set length of status string */ FrameMgrSetSize(fm, draw->data.text->length); /* set iteration count for list of feedback */ for (i = 0; draw->data.text->feedback[i] != 0; i++) ; /*endfor*/ feedback_count = i; FrameMgrSetIterCount (fm, feedback_count); total_size = FrameMgrGetTotalSize (fm); reply = (unsigned char *) malloc (total_size); if (!reply) { _Xi18nSendMessage (ims, connect_id, XIM_ERROR, 0, 0, 0); return False; } /*endif*/ memset (reply, 0, total_size); FrameMgrSetBuffer (fm, reply); FrameMgrPutToken (fm, connect_id); FrameMgrPutToken (fm, status_CB->icid); FrameMgrPutToken (fm, draw->type); FrameMgrPutToken (fm, status); FrameMgrPutToken (fm, draw->data.text->length); FrameMgrPutToken (fm, draw->data.text->string); for (i = 0; i < feedback_count; i++) FrameMgrPutToken (fm, draw->data.text->feedback[i]); /*endfor*/ break; case XIMBitmapType: fm = FrameMgrInit (status_draw_bitmap_fr, NULL, _Xi18nNeedSwap (i18n_core, connect_id)); total_size = FrameMgrGetTotalSize (fm); reply = (unsigned char *) malloc (total_size); if (!reply) { _Xi18nSendMessage (ims, connect_id, XIM_ERROR, 0, 0, 0); return False; } /*endif*/ memset (reply, 0, total_size); FrameMgrSetBuffer (fm, reply); FrameMgrPutToken (fm, connect_id); FrameMgrPutToken (fm, status_CB->icid); FrameMgrPutToken (fm, draw->data.bitmap); break; } /*endswitch*/ _Xi18nSendMessage (ims, connect_id, XIM_STATUS_DRAW, 0, reply, total_size); FrameMgrFree (fm); free (reply); /* XIM_STATUS_DRAW is an asyncronous protocol, so return immediately. */ return True; } int _Xi18nStatusDoneCallback (XIMS ims, IMProtocol *call_data) { Xi18n i18n_core = ims->protocol; FrameMgr fm; extern XimFrameRec status_done_fr[]; register int total_size; unsigned char *reply = NULL; IMStatusCBStruct *status_CB = (IMStatusCBStruct *) &call_data->status_callback; CARD16 connect_id = call_data->any.connect_id; fm = FrameMgrInit (status_done_fr, NULL, _Xi18nNeedSwap (i18n_core, connect_id)); total_size = FrameMgrGetTotalSize (fm); reply = (unsigned char *) malloc (total_size); if (!reply) { _Xi18nSendMessage (ims, connect_id, XIM_ERROR, 0, 0, 0); return False; } /*endif*/ memset (reply, 0, total_size); FrameMgrSetBuffer (fm, reply); FrameMgrPutToken (fm, connect_id); FrameMgrPutToken (fm, status_CB->icid); _Xi18nSendMessage (ims, connect_id, XIM_STATUS_DONE, 0, reply, total_size); FrameMgrFree (fm); free (reply); /* XIM_STATUS_DONE is an asyncronous protocol, so return immediately. */ return True; } int _Xi18nStringConversionCallback (XIMS ims, IMProtocol *call_data) { Xi18n i18n_core = ims->protocol; FrameMgr fm; extern XimFrameRec str_conversion_fr[]; register int total_size; unsigned char *reply = NULL; IMStrConvCBStruct *call_back = (IMStrConvCBStruct *) &call_data->strconv_callback; XIMStringConversionCallbackStruct *strconv = (XIMStringConversionCallbackStruct *) &call_back->strconv; CARD16 connect_id = call_data->any.connect_id; fm = FrameMgrInit (str_conversion_fr, NULL, _Xi18nNeedSwap (i18n_core, connect_id)); #if 0 /* set length of preedit string */ FrameMgrSetSize (fm, strconv->text->length); #endif total_size = FrameMgrGetTotalSize (fm); reply = (unsigned char *) malloc (total_size); if (!reply) { _Xi18nSendMessage (ims, connect_id, XIM_ERROR, 0, 0, 0); return False; } /*endif*/ memset (reply, 0, total_size); FrameMgrSetBuffer (fm, reply); FrameMgrPutToken (fm, connect_id); FrameMgrPutToken (fm, call_back->icid); FrameMgrPutToken (fm, strconv->position); FrameMgrPutToken (fm, strconv->direction); FrameMgrPutToken (fm, strconv->operation); FrameMgrPutToken (fm, strconv->factor); #if 0 FrameMgrPutToken (fm, strconv->text->string); #endif _Xi18nSendMessage (ims, connect_id, XIM_STR_CONVERSION, 0, reply, total_size); FrameMgrFree (fm); free (reply); /* XIM_STR_CONVERSION is a syncronous protocol, so should wait here for XIM_STR_CONVERSION_REPLY. But if XIM waits for a reply here, it would make xim unusable to other clients. So it would be better not to wait here. XIM can deal with it in the IMProtocol handler, when XIM_STR_CONVERSION_REPLY message is received. if (i18n_core->methods.wait (ims, connect_id, XIM_STR_CONVERSION_REPLY, 0) == False) { return False; } */ return True; } nabi-1.0.0/IMdkit/i18nIMProto.c0000644000175000017500000004705211655153252012735 00000000000000/****************************************************************** Copyright 1993, 1994 by Digital Equipment Corporation, Maynard, Massachusetts, Copyright 1993, 1994 by Hewlett-Packard Company Copyright 1994, 1995 by Sun Microsystems, Inc. All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation, and that the names of Digital or MIT not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. DIGITAL AND HEWLETT-PACKARD COMPANY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL DIGITAL AND HEWLETT-PACKARD COMPANY BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. Author: Hiroyuki Miyamoto Digital Equipment Corporation miyamoto@jrd.dec.com Hidetoshi Tajima(tajima@Eng.Sun.COM) Sun Microsystems, Inc. This version tidied and debugged by Steve Underwood May 1999 ******************************************************************/ /* Protocol Packet frames */ #include "FrameMgr.h" /* Data type definitions */ static XimFrameRec ximattr_fr[] = { _FRAME(BIT16), /* attribute ID */ _FRAME(BIT16), /* type of the value */ _FRAME(BIT16), /* length of im-attribute */ _FRAME(BARRAY), /* im-attribute */ _PAD4(2), _FRAME(EOL), }; static XimFrameRec xicattr_fr[] = { _FRAME(BIT16), /* attribute ID */ _FRAME(BIT16), /* type of the value */ _FRAME(BIT16), /* length of ic-attribute */ _FRAME(BARRAY), /* ic-attribute */ _PAD4(2), _FRAME(EOL), }; static XimFrameRec ximattribute_fr[] = { _FRAME(BIT16), /* attribute ID */ _FRAME(BIT16), /* value length */ _FRAME(BARRAY), /* value */ _PAD4(1), _FRAME(EOL), }; static XimFrameRec xicattribute_fr[] = { _FRAME(BIT16), /* attribute ID */ _FRAME(BIT16), /* value length */ _FRAME(BARRAY), /* value */ _PAD4(1), _FRAME(EOL), }; static XimFrameRec ximtriggerkey_fr[] = { _FRAME(BIT32), /* keysym */ _FRAME(BIT32), /* modifier */ _FRAME(BIT32), /* modifier mask */ _FRAME(EOL), }; static XimFrameRec encodinginfo_fr[] = { _FRAME(BIT16), /* length of encoding info */ _FRAME(BARRAY), /* encoding info */ _PAD4(2), _FRAME(EOL), }; static XimFrameRec str_fr[] = { _FRAME(BIT8), /* number of byte */ _FRAME(BARRAY), /* string */ _FRAME(EOL), }; static XimFrameRec xpcs_fr[] = { _FRAME(BIT16), /* length of string in bytes */ _FRAME(BARRAY), /* string */ _PAD4(2), _FRAME(EOL), }; static XimFrameRec ext_fr[] = { _FRAME(BIT16), /* extension major-opcode */ _FRAME(BIT16), /* extension minor-opcode */ _FRAME(BIT16), /* length of extension name */ _FRAME(BARRAY), /* extension name */ _PAD4(2), _FRAME(EOL), }; static XimFrameRec inputstyle_fr[] = { _FRAME(BIT32), /* inputstyle */ _FRAME(EOL), }; /* Protocol definitions */ xim_externaldef XimFrameRec attr_head_fr[] = { _FRAME(BIT16), /* attribute id */ _FRAME(BIT16), /* attribute length */ _FRAME(EOL), }; xim_externaldef XimFrameRec short_fr[] = { _FRAME(BIT16), /* value */ _FRAME(EOL), }; xim_externaldef XimFrameRec long_fr[] = { _FRAME(BIT32), /* value */ _FRAME(EOL), }; xim_externaldef XimFrameRec xrectangle_fr[] = { _FRAME(BIT16), /* x */ _FRAME(BIT16), /* y */ _FRAME(BIT16), /* width */ _FRAME(BIT16), /* height */ _FRAME(EOL), }; xim_externaldef XimFrameRec xpoint_fr[] = { _FRAME(BIT16), /* x */ _FRAME(BIT16), /* y */ _FRAME(EOL), }; xim_externaldef XimFrameRec fontset_fr[] = { _FRAME(BIT16), /* length of base font name */ _FRAME(BARRAY), /* base font name list */ _PAD4(2), /* unused */ _FRAME(EOL), }; xim_externaldef XimFrameRec input_styles_fr[] = { _FRAME(BIT16), /* number of list */ _PAD4(1), /* unused */ _FRAME(ITER), /* XIMStyle list */ _FRAME(POINTER), _PTR(inputstyle_fr), _FRAME(EOL), }; xim_externaldef XimFrameRec values_list_fr[] = { _FRAME(BIT16), /* number of list */ _FRAME(ITER), _FRAME(POINTER), _PTR(xpcs_fr), _FRAME(EOL), }; xim_externaldef XimFrameRec packet_header_fr[] = { _FRAME(BIT8), /* major-opcode */ _FRAME(BIT8), /* minor-opcode */ _FRAME(BIT16), /* length */ _FRAME(EOL), }; xim_externaldef XimFrameRec error_fr[] = { _FRAME(BIT16), /* input-method-ID */ _FRAME(BIT16), /* input-context-ID */ _FRAME(BIT16), /* flag */ _FRAME(BIT16), /* Error Code */ _FRAME(BIT16), /* length of error detail */ _FRAME(BIT16), /* type of error detail */ _FRAME(BARRAY), /* error detail */ _PAD4(1), _FRAME(EOL), }; xim_externaldef XimFrameRec connect_fr[] = { _FRAME(BIT8), /* byte order */ _PAD2(1), /* unused */ _FRAME(BIT16), /* client-major-protocol-version */ _FRAME(BIT16), /* client-minor-protocol-version */ _BYTE_COUNTER(BIT16, 1), /* length of client-auth-protocol-names */ _FRAME(ITER), /* client-auth-protocol-names */ _FRAME(POINTER), _PTR(xpcs_fr), _FRAME(EOL), }; xim_externaldef XimFrameRec connect_reply_fr[] = { _FRAME(BIT16), /* server-major-protocol-version */ _FRAME(BIT16), /* server-minor-protocol-version */ _FRAME(EOL), }; xim_externaldef XimFrameRec auth_required_fr[] = { _FRAME(BIT8), /* auth-protocol-index */ _FRAME(BIT8), /* auth-data1 */ _FRAME(BARRAY), /* auth-data2 */ _PAD4(3), _FRAME(EOL), }; xim_externaldef XimFrameRec auth_reply_fr[] = { _FRAME(BIT8), _FRAME(BARRAY), _PAD4(2), _FRAME(EOL), }; xim_externaldef XimFrameRec auth_next_fr[] = { _FRAME(BIT8), /* auth-data1 */ _FRAME(BARRAY), /* auth-data2 */ _PAD4(2), _FRAME(EOL), }; xim_externaldef XimFrameRec auth_setup_fr[] = { _BYTE_COUNTER(BIT16, 2), /* number of client-auth-protocol-names */ _PAD4(1), /* unused */ _FRAME(ITER), /* server-auth-protocol-names */ _FRAME(POINTER), _PTR(xpcs_fr), _FRAME(EOL), }; xim_externaldef XimFrameRec auth_ng_fr[] = { _FRAME(EOL), }; xim_externaldef XimFrameRec disconnect_fr[] = { _FRAME(EOL), }; xim_externaldef XimFrameRec disconnect_reply_fr[] = { _FRAME(EOL), }; xim_externaldef XimFrameRec open_fr[] = { _FRAME(POINTER), /* locale name */ _PTR(str_fr), _PAD4(1), _FRAME(EOL), }; xim_externaldef XimFrameRec open_reply_fr[] = { _FRAME(BIT16), /* input-method-ID */ _BYTE_COUNTER(BIT16, 1), /* byte length of IM attributes supported */ _FRAME(ITER), /* IM attribute supported */ _FRAME(POINTER), _PTR(ximattr_fr), _BYTE_COUNTER(BIT16, 2), /* number of IC attribute supported */ _PAD4(1), /* unused */ _FRAME(ITER), /* IC attribute supported */ _FRAME(POINTER), _PTR(xicattr_fr), _FRAME(EOL), }; xim_externaldef XimFrameRec close_fr[] = { _FRAME(BIT16), /* input-method-ID */ _PAD4(1), /* unused */ _FRAME(EOL), }; xim_externaldef XimFrameRec close_reply_fr[] = { _FRAME(BIT16), /* input-method-ID */ _PAD4(1), /* unused */ _FRAME(EOL), }; xim_externaldef XimFrameRec register_triggerkeys_fr[] = { _FRAME(BIT16), /* input-method-ID */ _PAD4(1), /* unused */ _BYTE_COUNTER(BIT32, 1), /* byte length of on-keys */ _FRAME(ITER), /* on-keys list */ _FRAME(POINTER), _PTR(ximtriggerkey_fr), _BYTE_COUNTER(BIT32, 1), /* byte length of off-keys */ _FRAME(ITER), /* off-keys list */ _FRAME(POINTER), _PTR(ximtriggerkey_fr), _FRAME(EOL), }; xim_externaldef XimFrameRec trigger_notify_fr[] = { _FRAME(BIT16), /* input-mehotd-ID */ _FRAME(BIT16), /* input-context-ID */ _FRAME(BIT32), /* flag */ _FRAME(BIT32), /* index of keys list */ _FRAME(BIT32), /* client-select-event-mask */ _FRAME(EOL), }; xim_externaldef XimFrameRec trigger_notify_reply_fr[] = { _FRAME(BIT16), /* input-method-ID */ _FRAME(BIT16), /* input-context-ID */ _FRAME(EOL), }; xim_externaldef XimFrameRec set_event_mask_fr[] = { _FRAME(BIT16), /* input-method-ID */ _FRAME(BIT16), /* input-context-ID */ _FRAME(BIT32), /* forward-event-mask */ _FRAME(BIT32), /* synchronous-event-mask */ _FRAME(EOL), }; xim_externaldef XimFrameRec encoding_negotiation_fr[] = { _FRAME(BIT16), /* input-method-ID */ _BYTE_COUNTER(BIT16, 1), /* byte length of encodings listed by name */ _FRAME(ITER), /* supported list of encoding in IM library */ _FRAME(POINTER), _PTR(str_fr), _PAD4(1), _BYTE_COUNTER(BIT16, 2), /* byte length of encodings listed by detailed data */ _PAD4(1), _FRAME(ITER), /* list of encodings supported in the IM library */ _FRAME(POINTER), _PTR(encodinginfo_fr), _FRAME(EOL), }; xim_externaldef XimFrameRec encoding_negotiation_reply_fr[] = { _FRAME(BIT16), /* input-method-ID */ _FRAME(BIT16), /* category of the encoding determined */ _FRAME(BIT16), /* index of the encoding dterminated */ _PAD4(1), _FRAME(EOL), }; xim_externaldef XimFrameRec query_extension_fr[] = { _FRAME(BIT16), /* input-method-ID */ _BYTE_COUNTER(BIT16, 1), /* byte length of extensions supported by the IM library */ _FRAME(ITER), /* extensions supported by the IM library */ _FRAME(POINTER), _PTR(str_fr), _PAD4(1), _FRAME(EOL), }; xim_externaldef XimFrameRec query_extension_reply_fr[] = { _FRAME(BIT16), /* input-method-ID */ _BYTE_COUNTER(BIT16, 1), /* byte length of extensions supported by the IM server */ _FRAME(ITER), /* list of extensions supported by the IM server */ _FRAME(POINTER), _PTR(ext_fr), _FRAME(EOL), }; xim_externaldef XimFrameRec get_im_values_fr[] = { _FRAME(BIT16), /* input-method-ID */ _BYTE_COUNTER(BIT16, 1), /* byte length of im-attribute-id */ _FRAME(ITER), /* im-attribute-id */ _FRAME(BIT16), _PAD4(1), _FRAME(EOL), }; xim_externaldef XimFrameRec get_im_values_reply_fr[] = { _FRAME(BIT16), /* input-method-ID */ _BYTE_COUNTER(BIT16, 1), /* byte length of im-attribute returned */ _FRAME(ITER), /* im-attribute returned */ _FRAME(POINTER), _PTR(ximattribute_fr), _FRAME(EOL), }; xim_externaldef XimFrameRec create_ic_fr[] = { _FRAME(BIT16), /* input-method-ID */ _BYTE_COUNTER(BIT16, 1), /* byte length of ic-attributes */ _FRAME(ITER), /* ic-attributes */ _FRAME(POINTER), _PTR(xicattribute_fr), _FRAME(EOL), }; xim_externaldef XimFrameRec create_ic_reply_fr[] = { _FRAME(BIT16), /* input-method-ID */ _FRAME(BIT16), /* input-context-ID */ _FRAME(EOL), }; xim_externaldef XimFrameRec destroy_ic_fr[] = { _FRAME(BIT16), /* input-method-ID */ _FRAME(BIT16), /* input-context-ID */ _FRAME(EOL), }; xim_externaldef XimFrameRec destroy_ic_reply_fr[] = { _FRAME(BIT16), /* input-method-ID */ _FRAME(BIT16), /* input-context-ID */ _FRAME(EOL), }; xim_externaldef XimFrameRec set_ic_values_fr[] = { _FRAME(BIT16), /* input-method-ID */ _FRAME(BIT16), /* input-context-ID */ _BYTE_COUNTER(BIT16, 2), /* byte length of ic-attributes */ _PAD4(1), _FRAME(ITER), /* ic-attribute */ _FRAME(POINTER), _PTR(xicattribute_fr), _FRAME(EOL), }; xim_externaldef XimFrameRec set_ic_values_reply_fr[] = { _FRAME(BIT16), /* input-method-ID */ _FRAME(BIT16), /* input-context-ID */ _FRAME(EOL), }; xim_externaldef XimFrameRec get_ic_values_fr[] = { _FRAME(BIT16), /* input-method-ID */ _FRAME(BIT16), /* input-context-ID */ _BYTE_COUNTER(BIT16, 1), /* byte length of ic-attribute-id */ _FRAME(ITER), /* ic-attribute */ _FRAME(BIT16), _PAD4(2), _FRAME(EOL), }; xim_externaldef XimFrameRec get_ic_values_reply_fr[] = { _FRAME(BIT16), /* input-method-ID */ _FRAME(BIT16), /* input-context-ID */ _BYTE_COUNTER(BIT16, 2), /* byte length of ic-attribute */ _PAD4(1), _FRAME(ITER), /* ic-attribute */ _FRAME(POINTER), _PTR(xicattribute_fr), _FRAME(EOL), }; xim_externaldef XimFrameRec set_ic_focus_fr[] = { _FRAME(BIT16), /* input-method-ID */ _FRAME(BIT16), /* input-context-ID */ _FRAME(EOL), }; xim_externaldef XimFrameRec unset_ic_focus_fr[] = { _FRAME(BIT16), /* input-method-ID */ _FRAME(BIT16), /* input-context-ID */ _FRAME(EOL), }; xim_externaldef XimFrameRec forward_event_fr[] = { _FRAME(BIT16), /* input-method-ID */ _FRAME(BIT16), /* input-context-ID */ _FRAME(BIT16), /* flag */ _FRAME(BIT16), /* sequence number */ _FRAME(EOL), }; xim_externaldef XimFrameRec sync_fr[] = { _FRAME(BIT16), /* input-method-ID */ _FRAME(BIT16), /* input-context-ID */ _FRAME(EOL), }; xim_externaldef XimFrameRec sync_reply_fr[] = { _FRAME(BIT16), /* input-method-ID */ _FRAME(BIT16), /* input-context-ID */ _FRAME(EOL), }; #if 0 xim_externaldef XimFrameRec commit_fr[] = { _FRAME(BIT16), /* input-method-ID */ _FRAME(BIT16), /* input-context-ID */ _FRAME(BIT16), /* flag */ _FRAME(BIT16), /* byte length of committed string */ _FRAME(BARRAY), /* committed string */ _PAD4(1), _BYTE_COUNTER(BIT16, 1), /* byte length of keysym */ _FRAME(ITER), /* keysym */ _FRAME(BIT32), _PAD4(1), _FRAME(EOL), }; #endif xim_externaldef XimFrameRec commit_chars_fr[] = { _FRAME(BIT16), /* input-method-ID */ _FRAME(BIT16), /* input-context-ID */ _FRAME(BIT16), /* flag */ _FRAME(BIT16), /* byte length of committed string */ _FRAME(BARRAY), /* committed string */ _PAD4(1), _FRAME(EOL), }; xim_externaldef XimFrameRec commit_both_fr[] = { _FRAME(BIT16), /* input-method-ID */ _FRAME(BIT16), /* input-context-ID */ _FRAME(BIT16), /* flag */ _PAD4(1), /* unused */ _FRAME(BIT32), /* keysym */ _FRAME(BIT16), /* byte length of committed string */ _FRAME(BARRAY), /* committed string */ _PAD4(2), _FRAME(EOL), }; xim_externaldef XimFrameRec reset_ic_fr[] = { _FRAME(BIT16), /* input-method-ID */ _FRAME(BIT16), /* input-context-ID */ _FRAME(EOL), }; xim_externaldef XimFrameRec reset_ic_reply_fr[] = { _FRAME(BIT16), /* input-method-ID */ _FRAME(BIT16), /* input-context-ID */ _FRAME(BIT16), /* byte length of committed string */ _FRAME(BARRAY), /* committed string */ _PAD4(2), _FRAME(EOL), }; xim_externaldef XimFrameRec geometry_fr[] = { _FRAME(BIT16), /* input-method-ID */ _FRAME(BIT16), /* input-context-ID */ _FRAME(EOL), }; xim_externaldef XimFrameRec str_conversion_fr[] = { _FRAME(BIT16), /* input-method-ID */ _FRAME(BIT16), /* input-context-ID */ _FRAME(BIT32), /* XIMStringConversionPosition */ _FRAME(BIT32), /* XIMStringConversionType */ _FRAME(BIT32), /* XIMStringConversionOperation */ _FRAME(BIT16), /* length to multiply the XIMStringConversionType */ _FRAME(BIT16), /* length of the string to be substituted */ #if 0 _FRAME(BARRAY), /* string */ _PAD4(1), #endif _FRAME(EOL), }; xim_externaldef XimFrameRec str_conversion_reply_fr[] = { _FRAME(BIT16), /* input-method-ID */ _FRAME(BIT16), /* input-context-ID */ _FRAME(BIT16), /* length of the retrieved string */ _FRAME(BARRAY), /* retrieved string */ _PAD4(2), _BYTE_COUNTER(BIT16, 2), /* number of feedback array */ _PAD4(1), _FRAME(ITER), /* feedback array */ _FRAME(BIT32), _FRAME(EOL), }; xim_externaldef XimFrameRec preedit_start_fr[] = { _FRAME(BIT16), /* input-method-ID */ _FRAME(BIT16), /* input-context-ID */ _FRAME(EOL), }; xim_externaldef XimFrameRec preedit_start_reply_fr[] = { _FRAME(BIT16), /* input-method-ID */ _FRAME(BIT16), /* input-context-ID */ _FRAME(BIT32), /* return value */ _FRAME(EOL), }; xim_externaldef XimFrameRec preedit_draw_fr[] = { _FRAME(BIT16), /* input-method-ID */ _FRAME(BIT16), /* input-context-ID */ _FRAME(BIT32), /* caret */ _FRAME(BIT32), /* chg_first */ _FRAME(BIT32), /* chg_length */ _FRAME(BIT32), /* status */ _FRAME(BIT16), /* length of preedit string */ _FRAME(BARRAY), /* preedit string */ _PAD4(2), _BYTE_COUNTER(BIT16, 2), /* number of feedback array */ _PAD4(1), _FRAME(ITER), /* feedback array */ _FRAME(BIT32), _FRAME(EOL), }; xim_externaldef XimFrameRec preedit_caret_fr[] = { _FRAME(BIT16), /* input-method-ID */ _FRAME(BIT16), /* input-context-ID */ _FRAME(BIT32), /* position */ _FRAME(BIT32), /* direction */ _FRAME(BIT32), /* style */ _FRAME(EOL), }; xim_externaldef XimFrameRec preedit_caret_reply_fr[] = { _FRAME(BIT16), /* input-method-ID */ _FRAME(BIT16), /* input-context-ID */ _FRAME(BIT32), /* position */ _FRAME(EOL), }; xim_externaldef XimFrameRec preedit_done_fr[] = { _FRAME(BIT16), /* input-method-ID */ _FRAME(BIT16), /* input-context-ID */ _FRAME(EOL), }; xim_externaldef XimFrameRec status_start_fr[] = { _FRAME(BIT16), /* input-method-ID */ _FRAME(BIT16), /* input-context-ID */ _FRAME(EOL), }; xim_externaldef XimFrameRec status_draw_text_fr[] = { _FRAME(BIT16), /* input-method-ID */ _FRAME(BIT16), /* input-context-ID */ _FRAME(BIT32), /* type */ _FRAME(BIT32), /* status */ _FRAME(BIT16), /* length of status string */ _FRAME(BARRAY), /* status string */ _PAD4(2), _BYTE_COUNTER(BIT16, 2), /* number of feedback array */ _PAD4(1), _FRAME(ITER), /* feedback array */ _FRAME(BIT32), _FRAME(EOL), }; xim_externaldef XimFrameRec status_draw_bitmap_fr[] = { _FRAME(BIT16), /* input-method-ID */ _FRAME(BIT16), /* input-context-ID */ _FRAME(BIT32), /* type */ _FRAME(BIT32), /* pixmap data */ _FRAME(EOL), }; xim_externaldef XimFrameRec status_done_fr[] = { _FRAME(BIT16), /* input-method-ID */ _FRAME(BIT16), /* input-context-ID */ _FRAME(EOL), }; xim_externaldef XimFrameRec ext_set_event_mask_fr[] = { _FRAME(BIT16), /* input-method-ID */ _FRAME(BIT16), /* input-context-ID */ _FRAME(BIT32), /* filter-event-mask */ _FRAME(BIT32), /* intercept-event-mask */ _FRAME(BIT32), /* select-event-mask */ _FRAME(BIT32), /* forward-event-mask */ _FRAME(BIT32), /* synchronous-event-mask */ _FRAME(EOL), }; xim_externaldef XimFrameRec ext_forward_keyevent_fr[] = { _FRAME(BIT16), /* input-method-ID */ _FRAME(BIT16), /* input-context-ID */ _FRAME(BIT16), /* flag */ _FRAME(BIT16), /* sequence number */ _FRAME(BIT8), /* xEvent.u.u.type */ _FRAME(BIT8), /* keycode */ _FRAME(BIT16), /* state */ _FRAME(BIT32), /* time */ _FRAME(BIT32), /* window */ _FRAME(EOL), }; xim_externaldef XimFrameRec ext_move_fr[] = { _FRAME(BIT16), /* input-method-ID */ _FRAME(BIT16), /* input-context-ID */ _FRAME(BIT16), /* X */ _FRAME(BIT16), /* Y */ _FRAME(EOL), }; nabi-1.0.0/IMdkit/i18nIc.c0000644000175000017500000007740011655153252011737 00000000000000/****************************************************************** Copyright 1994, 1995 by Sun Microsystems, Inc. Copyright 1993, 1994 by Hewlett-Packard Company Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation, and that the name of Sun Microsystems, Inc. and Hewlett-Packard not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. Sun Microsystems, Inc. and Hewlett-Packard make no representations about the suitability of this software for any purpose. It is provided "as is" without express or implied warranty. SUN MICROSYSTEMS INC. AND HEWLETT-PACKARD COMPANY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SUN MICROSYSTEMS, INC. AND HEWLETT-PACKARD COMPANY BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. Author: Hidetoshi Tajima(tajima@Eng.Sun.COM) Sun Microsystems, Inc. This version tidied and debugged by Steve Underwood May 1999 ******************************************************************/ #include #include "IMdkit.h" #include "Xi18n.h" #include "FrameMgr.h" #include "XimFunc.h" #define IC_SIZE 64 /* Set IC values */ static void SetCardAttribute (XICAttribute *value_ret, char *p, XICAttr *ic_attr, int value_length, int need_swap) { char *buf; FrameMgr fm; if ((buf = (char *) malloc (value_length)) == NULL) return; /*endif*/ if (value_length == sizeof (CARD8)) { memmove (buf, p, value_length); } else if (value_length == sizeof (CARD16)) { INT16 value; extern XimFrameRec short_fr[]; fm = FrameMgrInit (short_fr, (char *) p, need_swap); /* get data */ FrameMgrGetToken (fm, value); FrameMgrFree (fm); memmove (buf, &value, value_length); } else if (value_length == sizeof(CARD32)) { INT32 value; extern XimFrameRec long_fr[]; fm = FrameMgrInit (long_fr, (char *) p, need_swap); /* get data */ FrameMgrGetToken (fm, value); FrameMgrFree (fm); memmove (buf, &value, value_length); } /*endif*/ value_ret->attribute_id = ic_attr->attribute_id; value_ret->name = ic_attr->name; value_ret->name_length = ic_attr->length; value_ret->type = ic_attr->type; value_ret->value_length = value_length; value_ret->value = buf; } static void SetFontAttribute (XICAttribute *value_ret, char *p, XICAttr *ic_attr, int value_length, int need_swap) { char *buf; char *base_name; CARD16 base_length; FrameMgr fm; extern XimFrameRec fontset_fr[]; fm = FrameMgrInit (fontset_fr, (char *) p, need_swap); /* get data */ FrameMgrGetToken (fm, base_length); FrameMgrSetSize (fm, base_length); if ((buf = (char *) malloc (base_length + 1)) == NULL) return; /*endif*/ FrameMgrGetToken (fm, base_name); FrameMgrFree(fm); strncpy (buf, base_name, base_length); buf[base_length] = (char) 0; value_ret->attribute_id = ic_attr->attribute_id; value_ret->name = ic_attr->name; value_ret->name_length = ic_attr->length; value_ret->type = ic_attr->type; value_ret->value_length = value_length; value_ret->value = buf; } static void SetPointAttribute (XICAttribute *value_ret, char *p, XICAttr *ic_attr, int value_length, int need_swap) { XPoint *buf; FrameMgr fm; extern XimFrameRec xpoint_fr[]; if ((buf = (XPoint *) malloc (sizeof (XPoint))) == NULL) return; /*endif*/ fm = FrameMgrInit (xpoint_fr, (char *) p, need_swap); /* get data */ FrameMgrGetToken (fm, buf->x); FrameMgrGetToken (fm, buf->y); FrameMgrFree (fm); value_ret->attribute_id = ic_attr->attribute_id; value_ret->name = ic_attr->name; value_ret->name_length = ic_attr->length; value_ret->type = ic_attr->type; value_ret->value_length = value_length; value_ret->value = (char *) buf; } static void SetRectAttribute (XICAttribute *value_ret, char *p, XICAttr *ic_attr, int value_length, int need_swap) { XRectangle *buf; FrameMgr fm; extern XimFrameRec xrectangle_fr[]; if ((buf = (XRectangle *) malloc (sizeof (XRectangle))) == NULL) return; /*endif*/ fm = FrameMgrInit (xrectangle_fr, (char *) p, need_swap); /* get data */ FrameMgrGetToken (fm, buf->x); FrameMgrGetToken (fm, buf->y); FrameMgrGetToken (fm, buf->width); FrameMgrGetToken (fm, buf->height); FrameMgrFree (fm); value_ret->attribute_id = ic_attr->attribute_id; value_ret->name = ic_attr->name; value_ret->name_length = ic_attr->length; value_ret->type = ic_attr->type; value_ret->value_length = value_length; value_ret->value = (char *) buf; return; } #if 0 static void SetHotKeyAttribute (XICAttribute *value_ret, char *p, XICAttr *ic_attr, int value_length, int need_swap) { INT32 list_number; XIMTriggerKey *hotkeys; memmove (&list_number, p, sizeof(INT32)); p += sizeof(INT32); hotkeys = (XIMTriggerKey *) malloc (list_number*sizeof (XIMTriggerKey)); if (hotkeys == NULL) return; /*endif*/ memmove (hotkeys, p, list_number*sizeof (XIMTriggerKey)); value_ret->attribute_id = ic_attr->attribute_id; value_ret->name = ic_attr->name; value_ret->name_length = ic_attr->length; value_ret->type = ic_attr->type; value_ret->value_length = value_length; value_ret->value = (char *) hotkeys; } #endif /* get IC values */ static void GetAttrHeader (unsigned char *rec, XICAttribute *list, int need_swap) { FrameMgr fm; extern XimFrameRec attr_head_fr[]; fm = FrameMgrInit (attr_head_fr, (char *) rec, need_swap); /* put data */ FrameMgrPutToken (fm, list->attribute_id); FrameMgrPutToken (fm, list->value_length); FrameMgrFree (fm); } static void GetCardAttribute (char *rec, XICAttribute *list, int need_swap) { FrameMgr fm; unsigned char *recp = (unsigned char *) rec; GetAttrHeader (recp, list, need_swap); recp += sizeof (CARD16)*2; if (list->value_length == sizeof (CARD8)) { memmove (recp, list->value, list->value_length); } else if (list->value_length == sizeof (CARD16)) { INT16 *value = (INT16 *) list->value; extern XimFrameRec short_fr[]; fm = FrameMgrInit (short_fr, (char *) recp, need_swap); /* put data */ FrameMgrPutToken (fm, *value); FrameMgrFree (fm); } else if (list->value_length == sizeof (CARD32)) { INT32 *value = (INT32 *) list->value; extern XimFrameRec long_fr[]; fm = FrameMgrInit (long_fr, (char *) recp, need_swap); /* put data */ FrameMgrPutToken (fm, *value); FrameMgrFree (fm); } /*endif*/ } static void GetFontAttribute(char *rec, XICAttribute *list, int need_swap) { FrameMgr fm; extern XimFrameRec fontset_fr[]; char *base_name = (char *) list->value; unsigned char *recp = (unsigned char *) rec; GetAttrHeader (recp, list, need_swap); recp += sizeof (CARD16)*2; fm = FrameMgrInit (fontset_fr, (char *)recp, need_swap); /* put data */ FrameMgrSetSize (fm, list->value_length); FrameMgrPutToken (fm, list->value_length); FrameMgrPutToken (fm, base_name); FrameMgrFree (fm); } static void GetRectAttribute (char *rec, XICAttribute *list, int need_swap) { FrameMgr fm; extern XimFrameRec xrectangle_fr[]; XRectangle *rect = (XRectangle *) list->value; unsigned char *recp = (unsigned char *) rec; GetAttrHeader (recp, list, need_swap); recp += sizeof(CARD16)*2; fm = FrameMgrInit (xrectangle_fr, (char *) recp, need_swap); /* put data */ FrameMgrPutToken (fm, rect->x); FrameMgrPutToken (fm, rect->y); FrameMgrPutToken (fm, rect->width); FrameMgrPutToken (fm, rect->height); FrameMgrFree (fm); } static void GetPointAttribute (char *rec, XICAttribute *list, int need_swap) { FrameMgr fm; extern XimFrameRec xpoint_fr[]; XPoint *rect = (XPoint *) list->value; unsigned char *recp = (unsigned char *) rec; GetAttrHeader (recp, list, need_swap); recp += sizeof(CARD16)*2; fm = FrameMgrInit (xpoint_fr, (char *) recp, need_swap); /* put data */ FrameMgrPutToken (fm, rect->x); FrameMgrPutToken (fm, rect->y); FrameMgrFree (fm); } static int ReadICValue (Xi18n i18n_core, CARD16 icvalue_id, int value_length, void *p, XICAttribute *value_ret, CARD16 *number_ret, int need_swap) { XICAttr *ic_attr = i18n_core->address.xic_attr; int i; *number_ret = (CARD16) 0; for (i = 0; i < i18n_core->address.ic_attr_num; i++, ic_attr++) { if (ic_attr->attribute_id == icvalue_id) break; /*endif*/ } /*endfor*/ switch (ic_attr->type) { case XimType_NEST: { int total_length = 0; CARD16 attribute_ID; INT16 attribute_length; unsigned char *p1 = (unsigned char *) p; CARD16 ic_len = 0; CARD16 number; FrameMgr fm; extern XimFrameRec attr_head_fr[]; while (total_length < value_length) { fm = FrameMgrInit (attr_head_fr, (char *) p1, need_swap); /* get data */ FrameMgrGetToken (fm, attribute_ID); FrameMgrGetToken (fm, attribute_length); FrameMgrFree (fm); p1 += sizeof (CARD16)*2; ReadICValue (i18n_core, attribute_ID, attribute_length, p1, (value_ret + ic_len), &number, need_swap); ic_len++; *number_ret += number; p1 += attribute_length; p1 += IMPAD (attribute_length); total_length += (CARD16) sizeof(CARD16)*2 + (INT16) attribute_length + IMPAD (attribute_length); } /*endwhile*/ return ic_len; } case XimType_CARD8: case XimType_CARD16: case XimType_CARD32: case XimType_Window: SetCardAttribute (value_ret, p, ic_attr, value_length, need_swap); *number_ret = (CARD16) 1; return *number_ret; case XimType_XFontSet: SetFontAttribute (value_ret, p, ic_attr, value_length, need_swap); *number_ret = (CARD16) 1; return *number_ret; case XimType_XRectangle: SetRectAttribute (value_ret, p, ic_attr, value_length, need_swap); *number_ret = (CARD16) 1; return *number_ret; case XimType_XPoint: SetPointAttribute(value_ret, p, ic_attr, value_length, need_swap); *number_ret = (CARD16) 1; return *number_ret; #if 0 case XimType_XIMHotKeyTriggers: SetHotKeyAttribute (value_ret, p, ic_attr, value_length, need_swap); *number_ret = (CARD16) 1; return *number_ret; #endif } /*endswitch*/ return 0; } static void UpdateICAttributeList(XICAttribute *list, int number, int need_swap) { register int i; FrameMgr fm; unsigned char rec[sizeof(CARD32)]; for (i = 0; i < number; i++) { switch (list[i].type) { case XimType_CARD8: case XimType_CARD16: case XimType_CARD32: case XimType_Window: memmove(rec, list[i].value, list[i].value_length); if (list[i].value_length == sizeof (CARD16)) { INT16 *value = (INT16 *) list[i].value; extern XimFrameRec short_fr[]; fm = FrameMgrInit (short_fr, (char *)rec, need_swap); FrameMgrPutToken (fm, *value); FrameMgrFree (fm); } else if (list->value_length == sizeof (CARD32)) { INT32 *value = (INT32 *) list[i].value; extern XimFrameRec long_fr[]; fm = FrameMgrInit (long_fr, (char *)rec, need_swap); FrameMgrPutToken (fm, *value); FrameMgrFree (fm); } break; } } } static XICAttribute *CreateNestedList (CARD16 attr_id, XICAttribute *list, int number, int need_swap) { XICAttribute *nest_list = NULL; register int i; char *values = NULL; char *valuesp; int value_length = 0; if (number == 0) return NULL; /*endif*/ for (i = 0; i < number; i++) { value_length += sizeof (CARD16)*2; value_length += list[i].value_length; value_length += IMPAD (list[i].value_length); } /*endfor*/ if ((values = (char *) malloc (value_length)) == NULL) return NULL; /*endif*/ memset (values, 0, value_length); valuesp = values; for (i = 0; i < number; i++) { switch (list[i].type) { case XimType_CARD8: case XimType_CARD16: case XimType_CARD32: case XimType_Window: GetCardAttribute (valuesp, &list[i], need_swap); break; case XimType_XFontSet: GetFontAttribute (valuesp, &list[i], need_swap); break; case XimType_XRectangle: GetRectAttribute (valuesp, &list[i], need_swap); break; case XimType_XPoint: GetPointAttribute (valuesp, &list[i], need_swap); break; #if 0 case XimType_XIMHotKeyTriggers: GetHotKeyAttribute (valuesp, &list[i], need_swap); break; #endif } /*endswitch*/ valuesp += sizeof (CARD16)*2; valuesp += list[i].value_length; valuesp += IMPAD(list[i].value_length); } /*endfor*/ nest_list = (XICAttribute *) malloc (sizeof (XICAttribute)); if (nest_list == NULL) return NULL; /*endif*/ memset (nest_list, 0, sizeof (XICAttribute)); nest_list->value = (void *) malloc (value_length); if (nest_list->value == NULL) return NULL; /*endif*/ memset (nest_list->value, 0, sizeof (value_length)); nest_list->attribute_id = attr_id; nest_list->value_length = value_length; memmove (nest_list->value, values, value_length); XFree (values); return nest_list; } static Bool IsNestedList (Xi18n i18n_core, CARD16 icvalue_id) { XICAttr *ic_attr = i18n_core->address.xic_attr; int i; for (i = 0; i < i18n_core->address.ic_attr_num; i++, ic_attr++) { if (ic_attr->attribute_id == icvalue_id) { if (ic_attr->type == XimType_NEST) return True; /*endif*/ return False; } /*endif*/ } /*endfor*/ return False; } static Bool IsSeparator (Xi18n i18n_core, CARD16 icvalue_id) { return (i18n_core->address.separatorAttr_id == icvalue_id); } static int GetICValue (Xi18n i18n_core, XICAttribute *attr_ret, CARD16 *id_list, int list_num) { XICAttr *xic_attr = i18n_core->address.xic_attr; register int i; register int j; register int n; i = n = 0; if (IsNestedList (i18n_core, id_list[i])) { i++; while (i < list_num && !IsSeparator (i18n_core, id_list[i])) { for (j = 0; j < i18n_core->address.ic_attr_num; j++) { if (xic_attr[j].attribute_id == id_list[i]) { attr_ret[n].attribute_id = xic_attr[j].attribute_id; attr_ret[n].name_length = xic_attr[j].length; attr_ret[n].name = malloc (xic_attr[j].length + 1); strcpy(attr_ret[n].name, xic_attr[j].name); attr_ret[n].type = xic_attr[j].type; n++; i++; break; } /*endif*/ } /*endfor*/ } /*endwhile*/ } else { for (j = 0; j < i18n_core->address.ic_attr_num; j++) { if (xic_attr[j].attribute_id == id_list[i]) { attr_ret[n].attribute_id = xic_attr[j].attribute_id; attr_ret[n].name_length = xic_attr[j].length; attr_ret[n].name = malloc (xic_attr[j].length + 1); strcpy(attr_ret[n].name, xic_attr[j].name); attr_ret[n].type = xic_attr[j].type; n++; break; } /*endif*/ } /*endfor*/ } /*endif*/ return n; } /* called from CreateICMessageProc and SetICValueMessageProc */ void _Xi18nChangeIC (XIMS ims, IMProtocol *call_data, unsigned char *p, int create_flag) { Xi18n i18n_core = ims->protocol; FrameMgr fm; FmStatus status; CARD16 byte_length; register int total_size; unsigned char *reply = NULL; register int i; register int attrib_num; XICAttribute *attrib_list; XICAttribute pre_attr[IC_SIZE]; XICAttribute sts_attr[IC_SIZE]; XICAttribute ic_attr[IC_SIZE]; CARD16 preedit_ic_num = 0; CARD16 status_ic_num = 0; CARD16 ic_num = 0; CARD16 connect_id = call_data->any.connect_id; IMChangeICStruct *changeic = (IMChangeICStruct *) &call_data->changeic; extern XimFrameRec create_ic_fr[]; extern XimFrameRec create_ic_reply_fr[]; extern XimFrameRec set_ic_values_fr[]; extern XimFrameRec set_ic_values_reply_fr[]; CARD16 input_method_ID; memset (pre_attr, 0, sizeof (XICAttribute)*IC_SIZE); memset (sts_attr, 0, sizeof (XICAttribute)*IC_SIZE); memset (ic_attr, 0, sizeof (XICAttribute)*IC_SIZE); if (create_flag == True) { fm = FrameMgrInit (create_ic_fr, (char *) p, _Xi18nNeedSwap (i18n_core, connect_id)); /* get data */ FrameMgrGetToken (fm, input_method_ID); FrameMgrGetToken (fm, byte_length); } else { fm = FrameMgrInit (set_ic_values_fr, (char *) p, _Xi18nNeedSwap (i18n_core, connect_id)); /* get data */ FrameMgrGetToken (fm, input_method_ID); FrameMgrGetToken (fm, changeic->icid); FrameMgrGetToken (fm, byte_length); } /*endif*/ attrib_list = (XICAttribute *) malloc (sizeof (XICAttribute)*IC_SIZE); if (!attrib_list) { _Xi18nSendMessage (ims, connect_id, XIM_ERROR, 0, 0, 0); return; } /*endif*/ memset (attrib_list, 0, sizeof(XICAttribute)*IC_SIZE); attrib_num = 0; while (FrameMgrIsIterLoopEnd (fm, &status) == False) { void *value; int value_length; FrameMgrGetToken (fm, attrib_list[attrib_num].attribute_id); FrameMgrGetToken (fm, value_length); FrameMgrSetSize (fm, value_length); attrib_list[attrib_num].value_length = value_length; FrameMgrGetToken (fm, value); attrib_list[attrib_num].value = (void *) malloc (value_length + 1); memmove (attrib_list[attrib_num].value, value, value_length); ((char *)attrib_list[attrib_num].value)[value_length] = '\0'; attrib_num++; } /*endwhile*/ for (i = 0; i < attrib_num; i++) { CARD16 number; if (IsNestedList (i18n_core, attrib_list[i].attribute_id)) { if (attrib_list[i].attribute_id == i18n_core->address.preeditAttr_id) { ReadICValue (i18n_core, attrib_list[i].attribute_id, attrib_list[i].value_length, attrib_list[i].value, &pre_attr[preedit_ic_num], &number, _Xi18nNeedSwap(i18n_core, connect_id)); preedit_ic_num += number; } else if (attrib_list[i].attribute_id == i18n_core->address.statusAttr_id) { ReadICValue (i18n_core, attrib_list[i].attribute_id, attrib_list[i].value_length, attrib_list[i].value, &sts_attr[status_ic_num], &number, _Xi18nNeedSwap (i18n_core, connect_id)); status_ic_num += number; } else { /* another nested list.. possible? */ } /*endif*/ } else { ReadICValue (i18n_core, attrib_list[i].attribute_id, attrib_list[i].value_length, attrib_list[i].value, &ic_attr[ic_num], &number, _Xi18nNeedSwap (i18n_core, connect_id)); ic_num += number; } /*endif*/ } /*endfor*/ for (i = 0; i < attrib_num; i++) free (attrib_list[i].value); /*endfor*/ free (attrib_list); FrameMgrFree (fm); changeic->preedit_attr_num = preedit_ic_num; changeic->status_attr_num = status_ic_num; changeic->ic_attr_num = ic_num; changeic->preedit_attr = pre_attr; changeic->status_attr = sts_attr; changeic->ic_attr = ic_attr; if (i18n_core->address.improto) { if (!(i18n_core->address.improto(ims, call_data))) return; /*endif*/ } /*endif*/ /* Here, we must free value of ic_attr, pre_attr and sts_attr */ for (i = 0; i < ic_num; i++) free (ic_attr[i].value); for (i = 0; i < preedit_ic_num; i++) free (pre_attr[i].value); for (i = 0; i < status_ic_num; i++) free (sts_attr[i].value); if (create_flag == True) { fm = FrameMgrInit (create_ic_reply_fr, NULL, _Xi18nNeedSwap (i18n_core, connect_id)); } else { fm = FrameMgrInit (set_ic_values_reply_fr, NULL, _Xi18nNeedSwap (i18n_core, connect_id)); } /*endif*/ total_size = FrameMgrGetTotalSize (fm); reply = (unsigned char *) malloc (total_size); if (!reply) { _Xi18nSendMessage (ims, connect_id, XIM_ERROR, 0, 0, 0); return; } /*endif*/ memset (reply, 0, total_size); FrameMgrSetBuffer (fm, reply); FrameMgrPutToken (fm, input_method_ID); FrameMgrPutToken (fm, changeic->icid); if (create_flag == True) { _Xi18nSendMessage (ims, connect_id, XIM_CREATE_IC_REPLY, 0, reply, total_size); } else { _Xi18nSendMessage (ims, connect_id, XIM_SET_IC_VALUES_REPLY, 0, reply, total_size); } /*endif*/ if (create_flag == True) { int on_key_num = i18n_core->address.on_keys.count_keys; int off_key_num = i18n_core->address.off_keys.count_keys; if (on_key_num == 0 && off_key_num == 0) { long mask; if (i18n_core->address.imvalue_mask & I18N_FILTERMASK) mask = i18n_core->address.filterevent_mask; else mask = DEFAULT_FILTER_MASK; /*endif*/ /* static event flow is default */ _Xi18nSetEventMask (ims, connect_id, input_method_ID, changeic->icid, mask, ~mask); } /*endif*/ } /*endif*/ FrameMgrFree (fm); free (reply); } /* called from GetICValueMessageProc */ void _Xi18nGetIC (XIMS ims, IMProtocol *call_data, unsigned char *p) { Xi18n i18n_core = ims->protocol; FrameMgr fm; FmStatus status; extern XimFrameRec get_ic_values_fr[]; extern XimFrameRec get_ic_values_reply_fr[]; CARD16 byte_length; register int total_size; unsigned char *reply = NULL; XICAttribute *preedit_ret = NULL; XICAttribute *status_ret = NULL; register int i; register int number; int iter_count; int need_swap; CARD16 *attrID_list; XICAttribute pre_attr[IC_SIZE]; XICAttribute sts_attr[IC_SIZE]; XICAttribute ic_attr[IC_SIZE]; CARD16 pre_count = 0; CARD16 sts_count = 0; CARD16 ic_count = 0; IMChangeICStruct *getic = (IMChangeICStruct *) &call_data->changeic; CARD16 connect_id = call_data->any.connect_id; CARD16 input_method_ID; memset (pre_attr, 0, sizeof (XICAttribute)*IC_SIZE); memset (sts_attr, 0, sizeof (XICAttribute)*IC_SIZE); memset (ic_attr, 0, sizeof (XICAttribute)*IC_SIZE); fm = FrameMgrInit (get_ic_values_fr, (char *) p, _Xi18nNeedSwap (i18n_core, connect_id)); /* get data */ FrameMgrGetToken (fm, input_method_ID); FrameMgrGetToken (fm, getic->icid); FrameMgrGetToken (fm, byte_length); attrID_list = (CARD16 *) malloc (sizeof (CARD16)*IC_SIZE); /* bogus */ memset (attrID_list, 0, sizeof (CARD16)*IC_SIZE); number = 0; while (FrameMgrIsIterLoopEnd (fm, &status) == False) FrameMgrGetToken (fm, attrID_list[number++]); /*endwhile*/ FrameMgrFree (fm); i = 0; while (i < number) { int read_number; if (IsNestedList (i18n_core, attrID_list[i])) { if (attrID_list[i] == i18n_core->address.preeditAttr_id) { read_number = GetICValue (i18n_core, &pre_attr[pre_count], &attrID_list[i], number); i += read_number + 1; pre_count += read_number; } else if (attrID_list[i] == i18n_core->address.statusAttr_id) { read_number = GetICValue (i18n_core, &sts_attr[sts_count], &attrID_list[i], number); i += read_number + 1; sts_count += read_number; } else { /* another nested list.. possible? */ } /*endif*/ } else { read_number = GetICValue (i18n_core, &ic_attr[ic_count], &attrID_list[i], number); i += read_number; ic_count += read_number; } /*endif*/ } /*endwhile*/ getic->preedit_attr_num = pre_count; getic->status_attr_num = sts_count; getic->ic_attr_num = ic_count; getic->preedit_attr = pre_attr; getic->status_attr = sts_attr; getic->ic_attr = ic_attr; if (i18n_core->address.improto) { if (!(i18n_core->address.improto (ims, call_data))) return; /*endif*/ } /*endif*/ need_swap = _Xi18nNeedSwap (i18n_core, connect_id); UpdateICAttributeList(getic->ic_attr, getic->ic_attr_num, need_swap); iter_count = getic->ic_attr_num; preedit_ret = CreateNestedList (i18n_core->address.preeditAttr_id, getic->preedit_attr, getic->preedit_attr_num, need_swap); if (preedit_ret) iter_count++; /*endif*/ status_ret = CreateNestedList (i18n_core->address.statusAttr_id, getic->status_attr, getic->status_attr_num, need_swap); if (status_ret) iter_count++; /*endif*/ fm = FrameMgrInit (get_ic_values_reply_fr, NULL, need_swap); /* set iteration count for list of ic_attribute */ FrameMgrSetIterCount (fm, iter_count); /* set length of BARRAY item in xicattribute_fr */ for (i = 0; i < (int) getic->ic_attr_num; i++) FrameMgrSetSize (fm, ic_attr[i].value_length); /*endfor*/ if (preedit_ret) FrameMgrSetSize (fm, preedit_ret->value_length); /*endif*/ if (status_ret) FrameMgrSetSize (fm, status_ret->value_length); /*endif*/ total_size = FrameMgrGetTotalSize (fm); reply = (unsigned char *) malloc (total_size); if (reply == NULL) { _Xi18nSendMessage (ims, connect_id, XIM_ERROR, 0, 0, 0); return; } /*endif*/ memset (reply, 0, total_size); FrameMgrSetBuffer (fm, reply); FrameMgrPutToken (fm, input_method_ID); FrameMgrPutToken (fm, getic->icid); for (i = 0; i < (int) getic->ic_attr_num; i++) { FrameMgrPutToken (fm, ic_attr[i].attribute_id); FrameMgrPutToken (fm, ic_attr[i].value_length); FrameMgrPutToken (fm, ic_attr[i].value); } /*endfor*/ if (preedit_ret) { FrameMgrPutToken (fm, preedit_ret->attribute_id); FrameMgrPutToken (fm, preedit_ret->value_length); FrameMgrPutToken (fm, preedit_ret->value); } /*endif*/ if (status_ret) { FrameMgrPutToken (fm, status_ret->attribute_id); FrameMgrPutToken (fm, status_ret->value_length); FrameMgrPutToken (fm, status_ret->value); } /*endif*/ _Xi18nSendMessage (ims, connect_id, XIM_GET_IC_VALUES_REPLY, 0, reply, total_size); free (reply); free (attrID_list); for (i = 0; i < (int) getic->ic_attr_num; i++) { if (getic->ic_attr[i].name) free (getic->ic_attr[i].name); /*endif*/ if (getic->ic_attr[i].value) free (getic->ic_attr[i].value); /*endif*/ } /*endfor*/ for (i = 0; i < (int) getic->preedit_attr_num; i++) { if (getic->preedit_attr[i].name) free (getic->preedit_attr[i].name); /*endif*/ if (getic->preedit_attr[i].value) free (getic->preedit_attr[i].value); /*endif*/ } /*endfor*/ for (i = 0; i < (int) getic->status_attr_num; i++) { if (getic->status_attr[i].name) free (getic->status_attr[i].name); /*endif*/ if (getic->status_attr[i].value) free (getic->status_attr[i].value); /*endif*/ } /*endfor*/ if (preedit_ret) { free (preedit_ret->value); free (preedit_ret); } /*endif*/ if (status_ret) { free (status_ret->value); free (status_ret); } /*endif*/ FrameMgrFree (fm); } nabi-1.0.0/IMdkit/i18nMethod.c0000644000175000017500000011332211655153252012616 00000000000000/****************************************************************** Copyright 1994, 1995 by Sun Microsystems, Inc. Copyright 1993, 1994 by Hewlett-Packard Company Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation, and that the name of Sun Microsystems, Inc. and Hewlett-Packard not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. Sun Microsystems, Inc. and Hewlett-Packard make no representations about the suitability of this software for any purpose. It is provided "as is" without express or implied warranty. SUN MICROSYSTEMS INC. AND HEWLETT-PACKARD COMPANY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SUN MICROSYSTEMS, INC. AND HEWLETT-PACKARD COMPANY BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. Author: Hidetoshi Tajima(tajima@Eng.Sun.COM) Sun Microsystems, Inc. This version tidied and debugged by Steve Underwood May 1999 ******************************************************************/ #include #include #ifndef NEED_EVENTS #define NEED_EVENTS #endif #include #undef NEED_EVENTS #include "FrameMgr.h" #include "IMdkit.h" #include "Xi18n.h" #include "XimFunc.h" extern Xi18nClient *_Xi18nFindClient (Xi18n, CARD16); static void *xi18n_setup (Display *, XIMArg *); static Status xi18n_openIM (XIMS); static Status xi18n_closeIM (XIMS); static char *xi18n_setIMValues (XIMS, XIMArg *); static char *xi18n_getIMValues (XIMS, XIMArg *); static Status xi18n_forwardEvent (XIMS, XPointer); static Status xi18n_commit (XIMS, XPointer); static int xi18n_callCallback (XIMS, XPointer); static int xi18n_preeditStart (XIMS, XPointer); static int xi18n_preeditEnd (XIMS, XPointer); static int xi18n_syncXlib (XIMS, XPointer); #ifndef XIM_SERVERS #define XIM_SERVERS "XIM_SERVERS" #endif static Atom XIM_Servers = None; IMMethodsRec Xi18n_im_methods = { xi18n_setup, xi18n_openIM, xi18n_closeIM, xi18n_setIMValues, xi18n_getIMValues, xi18n_forwardEvent, xi18n_commit, xi18n_callCallback, xi18n_preeditStart, xi18n_preeditEnd, xi18n_syncXlib, }; extern Bool _Xi18nCheckXAddress (Xi18n, TransportSW *, char *); extern Bool _Xi18nCheckTransAddress (Xi18n, TransportSW *, char *); TransportSW _TransR[] = { {"X", 1, _Xi18nCheckXAddress}, #ifdef TCPCONN {"tcp", 3, _Xi18nCheckTransAddress}, {"local", 5, _Xi18nCheckTransAddress}, #endif #ifdef DNETCONN {"decnet", 6, _Xi18nCheckTransAddress}, #endif {(char *) NULL, 0, (Bool (*) ()) NULL} }; static Bool GetInputStyles (Xi18n i18n_core, XIMStyles **p_style) { Xi18nAddressRec *address = (Xi18nAddressRec *) &i18n_core->address; XIMStyles *p; int i; p = &address->input_styles; if ((*p_style = (XIMStyles *) malloc (sizeof (XIMStyles) + p->count_styles*sizeof (XIMStyle))) == NULL) { return False; } /*endif*/ (*p_style)->count_styles = p->count_styles; (*p_style)->supported_styles = (XIMStyle *) ((XPointer) *p_style + sizeof (XIMStyles)); for (i = 0; i < (int) p->count_styles; i++) (*p_style)->supported_styles[i] = p->supported_styles[i]; /*endfor*/ return True; } static Bool GetOnOffKeys (Xi18n i18n_core, long mask, XIMTriggerKeys **p_key) { Xi18nAddressRec *address = (Xi18nAddressRec *) &i18n_core->address; XIMTriggerKeys *p; int i; if (mask & I18N_ON_KEYS) p = &address->on_keys; else p = &address->off_keys; /*endif*/ if ((*p_key = (XIMTriggerKeys *) malloc (sizeof(XIMTriggerKeys) + p->count_keys*sizeof(XIMTriggerKey))) == NULL) { return False; } /*endif*/ (*p_key)->count_keys = p->count_keys; (*p_key)->keylist = (XIMTriggerKey *) ((XPointer) *p_key + sizeof(XIMTriggerKeys)); for (i = 0; i < (int) p->count_keys; i++) { (*p_key)->keylist[i].keysym = p->keylist[i].keysym; (*p_key)->keylist[i].modifier = p->keylist[i].modifier; (*p_key)->keylist[i].modifier_mask = p->keylist[i].modifier_mask; } /*endfor*/ return True; } static Bool GetEncodings(Xi18n i18n_core, XIMEncodings **p_encoding) { Xi18nAddressRec *address = (Xi18nAddressRec *) &i18n_core->address; XIMEncodings *p; int i; p = &address->encoding_list; if ((*p_encoding = (XIMEncodings *) malloc (sizeof (XIMEncodings) + p->count_encodings*sizeof(XIMEncoding))) == NULL) { return False; } /*endif*/ (*p_encoding)->count_encodings = p->count_encodings; (*p_encoding)->supported_encodings = (XIMEncoding *) ((XPointer)*p_encoding + sizeof (XIMEncodings)); for (i = 0; i < (int) p->count_encodings; i++) { (*p_encoding)->supported_encodings[i] = (char *) malloc (strlen (p->supported_encodings[i]) + 1); strcpy ((*p_encoding)->supported_encodings[i], p->supported_encodings[i]); } /*endif*/ return True; } static char *ParseArgs (Xi18n i18n_core, int mode, XIMArg *args) { Xi18nAddressRec *address = (Xi18nAddressRec *) &i18n_core->address; XIMArg *p; if (mode == I18N_OPEN || mode == I18N_SET) { for (p = args; p->name != NULL; p++) { if (strcmp (p->name, IMLocale) == 0) { if (address->imvalue_mask & I18N_IM_LOCALE) return IMLocale; /*endif*/ address->im_locale = (char *) malloc (strlen (p->value) + 1); if (!address->im_locale) return IMLocale; /*endif*/ strcpy (address->im_locale, p->value); address->imvalue_mask |= I18N_IM_LOCALE; } else if (strcmp (p->name, IMServerTransport) == 0) { if (address->imvalue_mask & I18N_IM_ADDRESS) return IMServerTransport; /*endif*/ address->im_addr = (char *) malloc (strlen (p->value) + 1); if (!address->im_addr) return IMServerTransport; /*endif*/ strcpy(address->im_addr, p->value); address->imvalue_mask |= I18N_IM_ADDRESS; } else if (strcmp (p->name, IMServerName) == 0) { if (address->imvalue_mask & I18N_IM_NAME) return IMServerName; /*endif*/ address->im_name = (char *) malloc (strlen (p->value) + 1); if (!address->im_name) return IMServerName; /*endif*/ strcpy (address->im_name, p->value); address->imvalue_mask |= I18N_IM_NAME; } else if (strcmp (p->name, IMServerWindow) == 0) { if (address->imvalue_mask & I18N_IMSERVER_WIN) return IMServerWindow; /*endif*/ address->im_window = (Window) p->value; address->imvalue_mask |= I18N_IMSERVER_WIN; } else if (strcmp (p->name, IMInputStyles) == 0) { if (address->imvalue_mask & I18N_INPUT_STYLES) return IMInputStyles; /*endif*/ address->input_styles.count_styles = ((XIMStyles*)p->value)->count_styles; address->input_styles.supported_styles = (XIMStyle *) malloc (sizeof (XIMStyle)*address->input_styles.count_styles); if (address->input_styles.supported_styles == (XIMStyle *) NULL) return IMInputStyles; /*endif*/ memmove (address->input_styles.supported_styles, ((XIMStyles *) p->value)->supported_styles, sizeof (XIMStyle)*address->input_styles.count_styles); address->imvalue_mask |= I18N_INPUT_STYLES; } else if (strcmp (p->name, IMProtocolHandler) == 0) { address->improto = (IMProtoHandler) p->value; address->imvalue_mask |= I18N_IM_HANDLER; } else if (strcmp (p->name, IMOnKeysList) == 0) { if (address->on_keys.keylist != NULL) free(address->on_keys.keylist); address->on_keys.count_keys = ((XIMTriggerKeys *) p->value)->count_keys; address->on_keys.keylist = (XIMTriggerKey *) malloc (sizeof (XIMTriggerKey)*address->on_keys.count_keys); if (address->on_keys.keylist == (XIMTriggerKey *) NULL) return IMOnKeysList; /*endif*/ memmove (address->on_keys.keylist, ((XIMTriggerKeys *) p->value)->keylist, sizeof (XIMTriggerKey)*address->on_keys.count_keys); address->imvalue_mask |= I18N_ON_KEYS; } else if (strcmp (p->name, IMOffKeysList) == 0) { if (address->imvalue_mask & I18N_OFF_KEYS) return IMOffKeysList; /*endif*/ address->off_keys.count_keys = ((XIMTriggerKeys *) p->value)->count_keys; address->off_keys.keylist = (XIMTriggerKey *) malloc (sizeof (XIMTriggerKey)*address->off_keys.count_keys); if (address->off_keys.keylist == (XIMTriggerKey *) NULL) return IMOffKeysList; /*endif*/ memmove (address->off_keys.keylist, ((XIMTriggerKeys *) p->value)->keylist, sizeof (XIMTriggerKey)*address->off_keys.count_keys); address->imvalue_mask |= I18N_OFF_KEYS; } else if (strcmp (p->name, IMEncodingList) == 0) { if (address->imvalue_mask & I18N_ENCODINGS) return IMEncodingList; /*endif*/ address->encoding_list.count_encodings = ((XIMEncodings *) p->value)->count_encodings; address->encoding_list.supported_encodings = (XIMEncoding *) malloc (sizeof (XIMEncoding)*address->encoding_list.count_encodings); if (address->encoding_list.supported_encodings == (XIMEncoding *) NULL) { return IMEncodingList; } /*endif*/ memmove (address->encoding_list.supported_encodings, ((XIMEncodings *) p->value)->supported_encodings, sizeof (XIMEncoding)*address->encoding_list.count_encodings); address->imvalue_mask |= I18N_ENCODINGS; } else if (strcmp (p->name, IMFilterEventMask) == 0) { if (address->imvalue_mask & I18N_FILTERMASK) return IMFilterEventMask; /*endif*/ address->filterevent_mask = (long) p->value; address->imvalue_mask |= I18N_FILTERMASK; } /*endif*/ } /*endfor*/ if (mode == I18N_OPEN) { /* check mandatory IM values */ if (!(address->imvalue_mask & I18N_IM_LOCALE)) { /* locales must be set in IMOpenIM */ return IMLocale; } /*endif*/ if (!(address->imvalue_mask & I18N_IM_ADDRESS)) { /* address must be set in IMOpenIM */ return IMServerTransport; } /*endif*/ } /*endif*/ } else if (mode == I18N_GET) { for (p = args; p->name != NULL; p++) { if (strcmp (p->name, IMLocale) == 0) { p->value = (char *) malloc (strlen (address->im_locale) + 1); if (!p->value) return IMLocale; /*endif*/ strcpy (p->value, address->im_locale); } else if (strcmp (p->name, IMServerTransport) == 0) { p->value = (char *) malloc (strlen (address->im_addr) + 1); if (!p->value) return IMServerTransport; /*endif*/ strcpy (p->value, address->im_addr); } else if (strcmp (p->name, IMServerName) == 0) { if (address->imvalue_mask & I18N_IM_NAME) { p->value = (char *) malloc (strlen (address->im_name) + 1); if (!p->value) return IMServerName; /*endif*/ strcpy (p->value, address->im_name); } else { return IMServerName; } /*endif*/ } else if (strcmp (p->name, IMServerWindow) == 0) { if (address->imvalue_mask & I18N_IMSERVER_WIN) *((Window *) (p->value)) = address->im_window; else return IMServerWindow; /*endif*/ } else if (strcmp (p->name, IMInputStyles) == 0) { if (GetInputStyles (i18n_core, (XIMStyles **) p->value) == False) { return IMInputStyles; } /*endif*/ } else if (strcmp (p->name, IMProtocolHandler) == 0) { if (address->imvalue_mask & I18N_IM_HANDLER) *((IMProtoHandler *) (p->value)) = address->improto; else return IMProtocolHandler; /*endif*/ } else if (strcmp (p->name, IMOnKeysList) == 0) { if (address->imvalue_mask & I18N_ON_KEYS) { if (GetOnOffKeys (i18n_core, I18N_ON_KEYS, (XIMTriggerKeys **) p->value) == False) { return IMOnKeysList; } /*endif*/ } else { return IMOnKeysList; } /*endif*/ } else if (strcmp (p->name, IMOffKeysList) == 0) { if (address->imvalue_mask & I18N_OFF_KEYS) { if (GetOnOffKeys (i18n_core, I18N_OFF_KEYS, (XIMTriggerKeys **) p->value) == False) { return IMOffKeysList; } /*endif*/ } else { return IMOffKeysList; } /*endif*/ } else if (strcmp (p->name, IMEncodingList) == 0) { if (address->imvalue_mask & I18N_ENCODINGS) { if (GetEncodings (i18n_core, (XIMEncodings **) p->value) == False) { return IMEncodingList; } /*endif*/ } else { return IMEncodingList; } /*endif*/ } else if (strcmp (p->name, IMFilterEventMask) == 0) { if (address->imvalue_mask & I18N_FILTERMASK) *((long *) (p->value)) = address->filterevent_mask; else return IMFilterEventMask; /*endif*/ } /*endif*/ } /*endfor*/ } /*endif*/ return NULL; } static int CheckIMName (Xi18n i18n_core) { char *address = i18n_core->address.im_addr; int i; for (i = 0; _TransR[i].transportname; i++) { while (*address == ' ' || *address == '\t') address++; /*endwhile*/ if (strncmp (address, _TransR[i].transportname, _TransR[i].namelen) == 0 && address[_TransR[i].namelen] == '/') { if (_TransR[i].checkAddr (i18n_core, &_TransR[i], address + _TransR[i].namelen + 1) == True) { return True; } /*endif*/ return False; } /*endif*/ } /*endfor*/ return False; } static int SetXi18nSelectionOwner(Xi18n i18n_core) { Display *dpy = i18n_core->address.dpy; Window ims_win = i18n_core->address.im_window; Window root = RootWindow (dpy, DefaultScreen (dpy)); Atom realtype; int realformat; unsigned long bytesafter; long *data=NULL; unsigned long length; Atom atom; int i; int found; int forse = False; char buf[256]; (void)snprintf(buf, sizeof(buf), "@server=%s", i18n_core->address.im_name); buf[sizeof(buf) - 1] = '\0'; if ((atom = XInternAtom(dpy, buf, False)) == 0) return False; i18n_core->address.selection = atom; if (XIM_Servers == None) XIM_Servers = XInternAtom (dpy, XIM_SERVERS, False); /*endif*/ XGetWindowProperty (dpy, root, XIM_Servers, 0L, 1000000L, False, XA_ATOM, &realtype, &realformat, &length, &bytesafter, (unsigned char **) (&data)); if (realtype != None && (realtype != XA_ATOM || realformat != 32)) { if (data != NULL) XFree ((char *) data); return False; } found = False; for (i = 0; i < length; i++) { if (data[i] == atom) { Window owner; found = True; if ((owner = XGetSelectionOwner (dpy, atom)) != ims_win) { if (owner == None || forse == True) XSetSelectionOwner (dpy, atom, ims_win, CurrentTime); else return False; } break; } } if (found == False) { XSetSelectionOwner (dpy, atom, ims_win, CurrentTime); XChangeProperty (dpy, root, XIM_Servers, XA_ATOM, 32, PropModePrepend, (unsigned char *) &atom, 1); } else { /* * We always need to generate the PropertyNotify to the Root Window */ XChangeProperty (dpy, root, XIM_Servers, XA_ATOM, 32, PropModePrepend, (unsigned char *) data, 0); } if (data != NULL) XFree ((char *) data); /* Intern "LOCALES" and "TRANSOPORT" Target Atoms */ i18n_core->address.Localename = XInternAtom (dpy, LOCALES, False); i18n_core->address.Transportname = XInternAtom (dpy, TRANSPORT, False); return (XGetSelectionOwner (dpy, atom) == ims_win); } static int DeleteXi18nAtom(Xi18n i18n_core) { Display *dpy = i18n_core->address.dpy; Window root = RootWindow (dpy, DefaultScreen (dpy)); Atom realtype; int realformat; unsigned long bytesafter; long *data=NULL; unsigned long length; Atom atom; int i, ret; int found; char buf[256]; (void)snprintf(buf, sizeof(buf), "@server=%s", i18n_core->address.im_name); buf[sizeof(buf) - 1] = '\0'; if ((atom = XInternAtom(dpy, buf, False)) == 0) return False; i18n_core->address.selection = atom; if (XIM_Servers == None) XIM_Servers = XInternAtom (dpy, XIM_SERVERS, False); XGetWindowProperty (dpy, root, XIM_Servers, 0L, 1000000L, False, XA_ATOM, &realtype, &realformat, &length, &bytesafter, (unsigned char **) (&data)); if (realtype != XA_ATOM || realformat != 32) { if (data != NULL) XFree ((char *) data); return False; } found = False; for (i = 0; i < length; i++) { if (data[i] == atom) { found = True; break; } } if (found == True) { for (i=i+1; iaddress.dpy = dpy; if (ParseArgs (i18n_core, I18N_OPEN, args) != NULL) { free (i18n_core); return NULL; } /*endif*/ if (*(char *) &endian) i18n_core->address.im_byteOrder = 'l'; else i18n_core->address.im_byteOrder = 'B'; /*endif*/ /* install IMAttr and ICAttr list in i18n_core */ _Xi18nInitAttrList (i18n_core); /* install IMExtension list in i18n_core */ _Xi18nInitExtension (i18n_core); return i18n_core; } static void ReturnSelectionNotify (Xi18n i18n_core, XSelectionRequestEvent *ev) { XEvent event; Display *dpy = i18n_core->address.dpy; char buf[4096]; event.type = SelectionNotify; event.xselection.requestor = ev->requestor; event.xselection.selection = ev->selection; event.xselection.target = ev->target; event.xselection.time = ev->time; event.xselection.property = ev->property; if (ev->target == i18n_core->address.Localename) { snprintf (buf, sizeof(buf), "@locale=%s", i18n_core->address.im_locale); buf[sizeof(buf) - 1] = '\0'; } else if (ev->target == i18n_core->address.Transportname) { snprintf (buf, sizeof(buf), "@transport=%s", i18n_core->address.im_addr); buf[sizeof(buf) - 1] = '\0'; } /*endif*/ XChangeProperty (dpy, event.xselection.requestor, ev->target, ev->target, 8, PropModeReplace, (unsigned char *) buf, strlen (buf)); XSendEvent (dpy, event.xselection.requestor, False, NoEventMask, &event); XFlush (i18n_core->address.dpy); } static Bool WaitXSelectionRequest (Display *dpy, Window win, XEvent *ev, XPointer client_data) { XIMS ims = (XIMS) client_data; Xi18n i18n_core = ims->protocol; if (((XSelectionRequestEvent *) ev)->selection == i18n_core->address.selection) { ReturnSelectionNotify (i18n_core, (XSelectionRequestEvent *) ev); return True; } /*endif*/ return False; } static Status xi18n_openIM(XIMS ims) { Xi18n i18n_core = ims->protocol; Display *dpy = i18n_core->address.dpy; if (!CheckIMName (i18n_core) || !SetXi18nSelectionOwner (i18n_core) || !i18n_core->methods.begin (ims)) { free (i18n_core->address.im_name); free (i18n_core->address.im_locale); free (i18n_core->address.im_addr); free (i18n_core); return False; } /*endif*/ _XRegisterFilterByType (dpy, i18n_core->address.im_window, SelectionRequest, SelectionRequest, WaitXSelectionRequest, (XPointer)ims); XFlush(dpy); return True; } static Status xi18n_closeIM(XIMS ims) { Xi18n i18n_core = ims->protocol; Display *dpy = i18n_core->address.dpy; /* remove all client connections */ while (i18n_core->address.clients != NULL) { int connect_id = i18n_core->address.clients->connect_id; i18n_core->methods.disconnect(ims, connect_id); } DeleteXi18nAtom(i18n_core); if (!i18n_core->methods.end (ims)) return False; _XUnregisterFilter (dpy, i18n_core->address.im_window, WaitXSelectionRequest, (XPointer)ims); _Xi18nDeleteAllClients(i18n_core); _Xi18nDeleteFreeClients(i18n_core); free (i18n_core->address.im_name); free (i18n_core->address.im_locale); free (i18n_core->address.im_addr); free (i18n_core->address.input_styles.supported_styles); free (i18n_core->address.on_keys.keylist); free (i18n_core->address.off_keys.keylist); free (i18n_core->address.encoding_list.supported_encodings); free (i18n_core->address.xim_attr); free (i18n_core->address.xic_attr); free (i18n_core->address.connect_addr); free (i18n_core); return True; } static char *xi18n_setIMValues (XIMS ims, XIMArg *args) { Xi18n i18n_core = ims->protocol; char *ret; if ((ret = ParseArgs (i18n_core, I18N_SET, args)) != NULL) return ret; /*endif*/ return NULL; } static char *xi18n_getIMValues (XIMS ims, XIMArg *args) { Xi18n i18n_core = ims->protocol; char *ret; if ((ret = ParseArgs (i18n_core, I18N_GET, args)) != NULL) return ret; /*endif*/ return NULL; } /* For byte swapping */ #define Swap16(n) \ (((n) << 8 & 0xFF00) | \ ((n) >> 8 & 0xFF) \ ) #define Swap32(n) \ (((n) << 24 & 0xFF000000) | \ ((n) << 8 & 0xFF0000) | \ ((n) >> 8 & 0xFF00) | \ ((n) >> 24 & 0xFF) \ ) #define Swap64(n) \ (((n) << 56 & 0xFF00000000000000) | \ ((n) << 40 & 0xFF000000000000) | \ ((n) << 24 & 0xFF0000000000) | \ ((n) << 8 & 0xFF00000000) | \ ((n) >> 8 & 0xFF000000) | \ ((n) >> 24 & 0xFF0000) | \ ((n) >> 40 & 0xFF00) | \ ((n) >> 56 & 0xFF) \ ) static void EventToWireEvent (XEvent *ev, xEvent *event, CARD16 *serial, Bool need_swap) { *serial = (CARD16) (ev->xany.serial >> 16); event->u.u.sequenceNumber = (CARD16) (ev->xany.serial & (unsigned long) 0xFFFF); switch (ev->type) { case KeyPress: case KeyRelease: { XKeyEvent *kev = (XKeyEvent *) ev; if (need_swap) { event->u.u.type = ev->type; event->u.keyButtonPointer.root = Swap32(kev->root); event->u.keyButtonPointer.state = Swap16(kev->state); event->u.keyButtonPointer.time = Swap32(kev->time); event->u.keyButtonPointer.event = Swap32(kev->window); event->u.keyButtonPointer.child = Swap32(kev->subwindow); event->u.keyButtonPointer.eventX = Swap16(kev->x); event->u.keyButtonPointer.eventY = Swap16(kev->y); event->u.keyButtonPointer.rootX = Swap16(kev->x_root); event->u.keyButtonPointer.rootY = Swap16(kev->y_root); event->u.keyButtonPointer.sameScreen = kev->same_screen; event->u.u.detail = kev->keycode; } else { event->u.u.type = ev->type; event->u.keyButtonPointer.root = kev->root; event->u.keyButtonPointer.state = kev->state; event->u.keyButtonPointer.time = kev->time; event->u.keyButtonPointer.event = kev->window; event->u.keyButtonPointer.child = kev->subwindow; event->u.keyButtonPointer.eventX = kev->x; event->u.keyButtonPointer.eventY = kev->y; event->u.keyButtonPointer.rootX = kev->x_root; event->u.keyButtonPointer.rootY = kev->y_root; event->u.keyButtonPointer.sameScreen = kev->same_screen; event->u.u.detail = kev->keycode; } } } /*endswitch*/ } static Status xi18n_forwardEvent (XIMS ims, XPointer xp) { Xi18n i18n_core = ims->protocol; IMForwardEventStruct *call_data = (IMForwardEventStruct *)xp; FrameMgr fm; extern XimFrameRec forward_event_fr[]; register int total_size; unsigned char *reply = NULL; unsigned char *replyp; CARD16 serial; int event_size; Xi18nClient *client; Bool need_swap; client = (Xi18nClient *) _Xi18nFindClient (i18n_core, call_data->connect_id); /* create FrameMgr */ need_swap = _Xi18nNeedSwap (i18n_core, call_data->connect_id); fm = FrameMgrInit (forward_event_fr, NULL, need_swap); total_size = FrameMgrGetTotalSize (fm); event_size = sizeof (xEvent); reply = (unsigned char *) malloc (total_size + event_size); if (!reply) { _Xi18nSendMessage (ims, call_data->connect_id, XIM_ERROR, 0, 0, 0); return False; } /*endif*/ memset (reply, 0, total_size + event_size); FrameMgrSetBuffer (fm, reply); replyp = reply; call_data->sync_bit = 1; /* always sync */ client->sync = True; FrameMgrPutToken (fm, call_data->connect_id); FrameMgrPutToken (fm, call_data->icid); FrameMgrPutToken (fm, call_data->sync_bit); replyp += total_size; EventToWireEvent (&(call_data->event), (xEvent *) replyp, &serial, need_swap); FrameMgrPutToken (fm, serial); _Xi18nSendMessage (ims, call_data->connect_id, XIM_FORWARD_EVENT, 0, reply, total_size + event_size); free (reply); FrameMgrFree (fm); return True; } static Status xi18n_commit (XIMS ims, XPointer xp) { Xi18n i18n_core = ims->protocol; IMCommitStruct *call_data = (IMCommitStruct *)xp; FrameMgr fm; extern XimFrameRec commit_chars_fr[]; extern XimFrameRec commit_both_fr[]; register int total_size; unsigned char *reply = NULL; CARD16 str_length; call_data->flag |= XimSYNCHRONUS; /* always sync */ if (!(call_data->flag & XimLookupKeySym) && (call_data->flag & XimLookupChars)) { fm = FrameMgrInit (commit_chars_fr, NULL, _Xi18nNeedSwap (i18n_core, call_data->connect_id)); /* set length of STRING8 */ str_length = strlen (call_data->commit_string); FrameMgrSetSize (fm, str_length); total_size = FrameMgrGetTotalSize (fm); reply = (unsigned char *) malloc (total_size); if (!reply) { _Xi18nSendMessage (ims, call_data->connect_id, XIM_ERROR, 0, 0, 0); return False; } /*endif*/ memset (reply, 0, total_size); FrameMgrSetBuffer (fm, reply); str_length = FrameMgrGetSize (fm); FrameMgrPutToken (fm, call_data->connect_id); FrameMgrPutToken (fm, call_data->icid); FrameMgrPutToken (fm, call_data->flag); FrameMgrPutToken (fm, str_length); FrameMgrPutToken (fm, call_data->commit_string); } else { fm = FrameMgrInit (commit_both_fr, NULL, _Xi18nNeedSwap (i18n_core, call_data->connect_id)); /* set length of STRING8 */ str_length = strlen (call_data->commit_string); if (str_length > 0) FrameMgrSetSize (fm, str_length); /*endif*/ total_size = FrameMgrGetTotalSize (fm); reply = (unsigned char *) malloc (total_size); if (!reply) { _Xi18nSendMessage (ims, call_data->connect_id, XIM_ERROR, 0, 0, 0); return False; } /*endif*/ FrameMgrSetBuffer (fm, reply); FrameMgrPutToken (fm, call_data->connect_id); FrameMgrPutToken (fm, call_data->icid); FrameMgrPutToken (fm, call_data->flag); FrameMgrPutToken (fm, call_data->keysym); if (str_length > 0) { str_length = FrameMgrGetSize (fm); FrameMgrPutToken (fm, str_length); FrameMgrPutToken (fm, call_data->commit_string); } /*endif*/ } /*endif*/ _Xi18nSendMessage (ims, call_data->connect_id, XIM_COMMIT, 0, reply, total_size); FrameMgrFree (fm); free (reply); return True; } static int xi18n_callCallback (XIMS ims, XPointer xp) { IMProtocol *call_data = (IMProtocol *)xp; switch (call_data->major_code) { case XIM_GEOMETRY: return _Xi18nGeometryCallback (ims, call_data); case XIM_PREEDIT_START: return _Xi18nPreeditStartCallback (ims, call_data); case XIM_PREEDIT_DRAW: return _Xi18nPreeditDrawCallback (ims, call_data); case XIM_PREEDIT_CARET: return _Xi18nPreeditCaretCallback (ims, call_data); case XIM_PREEDIT_DONE: return _Xi18nPreeditDoneCallback (ims, call_data); case XIM_STATUS_START: return _Xi18nStatusStartCallback (ims, call_data); case XIM_STATUS_DRAW: return _Xi18nStatusDrawCallback (ims, call_data); case XIM_STATUS_DONE: return _Xi18nStatusDoneCallback (ims, call_data); case XIM_STR_CONVERSION: return _Xi18nStringConversionCallback (ims, call_data); } /*endswitch*/ return False; } /* preeditStart and preeditEnd are used only for Dynamic Event Flow. */ static int xi18n_preeditStart (XIMS ims, XPointer xp) { IMProtocol *call_data = (IMProtocol *)xp; Xi18n i18n_core = ims->protocol; IMPreeditStateStruct *preedit_state = (IMPreeditStateStruct *) &call_data->preedit_state; long mask; int on_key_num = i18n_core->address.on_keys.count_keys; int off_key_num = i18n_core->address.off_keys.count_keys; if (on_key_num == 0 && off_key_num == 0) return False; /*endif*/ if (i18n_core->address.imvalue_mask & I18N_FILTERMASK) mask = i18n_core->address.filterevent_mask; else mask = DEFAULT_FILTER_MASK; /*endif*/ _Xi18nSetEventMask (ims, preedit_state->connect_id, preedit_state->connect_id, preedit_state->icid, mask, ~mask); return True; } static int xi18n_preeditEnd (XIMS ims, XPointer xp) { IMProtocol *call_data = (IMProtocol *)xp; Xi18n i18n_core = ims->protocol; int on_key_num = i18n_core->address.on_keys.count_keys; int off_key_num = i18n_core->address.off_keys.count_keys; IMPreeditStateStruct *preedit_state; preedit_state = (IMPreeditStateStruct *) &call_data->preedit_state; if (on_key_num == 0 && off_key_num == 0) return False; /*endif*/ _Xi18nSetEventMask (ims, preedit_state->connect_id, preedit_state->connect_id, preedit_state->icid, 0, 0); return True; } static int xi18n_syncXlib (XIMS ims, XPointer xp) { IMProtocol *call_data = (IMProtocol *)xp; Xi18n i18n_core = ims->protocol; IMSyncXlibStruct *sync_xlib; extern XimFrameRec sync_fr[]; FrameMgr fm; CARD16 connect_id = call_data->any.connect_id; int total_size; unsigned char *reply; sync_xlib = (IMSyncXlibStruct *) &call_data->sync_xlib; fm = FrameMgrInit (sync_fr, NULL, _Xi18nNeedSwap (i18n_core, connect_id)); total_size = FrameMgrGetTotalSize(fm); reply = (unsigned char *) malloc (total_size); if (!reply) { _Xi18nSendMessage (ims, connect_id, XIM_ERROR, 0, 0, 0); return False; } memset (reply, 0, total_size); FrameMgrSetBuffer (fm, reply); /* input input-method ID */ FrameMgrPutToken (fm, connect_id); /* input input-context ID */ FrameMgrPutToken (fm, sync_xlib->icid); _Xi18nSendMessage (ims, connect_id, XIM_SYNC, 0, reply, total_size); FrameMgrFree (fm); free(reply); return True; } nabi-1.0.0/IMdkit/i18nPtHdr.c0000644000175000017500000016761111655153252012431 00000000000000/****************************************************************** Copyright 1994, 1995 by Sun Microsystems, Inc. Copyright 1993, 1994 by Hewlett-Packard Company Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation, and that the name of Sun Microsystems, Inc. and Hewlett-Packard not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. Sun Microsystems, Inc. and Hewlett-Packard make no representations about the suitability of this software for any purpose. It is provided "as is" without express or implied warranty. SUN MICROSYSTEMS INC. AND HEWLETT-PACKARD COMPANY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SUN MICROSYSTEMS, INC. AND HEWLETT-PACKARD COMPANY BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. Author: Hidetoshi Tajima(tajima@Eng.Sun.COM) Sun Microsystems, Inc. This version tidied and debugged by Steve Underwood May 1999 ******************************************************************/ #ifdef HAVE_CONFIG_H # include "config.h" #endif #ifdef DEBUG extern int verbose; extern void DebugLog(int deflevel, int inplevel, char *fmt, ...); #endif #include "../src/debug.h" #include #include #include #include #ifndef NEED_EVENTS #define NEED_EVENTS #endif #include #undef NEED_EVENTS #include "FrameMgr.h" #include "IMdkit.h" #include "Xi18n.h" #include "XimFunc.h" extern Xi18nClient *_Xi18nFindClient (Xi18n, CARD16); static void DiscardQueue (XIMS ims, CARD16 connect_id) { Xi18n i18n_core = ims->protocol; Xi18nClient *client = (Xi18nClient *) _Xi18nFindClient (i18n_core, connect_id); if (client != NULL) { client->sync = False; while (client->pending != NULL) { XIMPending* pending = client->pending; client->pending = pending->next; XFree(pending->p); XFree(pending); } } } static void DiscardAllQueue(XIMS ims) { Xi18n i18n_core = ims->protocol; Xi18nClient* client = i18n_core->address.clients; while (client != NULL) { if (client->sync) { DiscardQueue(ims, client->connect_id); } client = client->next; } } static void GetProtocolVersion (CARD16 client_major, CARD16 client_minor, CARD16 *server_major, CARD16 *server_minor) { *server_major = client_major; *server_minor = client_minor; } static void ConnectMessageProc (XIMS ims, IMProtocol *call_data, unsigned char *p) { Xi18n i18n_core = ims->protocol; FrameMgr fm; extern XimFrameRec connect_fr[], connect_reply_fr[]; register int total_size; CARD16 server_major_version, server_minor_version; unsigned char *reply = NULL; IMConnectStruct *imconnect = (IMConnectStruct*) &call_data->imconnect; CARD16 connect_id = call_data->any.connect_id; fm = FrameMgrInit (connect_fr, (char *) p, _Xi18nNeedSwap (i18n_core, connect_id)); /* get data */ FrameMgrGetToken (fm, imconnect->byte_order); FrameMgrGetToken (fm, imconnect->major_version); FrameMgrGetToken (fm, imconnect->minor_version); FrameMgrFree (fm); GetProtocolVersion (imconnect->major_version, imconnect->minor_version, &server_major_version, &server_minor_version); #ifdef PROTOCOL_RICH if (i18n_core->address.improto) { if (!(i18n_core->address.improto(ims, call_data))) return; /*endif*/ } /*endif*/ #endif /* PROTOCOL_RICH */ fm = FrameMgrInit (connect_reply_fr, NULL, _Xi18nNeedSwap (i18n_core, connect_id)); total_size = FrameMgrGetTotalSize (fm); reply = (unsigned char *) malloc (total_size); if (!reply) { _Xi18nSendMessage (ims, connect_id, XIM_ERROR, 0, 0, 0); return; } /*endif*/ memset (reply, 0, total_size); FrameMgrSetBuffer (fm, reply); FrameMgrPutToken (fm, server_major_version); FrameMgrPutToken (fm, server_minor_version); _Xi18nSendMessage (ims, connect_id, XIM_CONNECT_REPLY, 0, reply, total_size); FrameMgrFree (fm); free (reply); } static void DisConnectMessageProc (XIMS ims, IMProtocol *call_data) { Xi18n i18n_core = ims->protocol; unsigned char *reply = NULL; CARD16 connect_id = call_data->any.connect_id; #ifdef PROTOCOL_RICH if (i18n_core->address.improto) { if (!(i18n_core->address.improto (ims, call_data))) return; /*endif*/ } /*endif*/ #endif /* PROTOCOL_RICH */ _Xi18nSendMessage (ims, connect_id, XIM_DISCONNECT_REPLY, 0, reply, 0); i18n_core->methods.disconnect (ims, connect_id); } static void OpenMessageProc(XIMS ims, IMProtocol *call_data, unsigned char *p) { Xi18n i18n_core = ims->protocol; FrameMgr fm; extern XimFrameRec open_fr[]; extern XimFrameRec open_reply_fr[]; unsigned char *reply = NULL; int str_size; register int i, total_size; CARD16 connect_id = call_data->any.connect_id; int str_length; char *name; IMOpenStruct *imopen = (IMOpenStruct *) &call_data->imopen; fm = FrameMgrInit (open_fr, (char *) p, _Xi18nNeedSwap (i18n_core, connect_id)); /* get data */ FrameMgrGetToken (fm, str_length); FrameMgrSetSize (fm, str_length); FrameMgrGetToken (fm, name); imopen->lang.length = str_length; imopen->lang.name = malloc (str_length + 1); strncpy (imopen->lang.name, name, str_length); imopen->lang.name[str_length] = (char) 0; FrameMgrFree (fm); if (i18n_core->address.improto) { if (!(i18n_core->address.improto(ims, call_data))) return; /*endif*/ } /*endif*/ if ((i18n_core->address.imvalue_mask & I18N_ON_KEYS) || (i18n_core->address.imvalue_mask & I18N_OFF_KEYS)) { _Xi18nSendTriggerKey (ims, connect_id); } /*endif*/ free (imopen->lang.name); fm = FrameMgrInit (open_reply_fr, NULL, _Xi18nNeedSwap (i18n_core, connect_id)); /* set iteration count for list of imattr */ FrameMgrSetIterCount (fm, i18n_core->address.im_attr_num); /* set length of BARRAY item in ximattr_fr */ for (i = 0; i < i18n_core->address.im_attr_num; i++) { str_size = strlen (i18n_core->address.xim_attr[i].name); FrameMgrSetSize (fm, str_size); } /*endfor*/ /* set iteration count for list of icattr */ FrameMgrSetIterCount (fm, i18n_core->address.ic_attr_num); /* set length of BARRAY item in xicattr_fr */ for (i = 0; i < i18n_core->address.ic_attr_num; i++) { str_size = strlen (i18n_core->address.xic_attr[i].name); FrameMgrSetSize (fm, str_size); } /*endfor*/ total_size = FrameMgrGetTotalSize (fm); reply = (unsigned char *) malloc (total_size); if (!reply) { _Xi18nSendMessage (ims, connect_id, XIM_ERROR, 0, 0, 0); return; } /*endif*/ memset (reply, 0, total_size); FrameMgrSetBuffer (fm, reply); /* input input-method ID */ FrameMgrPutToken (fm, connect_id); for (i = 0; i < i18n_core->address.im_attr_num; i++) { str_size = FrameMgrGetSize (fm); FrameMgrPutToken (fm, i18n_core->address.xim_attr[i].attribute_id); FrameMgrPutToken (fm, i18n_core->address.xim_attr[i].type); FrameMgrPutToken (fm, str_size); FrameMgrPutToken (fm, i18n_core->address.xim_attr[i].name); } /*endfor*/ for (i = 0; i < i18n_core->address.ic_attr_num; i++) { str_size = FrameMgrGetSize (fm); FrameMgrPutToken (fm, i18n_core->address.xic_attr[i].attribute_id); FrameMgrPutToken (fm, i18n_core->address.xic_attr[i].type); FrameMgrPutToken (fm, str_size); FrameMgrPutToken (fm, i18n_core->address.xic_attr[i].name); } /*endfor*/ _Xi18nSendMessage (ims, connect_id, XIM_OPEN_REPLY, 0, reply, total_size); FrameMgrFree (fm); free (reply); } static void CloseMessageProc (XIMS ims, IMProtocol *call_data, unsigned char *p) { Xi18n i18n_core = ims->protocol; FrameMgr fm; extern XimFrameRec close_fr[]; extern XimFrameRec close_reply_fr[]; unsigned char *reply = NULL; register int total_size; CARD16 connect_id = call_data->any.connect_id; CARD16 input_method_ID; fm = FrameMgrInit (close_fr, (char *) p, _Xi18nNeedSwap (i18n_core, connect_id)); FrameMgrGetToken (fm, input_method_ID); FrameMgrFree (fm); if (i18n_core->address.improto) { if (!(i18n_core->address.improto (ims, call_data))) return; /*endif*/ } /*endif*/ fm = FrameMgrInit (close_reply_fr, NULL, _Xi18nNeedSwap (i18n_core, connect_id)); total_size = FrameMgrGetTotalSize (fm); reply = (unsigned char *) malloc (total_size); if (!reply) { _Xi18nSendMessage (ims, connect_id, XIM_ERROR, 0, 0, 0); return; } /*endif*/ memset (reply, 0, total_size); FrameMgrSetBuffer (fm, reply); FrameMgrPutToken (fm, input_method_ID); _Xi18nSendMessage (ims, connect_id, XIM_CLOSE_REPLY, 0, reply, total_size); FrameMgrFree (fm); free (reply); } static XIMExt *MakeExtensionList (Xi18n i18n_core, XIMStr *lib_extension, int number, int *reply_number) { XIMExt *ext_list; XIMExt *im_ext = (XIMExt *) i18n_core->address.extension; int im_ext_len = i18n_core->address.ext_num; int i; int j; *reply_number = 0; if (number == 0) { /* query all extensions */ *reply_number = im_ext_len; } else { for (i = 0; i < im_ext_len; i++) { for (j = 0; j < (int) number; j++) { if (strcmp (lib_extension[j].name, im_ext[i].name) == 0) { (*reply_number)++; break; } /*endif*/ } /*endfor*/ } /*endfor*/ } /*endif*/ if (!(*reply_number)) return NULL; /*endif*/ ext_list = (XIMExt *) malloc (sizeof (XIMExt)*(*reply_number)); if (!ext_list) return NULL; /*endif*/ memset (ext_list, 0, sizeof (XIMExt)*(*reply_number)); if (number == 0) { /* query all extensions */ for (i = 0; i < im_ext_len; i++) { ext_list[i].major_opcode = im_ext[i].major_opcode; ext_list[i].minor_opcode = im_ext[i].minor_opcode; ext_list[i].length = im_ext[i].length; ext_list[i].name = malloc (im_ext[i].length + 1); strcpy (ext_list[i].name, im_ext[i].name); } /*endfor*/ } else { int n = 0; for (i = 0; i < im_ext_len; i++) { for (j = 0; j < (int)number; j++) { if (strcmp (lib_extension[j].name, im_ext[i].name) == 0) { ext_list[n].major_opcode = im_ext[i].major_opcode; ext_list[n].minor_opcode = im_ext[i].minor_opcode; ext_list[n].length = im_ext[i].length; ext_list[n].name = malloc (im_ext[i].length + 1); strcpy (ext_list[n].name, im_ext[i].name); n++; break; } /*endif*/ } /*endfor*/ } /*endfor*/ } /*endif*/ return ext_list; } static void QueryExtensionMessageProc (XIMS ims, IMProtocol *call_data, unsigned char *p) { Xi18n i18n_core = ims->protocol; FrameMgr fm; FmStatus status; extern XimFrameRec query_extension_fr[]; extern XimFrameRec query_extension_reply_fr[]; unsigned char *reply = NULL; int str_size; register int i; register int number; register int total_size; int byte_length; int reply_number = 0; XIMExt *ext_list; IMQueryExtensionStruct *query_ext = (IMQueryExtensionStruct *) &call_data->queryext; CARD16 connect_id = call_data->any.connect_id; CARD16 input_method_ID; fm = FrameMgrInit (query_extension_fr, (char *) p, _Xi18nNeedSwap (i18n_core, connect_id)); FrameMgrGetToken (fm, input_method_ID); FrameMgrGetToken (fm, byte_length); query_ext->extension = (XIMStr *) malloc (sizeof (XIMStr)*10); memset (query_ext->extension, 0, sizeof (XIMStr)*10); number = 0; while (FrameMgrIsIterLoopEnd (fm, &status) == False) { char *name; int str_length; FrameMgrGetToken (fm, str_length); FrameMgrSetSize (fm, str_length); query_ext->extension[number].length = str_length; FrameMgrGetToken (fm, name); query_ext->extension[number].name = malloc (str_length + 1); strncpy (query_ext->extension[number].name, name, str_length); query_ext->extension[number].name[str_length] = (char) 0; number++; } /*endwhile*/ query_ext->number = number; #ifdef PROTOCOL_RICH if (i18n_core->address.improto) { if (!(i18n_core->address.improto(ims, call_data))) return; /*endif*/ } /*endif*/ #endif /* PROTOCOL_RICH */ FrameMgrFree (fm); ext_list = MakeExtensionList (i18n_core, query_ext->extension, number, &reply_number); for (i = 0; i < number; i++) free (query_ext->extension[i].name); /*endfor*/ free (query_ext->extension); fm = FrameMgrInit (query_extension_reply_fr, NULL, _Xi18nNeedSwap (i18n_core, connect_id)); /* set iteration count for list of extensions */ FrameMgrSetIterCount (fm, reply_number); /* set length of BARRAY item in ext_fr */ for (i = 0; i < reply_number; i++) { str_size = strlen (ext_list[i].name); FrameMgrSetSize (fm, str_size); } /*endfor*/ total_size = FrameMgrGetTotalSize (fm); reply = (unsigned char *) malloc (total_size); if (!reply) { _Xi18nSendMessage (ims, connect_id, XIM_ERROR, 0, 0, 0); return; } /*endif*/ memset (reply, 0, total_size); FrameMgrSetBuffer (fm, reply); FrameMgrPutToken (fm, input_method_ID); for (i = 0; i < reply_number; i++) { str_size = FrameMgrGetSize (fm); FrameMgrPutToken (fm, ext_list[i].major_opcode); FrameMgrPutToken (fm, ext_list[i].minor_opcode); FrameMgrPutToken (fm, str_size); FrameMgrPutToken (fm, ext_list[i].name); } /*endfor*/ _Xi18nSendMessage (ims, connect_id, XIM_QUERY_EXTENSION_REPLY, 0, reply, total_size); FrameMgrFree (fm); free (reply); for (i = 0; i < reply_number; i++) free (ext_list[i].name); /*endfor*/ free (ext_list); } static void SyncReplyMessageProc (XIMS ims, IMProtocol *call_data, unsigned char *p) { Xi18n i18n_core = ims->protocol; FrameMgr fm; extern XimFrameRec sync_reply_fr[]; CARD16 connect_id = call_data->any.connect_id; Xi18nClient *client; CARD16 input_method_ID; CARD16 input_context_ID; client = (Xi18nClient *)_Xi18nFindClient (i18n_core, connect_id); fm = FrameMgrInit (sync_reply_fr, (char *) p, _Xi18nNeedSwap (i18n_core, connect_id)); FrameMgrGetToken (fm, input_method_ID); FrameMgrGetToken (fm, input_context_ID); FrameMgrFree (fm); client->sync = False; if (ims->sync == True) { ims->sync = False; if (i18n_core->address.improto) { call_data->sync_xlib.major_code = XIM_SYNC_REPLY; call_data->sync_xlib.minor_code = 0; call_data->sync_xlib.connect_id = input_method_ID; call_data->sync_xlib.icid = input_context_ID; i18n_core->address.improto(ims, call_data); } } } static void GetIMValueFromName (Xi18n i18n_core, CARD16 connect_id, char *buf, char *name, int *length) { register int i; if (strcmp (name, XNQueryInputStyle) == 0) { XIMStyles *styles = (XIMStyles *) &i18n_core->address.input_styles; *length = sizeof (CARD16)*2; /* count_styles, unused */ *length += styles->count_styles*sizeof (CARD32); if (buf != NULL) { FrameMgr fm; extern XimFrameRec input_styles_fr[]; unsigned char *data = NULL; int total_size; fm = FrameMgrInit (input_styles_fr, NULL, _Xi18nNeedSwap (i18n_core, connect_id)); /* set iteration count for list of input_style */ FrameMgrSetIterCount (fm, styles->count_styles); total_size = FrameMgrGetTotalSize (fm); data = (unsigned char *) malloc (total_size); if (!data) return; /*endif*/ memset (data, 0, total_size); FrameMgrSetBuffer (fm, data); FrameMgrPutToken (fm, styles->count_styles); for (i = 0; i < (int) styles->count_styles; i++) FrameMgrPutToken (fm, styles->supported_styles[i]); /*endfor*/ memmove (buf, data, total_size); FrameMgrFree (fm); free(data); } /*endif*/ } /*endif*/ else if (strcmp (name, XNQueryIMValuesList) == 0) { FrameMgr fm; extern XimFrameRec values_list_fr[]; unsigned char *data = NULL; unsigned int i; int str_size; int total_size; XIMAttr *im_attr; unsigned int count_values; count_values = i18n_core->address.im_attr_num; im_attr = i18n_core->address.xim_attr; fm = FrameMgrInit (values_list_fr, NULL, _Xi18nNeedSwap (i18n_core, connect_id)); /* set iteration count for ic values list */ FrameMgrSetIterCount (fm, count_values); /* set length of BARRAY item in ic_values_list_fr */ for (i = 0; i < count_values; i++) { str_size = im_attr[i].length; FrameMgrSetSize (fm, str_size); } total_size = FrameMgrGetTotalSize (fm); *length = total_size; if (buf != NULL) { data = (unsigned char *) malloc (total_size); if (data == NULL) return; memset (data, 0, total_size); FrameMgrSetBuffer (fm, data); FrameMgrPutToken (fm, count_values); for (i = 0; i < count_values; i++) { str_size = FrameMgrGetSize (fm); FrameMgrPutToken (fm, str_size); FrameMgrPutToken (fm, im_attr[i].name); } memmove (buf, data, total_size); FrameMgrFree (fm); free(data); } } else if (strcmp (name, XNQueryICValuesList) == 0) { FrameMgr fm; extern XimFrameRec values_list_fr[]; unsigned char *data = NULL; unsigned int i; int str_size; int total_size; XICAttr *ic_attr; unsigned int count_values; count_values = i18n_core->address.ic_attr_num; ic_attr = i18n_core->address.xic_attr; fm = FrameMgrInit (values_list_fr, NULL, _Xi18nNeedSwap (i18n_core, connect_id)); /* set iteration count for ic values list */ FrameMgrSetIterCount (fm, count_values); /* set length of BARRAY item in ic_values_list_fr */ for (i = 0; i < count_values; i++) { str_size = ic_attr[i].length; FrameMgrSetSize (fm, str_size); } total_size = FrameMgrGetTotalSize (fm); *length = total_size; if (buf != NULL) { data = (unsigned char *) malloc (total_size); if (data == NULL) return; memset (data, 0, total_size); FrameMgrSetBuffer (fm, data); FrameMgrPutToken (fm, count_values); for (i = 0; i < count_values; i++) { str_size = FrameMgrGetSize (fm); FrameMgrPutToken (fm, str_size); FrameMgrPutToken (fm, ic_attr[i].name); } memmove (buf, data, total_size); free(data); } FrameMgrFree (fm); } } static XIMAttribute *MakeIMAttributeList (Xi18n i18n_core, CARD16 connect_id, CARD16 *list, int *number, int *length) { XIMAttribute *attrib_list; int list_num; XIMAttr *attr = i18n_core->address.xim_attr; int list_len = i18n_core->address.im_attr_num; register int i; register int j; int value_length; int number_ret = 0; *length = 0; list_num = 0; for (i = 0; i < *number; i++) { for (j = 0; j < list_len; j++) { if (attr[j].attribute_id == list[i]) { list_num++; break; } /*endif*/ } /*endfor*/ } /*endfor*/ attrib_list = (XIMAttribute *) malloc (sizeof (XIMAttribute)*list_num); if (!attrib_list) return NULL; /*endif*/ memset (attrib_list, 0, sizeof (XIMAttribute)*list_num); number_ret = list_num; list_num = 0; for (i = 0; i < *number; i++) { for (j = 0; j < list_len; j++) { if (attr[j].attribute_id == list[i]) { attrib_list[list_num].attribute_id = attr[j].attribute_id; attrib_list[list_num].name_length = attr[j].length; attrib_list[list_num].name = attr[j].name; attrib_list[list_num].type = attr[j].type; GetIMValueFromName (i18n_core, connect_id, NULL, attr[j].name, &value_length); attrib_list[list_num].value_length = value_length; attrib_list[list_num].value = (void *) malloc (value_length); memset(attrib_list[list_num].value, 0, value_length); GetIMValueFromName (i18n_core, connect_id, attrib_list[list_num].value, attr[j].name, &value_length); *length += sizeof (CARD16)*2; *length += value_length; *length += IMPAD (value_length); list_num++; break; } /*endif*/ } /*endfor*/ } /*endfor*/ *number = number_ret; return attrib_list; } static void GetIMValuesMessageProc (XIMS ims, IMProtocol *call_data, unsigned char *p) { Xi18n i18n_core = ims->protocol; FrameMgr fm; FmStatus status; extern XimFrameRec get_im_values_fr[]; extern XimFrameRec get_im_values_reply_fr[]; CARD16 byte_length; int list_len, total_size; unsigned char *reply = NULL; int iter_count; register int i; register int j; int number; CARD16 *im_attrID_list; char **name_list; CARD16 name_number; XIMAttribute *im_attribute_list; IMGetIMValuesStruct *getim = (IMGetIMValuesStruct *)&call_data->getim; CARD16 connect_id = call_data->any.connect_id; CARD16 input_method_ID; /* create FrameMgr */ fm = FrameMgrInit (get_im_values_fr, (char *) p, _Xi18nNeedSwap (i18n_core, connect_id)); FrameMgrGetToken (fm, input_method_ID); FrameMgrGetToken (fm, byte_length); im_attrID_list = (CARD16 *) malloc (sizeof (CARD16)*20); memset (im_attrID_list, 0, sizeof (CARD16)*20); name_list = (char **)malloc(sizeof(char *) * 20); memset(name_list, 0, sizeof(char *) * 20); number = 0; while (FrameMgrIsIterLoopEnd (fm, &status) == False) { FrameMgrGetToken (fm, im_attrID_list[number]); number++; } FrameMgrFree (fm); name_number = 0; for (i = 0; i < number; i++) { for (j = 0; j < i18n_core->address.im_attr_num; j++) { if (i18n_core->address.xim_attr[j].attribute_id == im_attrID_list[i]) { name_list[name_number++] = i18n_core->address.xim_attr[j].name; break; } } } getim->number = name_number; getim->im_attr_list = name_list; #ifdef PROTOCOL_RICH if (i18n_core->address.improto) { if (!(i18n_core->address.improto (ims, call_data))) return; } #endif /* PROTOCOL_RICH */ free (name_list); im_attribute_list = MakeIMAttributeList (i18n_core, connect_id, im_attrID_list, &number, &list_len); if (im_attrID_list) free (im_attrID_list); /*endif*/ fm = FrameMgrInit (get_im_values_reply_fr, NULL, _Xi18nNeedSwap (i18n_core, connect_id)); iter_count = number; /* set iteration count for list of im_attribute */ FrameMgrSetIterCount (fm, iter_count); /* set length of BARRAY item in ximattribute_fr */ for (i = 0; i < iter_count; i++) FrameMgrSetSize (fm, im_attribute_list[i].value_length); /*endfor*/ total_size = FrameMgrGetTotalSize (fm); reply = (unsigned char *) malloc (total_size); if (!reply) { _Xi18nSendMessage (ims, connect_id, XIM_ERROR, 0, 0, 0); return; } /*endif*/ memset (reply, 0, total_size); FrameMgrSetBuffer (fm, reply); FrameMgrPutToken (fm, input_method_ID); for (i = 0; i < iter_count; i++) { FrameMgrPutToken (fm, im_attribute_list[i].attribute_id); FrameMgrPutToken (fm, im_attribute_list[i].value_length); FrameMgrPutToken (fm, im_attribute_list[i].value); } /*endfor*/ _Xi18nSendMessage (ims, connect_id, XIM_GET_IM_VALUES_REPLY, 0, reply, total_size); FrameMgrFree (fm); free (reply); for (i = 0; i < iter_count; i++) free (im_attribute_list[i].value); free (im_attribute_list); } static void CreateICMessageProc (XIMS ims, IMProtocol *call_data, unsigned char *p) { _Xi18nChangeIC (ims, call_data, p, True); } static void SetICValuesMessageProc (XIMS ims, IMProtocol *call_data, unsigned char *p) { _Xi18nChangeIC (ims, call_data, p, False); } static void GetICValuesMessageProc (XIMS ims, IMProtocol *call_data, unsigned char *p) { _Xi18nGetIC (ims, call_data, p); } static void SetICFocusMessageProc (XIMS ims, IMProtocol *call_data, unsigned char *p) { Xi18n i18n_core = ims->protocol; FrameMgr fm; extern XimFrameRec set_ic_focus_fr[]; IMChangeFocusStruct *setfocus; CARD16 connect_id = call_data->any.connect_id; CARD16 input_method_ID; /* some buggy xim clients do not send XIM_SYNC_REPLY for synchronous * events. In such case, xim server is waiting for XIM_SYNC_REPLY * forever. So the xim server is blocked to waiting sync reply. * It prevents further input. * Usually it happens when a client calls XSetICFocus() with another ic * before passing an event to XFilterEvent(), where the event is need * by the old focused ic to sync its state. * To avoid such problem, remove the whole clients queue and set them * as asynchronous. * * See: * http://kldp.net/tracker/index.php?func=detail&aid=300802&group_id=275&atid=100275 * http://bugs.freedesktop.org/show_bug.cgi?id=7869 */ nabi_log(6, "set focus: discard all client queue: %d\n", connect_id); DiscardAllQueue(ims); setfocus = (IMChangeFocusStruct *) &call_data->changefocus; fm = FrameMgrInit (set_ic_focus_fr, (char *) p, _Xi18nNeedSwap (i18n_core, connect_id)); /* get data */ FrameMgrGetToken (fm, input_method_ID); FrameMgrGetToken (fm, setfocus->icid); FrameMgrFree (fm); if (i18n_core->address.improto) { if (!(i18n_core->address.improto (ims, call_data))) return; /*endif*/ } /*endif*/ } static void UnsetICFocusMessageProc (XIMS ims, IMProtocol *call_data, unsigned char *p) { Xi18n i18n_core = ims->protocol; FrameMgr fm; extern XimFrameRec unset_ic_focus_fr[]; IMChangeFocusStruct *unsetfocus; CARD16 connect_id = call_data->any.connect_id; CARD16 input_method_ID; Xi18nClient *client = _Xi18nFindClient (i18n_core, connect_id); /* some buggy clients unset focus ic before the ic answer the sync reply, * so the xim server may be blocked to waiting sync reply. To avoid * this problem, remove the client queue and set it asynchronous * * See: SetICFocusMessageProc */ if (client != NULL && client->sync) { nabi_log(6, "unset focus: discard client queue: %d\n", connect_id); DiscardQueue(ims, client->connect_id); } unsetfocus = (IMChangeFocusStruct *) &call_data->changefocus; fm = FrameMgrInit (unset_ic_focus_fr, (char *) p, _Xi18nNeedSwap (i18n_core, connect_id)); /* get data */ FrameMgrGetToken (fm, input_method_ID); FrameMgrGetToken (fm, unsetfocus->icid); FrameMgrFree (fm); if (i18n_core->address.improto) { if (!(i18n_core->address.improto (ims, call_data))) return; /*endif*/ } /*endif*/ } static void DestroyICMessageProc (XIMS ims, IMProtocol *call_data, unsigned char *p) { Xi18n i18n_core = ims->protocol; FrameMgr fm; extern XimFrameRec destroy_ic_fr[]; extern XimFrameRec destroy_ic_reply_fr[]; register int total_size; unsigned char *reply = NULL; IMDestroyICStruct *destroy = (IMDestroyICStruct *) &call_data->destroyic; CARD16 connect_id = call_data->any.connect_id; CARD16 input_method_ID; fm = FrameMgrInit (destroy_ic_fr, (char *) p, _Xi18nNeedSwap (i18n_core, connect_id)); /* get data */ FrameMgrGetToken (fm, input_method_ID); FrameMgrGetToken (fm, destroy->icid); FrameMgrFree (fm); if (i18n_core->address.improto) { if (!(i18n_core->address.improto (ims, call_data))) return; /*endif*/ } /*endif*/ fm = FrameMgrInit (destroy_ic_reply_fr, NULL, _Xi18nNeedSwap (i18n_core, connect_id)); total_size = FrameMgrGetTotalSize (fm); reply = (unsigned char *) malloc (total_size); if (!reply) { _Xi18nSendMessage (ims, connect_id, XIM_ERROR, 0, 0, 0); return; } /*endif*/ memset (reply, 0, total_size); FrameMgrSetBuffer (fm, reply); FrameMgrPutToken (fm, input_method_ID); FrameMgrPutToken (fm, destroy->icid); _Xi18nSendMessage (ims, connect_id, XIM_DESTROY_IC_REPLY, 0, reply, total_size); free (reply); FrameMgrFree (fm); } static void ResetICMessageProc (XIMS ims, IMProtocol *call_data, unsigned char *p) { Xi18n i18n_core = ims->protocol; FrameMgr fm; extern XimFrameRec reset_ic_fr[]; extern XimFrameRec reset_ic_reply_fr[]; register int total_size; unsigned char *reply = NULL; IMResetICStruct *resetic = (IMResetICStruct *) &call_data->resetic; CARD16 connect_id = call_data->any.connect_id; CARD16 input_method_ID; fm = FrameMgrInit (reset_ic_fr, (char *) p, _Xi18nNeedSwap (i18n_core, connect_id)); /* get data */ FrameMgrGetToken (fm, input_method_ID); FrameMgrGetToken (fm, resetic->icid); FrameMgrFree (fm); if (i18n_core->address.improto) { if (!(i18n_core->address.improto(ims, call_data))) return; /*endif*/ } /*endif*/ /* create FrameMgr */ fm = FrameMgrInit (reset_ic_reply_fr, NULL, _Xi18nNeedSwap (i18n_core, connect_id)); /* set length of STRING8 */ FrameMgrSetSize (fm, resetic->length); total_size = FrameMgrGetTotalSize (fm); reply = (unsigned char *) malloc (total_size); if (!reply) { _Xi18nSendMessage (ims, connect_id, XIM_ERROR, 0, 0, 0); return; } /*endif*/ memset (reply, 0, total_size); FrameMgrSetBuffer (fm, reply); FrameMgrPutToken (fm, input_method_ID); FrameMgrPutToken (fm, resetic->icid); FrameMgrPutToken(fm, resetic->length); FrameMgrPutToken (fm, resetic->commit_string); _Xi18nSendMessage (ims, connect_id, XIM_RESET_IC_REPLY, 0, reply, total_size); FrameMgrFree (fm); if (resetic->commit_string) XFree(resetic->commit_string); free (reply); } /* For byte swapping */ #define Swap16(n) \ (((n) << 8 & 0xFF00) | \ ((n) >> 8 & 0xFF) \ ) #define Swap32(n) \ (((n) << 24 & 0xFF000000) | \ ((n) << 8 & 0xFF0000) | \ ((n) >> 8 & 0xFF00) | \ ((n) >> 24 & 0xFF) \ ) #define Swap64(n) \ (((n) << 56 & 0xFF00000000000000) | \ ((n) << 40 & 0xFF000000000000) | \ ((n) << 24 & 0xFF0000000000) | \ ((n) << 8 & 0xFF00000000) | \ ((n) >> 8 & 0xFF000000) | \ ((n) >> 24 & 0xFF0000) | \ ((n) >> 40 & 0xFF00) | \ ((n) >> 56 & 0xFF) \ ) static int WireEventToEvent (Xi18n i18n_core, xEvent *event, CARD16 serial, XEvent *ev, Bool need_swap) { ev->xany.serial = event->u.u.sequenceNumber & ((unsigned long) 0xFFFF); ev->xany.serial |= serial << 16; ev->xany.send_event = False; ev->xany.display = i18n_core->address.dpy; switch (ev->type = event->u.u.type & 0x7F) { case KeyPress: case KeyRelease: if (need_swap) { ((XKeyEvent *) ev)->keycode = event->u.u.detail; ((XKeyEvent *) ev)->window = Swap32(event->u.keyButtonPointer.event); ((XKeyEvent *) ev)->state = Swap16(event->u.keyButtonPointer.state); ((XKeyEvent *) ev)->time = Swap32(event->u.keyButtonPointer.time); ((XKeyEvent *) ev)->root = Swap32(event->u.keyButtonPointer.root); ((XKeyEvent *) ev)->x = Swap16(event->u.keyButtonPointer.eventX); ((XKeyEvent *) ev)->y = Swap16(event->u.keyButtonPointer.eventY); ((XKeyEvent *) ev)->x_root = 0; ((XKeyEvent *) ev)->y_root = 0; } else { ((XKeyEvent *) ev)->keycode = event->u.u.detail; ((XKeyEvent *) ev)->window = event->u.keyButtonPointer.event; ((XKeyEvent *) ev)->state = event->u.keyButtonPointer.state; ((XKeyEvent *) ev)->time = event->u.keyButtonPointer.time; ((XKeyEvent *) ev)->root = event->u.keyButtonPointer.root; ((XKeyEvent *) ev)->x = event->u.keyButtonPointer.eventX; ((XKeyEvent *) ev)->y = event->u.keyButtonPointer.eventY; ((XKeyEvent *) ev)->x_root = 0; ((XKeyEvent *) ev)->y_root = 0; } return True; } return False; } static void ForwardEventMessageProc (XIMS ims, IMProtocol *call_data, unsigned char *p) { Xi18n i18n_core = ims->protocol; FrameMgr fm; extern XimFrameRec forward_event_fr[]; xEvent wire_event; IMForwardEventStruct *forward = (IMForwardEventStruct*) &call_data->forwardevent; CARD16 connect_id = call_data->any.connect_id; CARD16 input_method_ID; Bool need_swap; need_swap = _Xi18nNeedSwap (i18n_core, connect_id); fm = FrameMgrInit (forward_event_fr, (char *) p, need_swap); /* get data */ FrameMgrGetToken (fm, input_method_ID); FrameMgrGetToken (fm, forward->icid); FrameMgrGetToken (fm, forward->sync_bit); FrameMgrGetToken (fm, forward->serial_number); p += sizeof (CARD16)*4; memmove (&wire_event, p, sizeof (xEvent)); FrameMgrFree (fm); if (WireEventToEvent (i18n_core, &wire_event, forward->serial_number, &forward->event, need_swap) == True) { if (i18n_core->address.improto) { if (!(i18n_core->address.improto(ims, call_data))) return; /*endif*/ } /*endif*/ } /*endif*/ } static void ExtForwardKeyEventMessageProc (XIMS ims, IMProtocol *call_data, unsigned char *p) { Xi18n i18n_core = ims->protocol; FrameMgr fm; extern XimFrameRec ext_forward_keyevent_fr[]; CARD8 type, keycode; CARD16 state; CARD32 ev_time, window; IMForwardEventStruct *forward = (IMForwardEventStruct *) &call_data->forwardevent; XEvent *ev = (XEvent *) &forward->event; CARD16 connect_id = call_data->any.connect_id; CARD16 input_method_ID; fm = FrameMgrInit (ext_forward_keyevent_fr, (char *) p, _Xi18nNeedSwap (i18n_core, connect_id)); /* get data */ FrameMgrGetToken (fm, input_method_ID); FrameMgrGetToken (fm, forward->icid); FrameMgrGetToken (fm, forward->sync_bit); FrameMgrGetToken (fm, forward->serial_number); FrameMgrGetToken (fm, type); FrameMgrGetToken (fm, keycode); FrameMgrGetToken (fm, state); FrameMgrGetToken (fm, ev_time); FrameMgrGetToken (fm, window); FrameMgrFree (fm); if (type != KeyPress) { _Xi18nSendMessage (ims, connect_id, XIM_ERROR, 0, 0, 0); return; } /*endif*/ /* make a faked keypress event */ ev->type = (int)type; ev->xany.send_event = True; ev->xany.display = i18n_core->address.dpy; ev->xany.serial = (unsigned long) forward->serial_number; ((XKeyEvent *) ev)->keycode = (unsigned int) keycode; ((XKeyEvent *) ev)->state = (unsigned int) state; ((XKeyEvent *) ev)->time = (Time) ev_time; ((XKeyEvent *) ev)->window = (Window) window; ((XKeyEvent *) ev)->root = DefaultRootWindow (ev->xany.display); ((XKeyEvent *) ev)->x = 0; ((XKeyEvent *) ev)->y = 0; ((XKeyEvent *) ev)->x_root = 0; ((XKeyEvent *) ev)->y_root = 0; if (i18n_core->address.improto) { if (!(i18n_core->address.improto (ims, call_data))) return; /*endif*/ } /*endif*/ } static void ExtMoveMessageProc (XIMS ims, IMProtocol *call_data, unsigned char *p) { Xi18n i18n_core = ims->protocol; FrameMgr fm; extern XimFrameRec ext_move_fr[]; IMMoveStruct *extmove = (IMMoveStruct*) & call_data->extmove; CARD16 connect_id = call_data->any.connect_id; CARD16 input_method_ID; fm = FrameMgrInit (ext_move_fr, (char *) p, _Xi18nNeedSwap (i18n_core, connect_id)); /* get data */ FrameMgrGetToken (fm, input_method_ID); FrameMgrGetToken (fm, extmove->icid); FrameMgrGetToken (fm, extmove->x); FrameMgrGetToken (fm, extmove->y); FrameMgrFree (fm); if (i18n_core->address.improto) { if (!(i18n_core->address.improto (ims, call_data))) return; /*endif*/ } /*endif*/ } static void ExtensionMessageProc (XIMS ims, IMProtocol *call_data, unsigned char *p) { switch (call_data->any.minor_code) { case XIM_EXT_FORWARD_KEYEVENT: ExtForwardKeyEventMessageProc (ims, call_data, p); break; case XIM_EXT_MOVE: ExtMoveMessageProc (ims, call_data, p); break; } /*endswitch*/ } static void TriggerNotifyMessageProc (XIMS ims, IMProtocol *call_data, unsigned char *p) { Xi18n i18n_core = ims->protocol; FrameMgr fm; extern XimFrameRec trigger_notify_fr[], trigger_notify_reply_fr[]; register int total_size; unsigned char *reply = NULL; IMTriggerNotifyStruct *trigger = (IMTriggerNotifyStruct *) &call_data->triggernotify; CARD16 connect_id = call_data->any.connect_id; CARD16 input_method_ID; CARD32 flag; fm = FrameMgrInit (trigger_notify_fr, (char *) p, _Xi18nNeedSwap (i18n_core, connect_id)); /* get data */ FrameMgrGetToken (fm, input_method_ID); FrameMgrGetToken (fm, trigger->icid); FrameMgrGetToken (fm, trigger->flag); FrameMgrGetToken (fm, trigger->key_index); FrameMgrGetToken (fm, trigger->event_mask); /* In order to support Front End Method, this event_mask must be saved per clients so that it should be restored by an XIM_EXT_SET_EVENT_MASK call when preediting mode is reset to off. */ flag = trigger->flag; FrameMgrFree (fm); fm = FrameMgrInit (trigger_notify_reply_fr, NULL, _Xi18nNeedSwap (i18n_core, connect_id)); total_size = FrameMgrGetTotalSize (fm); reply = (unsigned char *) malloc (total_size); if (!reply) { _Xi18nSendMessage (ims, connect_id, XIM_ERROR, 0, 0, 0); return; } /*endif*/ memset (reply, 0, total_size); FrameMgrSetBuffer (fm, reply); FrameMgrPutToken (fm, input_method_ID); FrameMgrPutToken (fm, trigger->icid); /* NOTE: XIM_TRIGGER_NOTIFY_REPLY should be sent before XIM_SET_EVENT_MASK in case of XIM_TRIGGER_NOTIFY(flag == ON), while it should be sent after XIM_SET_EVENT_MASK in case of XIM_TRIGGER_NOTIFY(flag == OFF). */ if (flag == 0) { /* on key */ _Xi18nSendMessage (ims, connect_id, XIM_TRIGGER_NOTIFY_REPLY, 0, reply, total_size); IMPreeditStart (ims, (XPointer)call_data); } /*endif*/ if (i18n_core->address.improto) { if (!(i18n_core->address.improto(ims, call_data))) return; /*endif*/ } /*endif*/ if (flag == 1) { /* off key */ IMPreeditEnd (ims, (XPointer) call_data); _Xi18nSendMessage (ims, connect_id, XIM_TRIGGER_NOTIFY_REPLY, 0, reply, total_size); } /*endif*/ FrameMgrFree (fm); free (reply); } static INT16 ChooseEncoding (Xi18n i18n_core, IMEncodingNegotiationStruct *enc_nego) { Xi18nAddressRec *address = (Xi18nAddressRec *) & i18n_core->address; XIMEncodings *p; int i, j; int enc_index=0; p = (XIMEncodings *) &address->encoding_list; for (i = 0; i < (int) p->count_encodings; i++) { for (j = 0; j < (int) enc_nego->encoding_number; j++) { if (strcmp (p->supported_encodings[i], enc_nego->encoding[j].name) == 0) { enc_index = j; break; } /*endif*/ } /*endfor*/ } /*endfor*/ return (INT16) enc_index; #if 0 return (INT16) XIM_Default_Encoding_IDX; #endif } static void EncodingNegotiatonMessageProc (XIMS ims, IMProtocol *call_data, unsigned char *p) { Xi18n i18n_core = ims->protocol; FrameMgr fm; FmStatus status; CARD16 byte_length; extern XimFrameRec encoding_negotiation_fr[]; extern XimFrameRec encoding_negotiation_reply_fr[]; register int i, total_size; unsigned char *reply = NULL; IMEncodingNegotiationStruct *enc_nego = (IMEncodingNegotiationStruct *) &call_data->encodingnego; CARD16 connect_id = call_data->any.connect_id; CARD16 input_method_ID; fm = FrameMgrInit (encoding_negotiation_fr, (char *) p, _Xi18nNeedSwap (i18n_core, connect_id)); FrameMgrGetToken (fm, input_method_ID); /* get ENCODING STR field */ FrameMgrGetToken (fm, byte_length); if (byte_length > 0) { enc_nego->encoding = (XIMStr *) malloc (sizeof (XIMStr)*10); memset (enc_nego->encoding, 0, sizeof (XIMStr)*10); i = 0; while (FrameMgrIsIterLoopEnd (fm, &status) == False) { char *name; int str_length; FrameMgrGetToken (fm, str_length); FrameMgrSetSize (fm, str_length); enc_nego->encoding[i].length = str_length; FrameMgrGetToken (fm, name); enc_nego->encoding[i].name = malloc (str_length + 1); strncpy (enc_nego->encoding[i].name, name, str_length); enc_nego->encoding[i].name[str_length] = '\0'; i++; } /*endwhile*/ enc_nego->encoding_number = i; } /*endif*/ /* get ENCODING INFO field */ FrameMgrGetToken (fm, byte_length); if (byte_length > 0) { enc_nego->encodinginfo = (XIMStr *) malloc (sizeof (XIMStr)*10); memset (enc_nego->encoding, 0, sizeof (XIMStr)*10); i = 0; while (FrameMgrIsIterLoopEnd (fm, &status) == False) { char *name; int str_length; FrameMgrGetToken (fm, str_length); FrameMgrSetSize (fm, str_length); enc_nego->encodinginfo[i].length = str_length; FrameMgrGetToken (fm, name); enc_nego->encodinginfo[i].name = malloc (str_length + 1); strncpy (enc_nego->encodinginfo[i].name, name, str_length); enc_nego->encodinginfo[i].name[str_length] = '\0'; i++; } /*endwhile*/ enc_nego->encoding_info_number = i; } /*endif*/ enc_nego->enc_index = ChooseEncoding (i18n_core, enc_nego); enc_nego->category = 0; #ifdef PROTOCOL_RICH if (i18n_core->address.improto) { if (!(i18n_core->address.improto(ims, call_data))) return; /*endif*/ } /*endif*/ #endif /* PROTOCOL_RICH */ FrameMgrFree (fm); fm = FrameMgrInit (encoding_negotiation_reply_fr, NULL, _Xi18nNeedSwap (i18n_core, connect_id)); total_size = FrameMgrGetTotalSize (fm); reply = (unsigned char *) malloc (total_size); if (!reply) { _Xi18nSendMessage (ims, connect_id, XIM_ERROR, 0, 0, 0); return; } /*endif*/ memset (reply, 0, total_size); FrameMgrSetBuffer (fm, reply); FrameMgrPutToken (fm, input_method_ID); FrameMgrPutToken (fm, enc_nego->category); FrameMgrPutToken (fm, enc_nego->enc_index); _Xi18nSendMessage (ims, connect_id, XIM_ENCODING_NEGOTIATION_REPLY, 0, reply, total_size); free (reply); /* free data for encoding list */ if (enc_nego->encoding) { for (i = 0; i < (int) enc_nego->encoding_number; i++) free (enc_nego->encoding[i].name); /*endfor*/ free (enc_nego->encoding); } /*endif*/ if (enc_nego->encodinginfo) { for (i = 0; i < (int) enc_nego->encoding_info_number; i++) free (enc_nego->encodinginfo[i].name); /*endfor*/ free (enc_nego->encodinginfo); } /*endif*/ FrameMgrFree (fm); } void PreeditStartReplyMessageProc (XIMS ims, IMProtocol *call_data, unsigned char *p) { Xi18n i18n_core = ims->protocol; FrameMgr fm; extern XimFrameRec preedit_start_reply_fr[]; IMPreeditCBStruct *preedit_CB = (IMPreeditCBStruct *) &call_data->preedit_callback; CARD16 connect_id = call_data->any.connect_id; CARD16 input_method_ID; fm = FrameMgrInit (preedit_start_reply_fr, (char *) p, _Xi18nNeedSwap (i18n_core, connect_id)); /* get data */ FrameMgrGetToken (fm, input_method_ID); FrameMgrGetToken (fm, preedit_CB->icid); FrameMgrGetToken (fm, preedit_CB->todo.return_value); FrameMgrFree (fm); if (i18n_core->address.improto) { if (!(i18n_core->address.improto (ims, call_data))) return; /*endif*/ } /*endif*/ } void PreeditCaretReplyMessageProc (XIMS ims, IMProtocol *call_data, unsigned char *p) { Xi18n i18n_core = ims->protocol; FrameMgr fm; extern XimFrameRec preedit_caret_reply_fr[]; IMPreeditCBStruct *preedit_CB = (IMPreeditCBStruct *) &call_data->preedit_callback; XIMPreeditCaretCallbackStruct *caret = (XIMPreeditCaretCallbackStruct *) & preedit_CB->todo.caret; CARD16 connect_id = call_data->any.connect_id; CARD16 input_method_ID; fm = FrameMgrInit (preedit_caret_reply_fr, (char *) p, _Xi18nNeedSwap (i18n_core, connect_id)); /* get data */ FrameMgrGetToken (fm, input_method_ID); FrameMgrGetToken (fm, preedit_CB->icid); FrameMgrGetToken (fm, caret->position); FrameMgrFree (fm); if (i18n_core->address.improto) { if (!(i18n_core->address.improto(ims, call_data))) return; /*endif*/ } /*endif*/ } static char* ctstombs(Display* display, char* compound_text, size_t len) { char **list = NULL; char *ret = NULL; int count = 0; XTextProperty text_prop; text_prop.value = (unsigned char*)compound_text; text_prop.encoding = XInternAtom(display, "COMPOUND_TEXT", False); text_prop.format = 8; text_prop.nitems = len; XmbTextPropertyToTextList(display, &text_prop, &list, &count); if (list != NULL) ret = strdup(list[0]); XFreeStringList(list); return ret; } void StrConvReplyMessageProc (XIMS ims, IMProtocol *call_data, unsigned char *p) { Xi18n i18n_core = ims->protocol; FrameMgr fm; extern XimFrameRec str_conversion_reply_fr[]; IMStrConvCBStruct *strconv_CB = (IMStrConvCBStruct *) &call_data->strconv_callback; XIMStringConversionText text = { 0, NULL, False, { NULL } }; CARD16 connect_id = call_data->any.connect_id; CARD16 input_method_ID; CARD16 length; int i; fm = FrameMgrInit (str_conversion_reply_fr, (char *) p, _Xi18nNeedSwap (i18n_core, connect_id)); /* get data */ FrameMgrGetToken (fm, input_method_ID); FrameMgrGetToken (fm, strconv_CB->icid); FrameMgrGetToken (fm, length); if (length > 0) { int feedback_length; char *str; XIMStringConversionFeedback feedback; FrameMgrSetSize (fm, length); FrameMgrGetToken (fm, str); text.encoding_is_wchar = False; text.string.mbs = ctstombs(i18n_core->address.dpy, str, length); text.length = strlen(text.string.mbs); FrameMgrGetToken (fm, feedback_length); feedback_length /= sizeof(CARD32); /* sizeof(XIMStringConversionFeedback) may not 4 */ text.feedback = malloc(feedback_length * sizeof(XIMStringConversionFeedback)); if (text.feedback != NULL) { for (i = 0; i < feedback_length; i++) { FrameMgrGetToken (fm, feedback); text.feedback[i] = feedback; } } } FrameMgrFree (fm); strconv_CB->strconv.text = &text; if (i18n_core->address.improto) { i18n_core->address.improto(ims, call_data); } if (length > 0) { free(text.string.mbs); free(text.feedback); } return; } static void AddQueue (Xi18nClient *client, unsigned char *p) { XIMPending *new; XIMPending *last; if ((new = (XIMPending *) malloc (sizeof (XIMPending))) == NULL) return; /*endif*/ new->p = p; new->next = (XIMPending *) NULL; if (!client->pending) { client->pending = new; } else { for (last = client->pending; last->next; last = last->next) ; /*endfor*/ last->next = new; } /*endif*/ return; } static void ProcessQueue (XIMS ims, CARD16 connect_id) { Xi18n i18n_core = ims->protocol; Xi18nClient *client = (Xi18nClient *) _Xi18nFindClient (i18n_core, connect_id); while (client->sync == False && client->pending) { XimProtoHdr *hdr = (XimProtoHdr *) client->pending->p; unsigned char *p1 = (unsigned char *) (hdr + 1); IMProtocol call_data; call_data.major_code = hdr->major_opcode; call_data.any.minor_code = hdr->minor_opcode; call_data.any.connect_id = connect_id; switch (hdr->major_opcode) { case XIM_FORWARD_EVENT: ForwardEventMessageProc(ims, &call_data, p1); break; } /*endswitch*/ XFree (hdr); { XIMPending *old = client->pending; client->pending = old->next; XFree (old); } } /*endwhile*/ return; } void _Xi18nMessageHandler (XIMS ims, CARD16 connect_id, unsigned char *p, Bool *delete) { XimProtoHdr *hdr = (XimProtoHdr *)p; unsigned char *p1 = (unsigned char *)(hdr + 1); IMProtocol call_data; Xi18n i18n_core = ims->protocol; Xi18nClient *client; client = (Xi18nClient *) _Xi18nFindClient (i18n_core, connect_id); if (hdr == (XimProtoHdr *) NULL) return; /*endif*/ memset (&call_data, 0, sizeof(IMProtocol)); call_data.major_code = hdr->major_opcode; call_data.any.minor_code = hdr->minor_opcode; call_data.any.connect_id = connect_id; switch (call_data.major_code) { case XIM_CONNECT: nabi_log(5, "XIM_CONNECT: cid: %d\n", connect_id); ConnectMessageProc (ims, &call_data, p1); break; case XIM_DISCONNECT: nabi_log(5, "XIM_DISCONNECT: cid: %d\n", connect_id); DisConnectMessageProc (ims, &call_data); break; case XIM_OPEN: nabi_log(5, "XIM_OPEN: cid: %d\n", connect_id); OpenMessageProc (ims, &call_data, p1); break; case XIM_CLOSE: nabi_log(5, "XIM_CLOSE: cid: %d\n", connect_id); CloseMessageProc (ims, &call_data, p1); break; case XIM_QUERY_EXTENSION: nabi_log(5, "XIM_QUERY_EXTENSION: cid: %d\n", connect_id); QueryExtensionMessageProc (ims, &call_data, p1); break; case XIM_GET_IM_VALUES: nabi_log(5, "XIM_GET_IM_VALUES: cid: %d\n", connect_id); GetIMValuesMessageProc (ims, &call_data, p1); break; case XIM_CREATE_IC: nabi_log(5, "XIM_CREATE_IC: cid: %d\n", connect_id); CreateICMessageProc (ims, &call_data, p1); break; case XIM_SET_IC_VALUES: nabi_log(5, "XIM_SET_IC_VALUES: cid: %d\n", connect_id); SetICValuesMessageProc (ims, &call_data, p1); break; case XIM_GET_IC_VALUES: nabi_log(5, "XIM_GET_IC_VALUES: cid: %d\n", connect_id); GetICValuesMessageProc (ims, &call_data, p1); break; case XIM_SET_IC_FOCUS: nabi_log(5, "XIM_SET_IC_FOCUS: cid: %d\n", connect_id); SetICFocusMessageProc (ims, &call_data, p1); break; case XIM_UNSET_IC_FOCUS: nabi_log(5, "XIM_UNSET_IC_FOCUS: cid: %d\n", connect_id); UnsetICFocusMessageProc (ims, &call_data, p1); break; case XIM_DESTROY_IC: nabi_log(5, "XIM_DESTROY_IC: cid: %d\n", connect_id); DestroyICMessageProc (ims, &call_data, p1); break; case XIM_RESET_IC: nabi_log(5, "XIM_RESET_IC: cid: %d\n", connect_id); ResetICMessageProc (ims, &call_data, p1); break; case XIM_FORWARD_EVENT: nabi_log(5, "XIM_FORWARD_EVENT: cid: %d\n", connect_id); if (client->sync == True) { nabi_log(6, "XIM_FORWARD_EVENT(cid=%x: sync, add to queue\n", connect_id); AddQueue (client, p); *delete = False; } else { nabi_log(6, "XIM_FORWARD_EVENT(cid=%x): async, process event\n", connect_id); ForwardEventMessageProc (ims, &call_data, p1); } break; case XIM_EXTENSION: nabi_log(5, "XIM_EXTENSION: cid: %d\n", connect_id); ExtensionMessageProc (ims, &call_data, p1); break; case XIM_SYNC: nabi_log(5, "XIM_SYNC: cid: %d\n", connect_id); break; case XIM_SYNC_REPLY: nabi_log(5, "XIM_SYNC_REPLY: cid: %d, process queue\n", connect_id); SyncReplyMessageProc (ims, &call_data, p1); ProcessQueue (ims, connect_id); break; case XIM_TRIGGER_NOTIFY: nabi_log(5, "XIM_TRIGGER_NOTIFY: cid: %d\n", connect_id); TriggerNotifyMessageProc (ims, &call_data, p1); break; case XIM_ENCODING_NEGOTIATION: nabi_log(5, "XIM_ENCODING_NEGOTIATION: cid: %d\n", connect_id); EncodingNegotiatonMessageProc (ims, &call_data, p1); break; case XIM_PREEDIT_START_REPLY: nabi_log(5, "XIM_PREEDIT_START_REPLY: cid: %d\n", connect_id); PreeditStartReplyMessageProc (ims, &call_data, p1); break; case XIM_PREEDIT_CARET_REPLY: nabi_log(5, "XIM_PREEDIT_CARET_REPLY: cid: %d\n", connect_id); PreeditCaretReplyMessageProc (ims, &call_data, p1); break; case XIM_STR_CONVERSION_REPLY: nabi_log(5, "XIM_STR_CONVERSION_REPLY: cid: %d\n", connect_id); StrConvReplyMessageProc (ims, &call_data, p1); break; case XIM_ERROR: nabi_log(3, "XIM_ERROR: cid: %d\n", connect_id); break; default: nabi_log(3, "unhandled XIM message: %d:%d\n", hdr->major_opcode, hdr->minor_opcode); break; } /*endswitch*/ } nabi-1.0.0/IMdkit/i18nUtil.c0000644000175000017500000002167611655153252012325 00000000000000/****************************************************************** Copyright 1994, 1995 by Sun Microsystems, Inc. Copyright 1993, 1994 by Hewlett-Packard Company Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation, and that the name of Sun Microsystems, Inc. and Hewlett-Packard not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. Sun Microsystems, Inc. and Hewlett-Packard make no representations about the suitability of this software for any purpose. It is provided "as is" without express or implied warranty. SUN MICROSYSTEMS INC. AND HEWLETT-PACKARD COMPANY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SUN MICROSYSTEMS, INC. AND HEWLETT-PACKARD COMPANY BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. Author: Hidetoshi Tajima(tajima@Eng.Sun.COM) Sun Microsystems, Inc. This version tidied and debugged by Steve Underwood May 1999 ******************************************************************/ #include #include "IMdkit.h" #include "Xi18n.h" #include "FrameMgr.h" #include "XimFunc.h" Xi18nClient *_Xi18nFindClient (Xi18n, CARD16); int _Xi18nNeedSwap (Xi18n i18n_core, CARD16 connect_id) { CARD8 im_byteOrder = i18n_core->address.im_byteOrder; Xi18nClient *client = _Xi18nFindClient (i18n_core, connect_id); return (client->byte_order != im_byteOrder); } Xi18nClient *_Xi18nNewClient(Xi18n i18n_core) { static CARD16 connect_id = 0; int new_connect_id; Xi18nClient *client; if (i18n_core->address.free_clients) { client = i18n_core->address.free_clients; i18n_core->address.free_clients = client->next; new_connect_id = client->connect_id; } else { client = (Xi18nClient *) malloc (sizeof (Xi18nClient)); new_connect_id = ++connect_id; } /*endif*/ memset (client, 0, sizeof (Xi18nClient)); client->connect_id = new_connect_id; client->pending = (XIMPending *) NULL; client->sync = False; client->byte_order = '?'; /* initial value */ memset (&client->pending, 0, sizeof (XIMPending *)); client->next = i18n_core->address.clients; i18n_core->address.clients = client; return (Xi18nClient *) client; } Xi18nClient *_Xi18nFindClient (Xi18n i18n_core, CARD16 connect_id) { Xi18nClient *client = i18n_core->address.clients; while (client) { if (client->connect_id == connect_id) return client; /*endif*/ client = client->next; } /*endwhile*/ return NULL; } void _Xi18nDeleteClient (Xi18n i18n_core, CARD16 connect_id) { Xi18nClient *target = _Xi18nFindClient (i18n_core, connect_id); Xi18nClient *ccp; Xi18nClient *ccp0; for (ccp = i18n_core->address.clients, ccp0 = NULL; ccp != NULL; ccp0 = ccp, ccp = ccp->next) { if (ccp == target) { if (ccp0 == NULL) i18n_core->address.clients = ccp->next; else ccp0->next = ccp->next; /*endif*/ /* put it back to free list */ target->next = i18n_core->address.free_clients; i18n_core->address.free_clients = target; return; } /*endif*/ } /*endfor*/ } void _Xi18nDeleteAllClients (Xi18n i18n_core) { Xi18nClient *client = i18n_core->address.clients; while (client != NULL) { Xi18nClient* tmp = client; client = client->next; free (tmp); } i18n_core->address.clients = NULL; } void _Xi18nDeleteFreeClients (Xi18n i18n_core) { Xi18nClient *client = i18n_core->address.free_clients; while (client != NULL) { Xi18nClient* tmp = client; client = client->next; free (tmp); } i18n_core->address.free_clients = NULL; } void _Xi18nSendMessage (XIMS ims, CARD16 connect_id, CARD8 major_opcode, CARD8 minor_opcode, unsigned char *data, long length) { Xi18n i18n_core = ims->protocol; FrameMgr fm; extern XimFrameRec packet_header_fr[]; unsigned char *reply_hdr = NULL; int header_size; unsigned char *reply = NULL; unsigned char *replyp; int reply_length; long p_len = length/4; fm = FrameMgrInit (packet_header_fr, NULL, _Xi18nNeedSwap (i18n_core, connect_id)); header_size = FrameMgrGetTotalSize (fm); reply_hdr = (unsigned char *) malloc (header_size); if (reply_hdr == NULL) { _Xi18nSendMessage (ims, connect_id, XIM_ERROR, 0, 0, 0); return; } /*endif*/ FrameMgrSetBuffer (fm, reply_hdr); /* put data */ FrameMgrPutToken (fm, major_opcode); FrameMgrPutToken (fm, minor_opcode); FrameMgrPutToken (fm, p_len); reply_length = header_size + length; reply = (unsigned char *) malloc (reply_length); replyp = reply; memmove (reply, reply_hdr, header_size); replyp += header_size; memmove (replyp, data, length); i18n_core->methods.send (ims, connect_id, reply, reply_length); free (reply); free (reply_hdr); FrameMgrFree (fm); } void _Xi18nSendTriggerKey (XIMS ims, CARD16 connect_id) { Xi18n i18n_core = ims->protocol; FrameMgr fm; extern XimFrameRec register_triggerkeys_fr[]; XIMTriggerKey *on_keys = i18n_core->address.on_keys.keylist; XIMTriggerKey *off_keys = i18n_core->address.off_keys.keylist; int on_key_num = i18n_core->address.on_keys.count_keys; int off_key_num = i18n_core->address.off_keys.count_keys; unsigned char *reply = NULL; register int i, total_size; CARD16 im_id; if (on_key_num == 0 && off_key_num == 0) return; /*endif*/ fm = FrameMgrInit (register_triggerkeys_fr, NULL, _Xi18nNeedSwap (i18n_core, connect_id)); /* set iteration count for on-keys list */ FrameMgrSetIterCount (fm, on_key_num); /* set iteration count for off-keys list */ FrameMgrSetIterCount (fm, off_key_num); /* get total_size */ total_size = FrameMgrGetTotalSize (fm); reply = (unsigned char *) malloc (total_size); if (!reply) return; /*endif*/ memset (reply, 0, total_size); FrameMgrSetBuffer (fm, reply); /* Right now XIM_OPEN_REPLY hasn't been sent to this new client, so the input-method-id is still invalid, and should be set to zero... Reter to $(XC)/lib/X11/imDefLkup.c:_XimRegisterTriggerKeysCallback */ im_id = 0; FrameMgrPutToken (fm, im_id); /* input-method-id */ for (i = 0; i < on_key_num; i++) { FrameMgrPutToken (fm, on_keys[i].keysym); FrameMgrPutToken (fm, on_keys[i].modifier); FrameMgrPutToken (fm, on_keys[i].modifier_mask); } /*endfor*/ for (i = 0; i < off_key_num; i++) { FrameMgrPutToken (fm, off_keys[i].keysym); FrameMgrPutToken (fm, off_keys[i].modifier); FrameMgrPutToken (fm, off_keys[i].modifier_mask); } /*endfor*/ _Xi18nSendMessage (ims, connect_id, XIM_REGISTER_TRIGGERKEYS, 0, reply, total_size); FrameMgrFree (fm); free (reply); } void _Xi18nSetEventMask (XIMS ims, CARD16 connect_id, CARD16 im_id, CARD16 ic_id, CARD32 forward_mask, CARD32 sync_mask) { Xi18n i18n_core = ims->protocol; FrameMgr fm; extern XimFrameRec set_event_mask_fr[]; unsigned char *reply = NULL; register int total_size; fm = FrameMgrInit (set_event_mask_fr, NULL, _Xi18nNeedSwap (i18n_core, connect_id)); total_size = FrameMgrGetTotalSize (fm); reply = (unsigned char *) malloc (total_size); if (!reply) return; /*endif*/ memset (reply, 0, total_size); FrameMgrSetBuffer (fm, reply); FrameMgrPutToken (fm, im_id); /* input-method-id */ FrameMgrPutToken (fm, ic_id); /* input-context-id */ FrameMgrPutToken (fm, forward_mask); FrameMgrPutToken (fm, sync_mask); _Xi18nSendMessage (ims, connect_id, XIM_SET_EVENT_MASK, 0, reply, total_size); FrameMgrFree (fm); free (reply); } nabi-1.0.0/IMdkit/i18nX.c0000644000175000017500000004112511655153252011606 00000000000000/****************************************************************** Copyright 1994, 1995 by Sun Microsystems, Inc. Copyright 1993, 1994 by Hewlett-Packard Company Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation, and that the name of Sun Microsystems, Inc. and Hewlett-Packard not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. Sun Microsystems, Inc. and Hewlett-Packard make no representations about the suitability of this software for any purpose. It is provided "as is" without express or implied warranty. SUN MICROSYSTEMS INC. AND HEWLETT-PACKARD COMPANY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SUN MICROSYSTEMS, INC. AND HEWLETT-PACKARD COMPANY BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. Author: Hidetoshi Tajima(tajima@Eng.Sun.COM) Sun Microsystems, Inc. This version tidied and debugged by Steve Underwood May 1999 ******************************************************************/ #include #include #include "FrameMgr.h" #include "IMdkit.h" #include "Xi18n.h" #include "Xi18nX.h" #include "XimFunc.h" extern Xi18nClient *_Xi18nFindClient(Xi18n, CARD16); extern Xi18nClient *_Xi18nNewClient(Xi18n); extern void _Xi18nDeleteClient(Xi18n, CARD16); extern void _Xi18nMessageHandler (XIMS, CARD16, unsigned char *, Bool *); static Bool WaitXConnectMessage(Display*, Window, XEvent*, XPointer); static Bool WaitXIMProtocol(Display*, Window, XEvent*, XPointer); static XClient *NewXClient (Xi18n i18n_core, Window new_client) { Display *dpy = i18n_core->address.dpy; Xi18nClient *client = _Xi18nNewClient (i18n_core); XClient *x_client; x_client = (XClient *) malloc (sizeof (XClient)); x_client->client_win = new_client; x_client->accept_win = XCreateSimpleWindow (dpy, DefaultRootWindow(dpy), 0, 0, 1, 1, 1, 0, 0); client->trans_rec = x_client; return ((XClient *) x_client); } static unsigned char *ReadXIMMessage (XIMS ims, XClientMessageEvent *ev, int *connect_id) { Xi18n i18n_core = ims->protocol; Xi18nClient *client = i18n_core->address.clients; XClient *x_client = NULL; FrameMgr fm; extern XimFrameRec packet_header_fr[]; unsigned char *p = NULL; unsigned char *p1; while (client != NULL) { x_client = (XClient *) client->trans_rec; if (x_client->accept_win == ev->window) { *connect_id = client->connect_id; break; } client = client->next; } if (ev->format == 8) { /* ClientMessage only */ XimProtoHdr *hdr = (XimProtoHdr *) ev->data.b; unsigned char *rec = (unsigned char *) (hdr + 1); register int total_size; CARD8 major_opcode; CARD8 minor_opcode; CARD16 length; extern int _Xi18nNeedSwap (Xi18n, CARD16); if (client->byte_order == '?') { if (hdr->major_opcode != XIM_CONNECT) return (unsigned char *) NULL; /* can do nothing */ client->byte_order = (CARD8) rec[0]; } fm = FrameMgrInit (packet_header_fr, (char *) hdr, _Xi18nNeedSwap (i18n_core, *connect_id)); total_size = FrameMgrGetTotalSize (fm); /* get data */ FrameMgrGetToken (fm, major_opcode); FrameMgrGetToken (fm, minor_opcode); FrameMgrGetToken (fm, length); FrameMgrFree (fm); if ((p = (unsigned char *) malloc (total_size + length * 4)) == NULL) return (unsigned char *) NULL; p1 = p; memmove (p1, &major_opcode, sizeof (CARD8)); p1 += sizeof (CARD8); memmove (p1, &minor_opcode, sizeof (CARD8)); p1 += sizeof (CARD8); memmove (p1, &length, sizeof (CARD16)); p1 += sizeof (CARD16); memmove (p1, rec, length * 4); } else if (ev->format == 32) { /* ClientMessage and WindowProperty */ unsigned long length = (unsigned long) ev->data.l[0]; Atom atom = (Atom) ev->data.l[1]; int return_code; Atom actual_type_ret; int actual_format_ret; unsigned long bytes_after_ret; unsigned char *prop; unsigned long nitems; return_code = XGetWindowProperty (i18n_core->address.dpy, x_client->accept_win, atom, 0L, length, True, AnyPropertyType, &actual_type_ret, &actual_format_ret, &nitems, &bytes_after_ret, &prop); if (return_code != Success || actual_format_ret == 0 || nitems == 0) { if (return_code == Success) XFree (prop); return (unsigned char *) NULL; } if (length != nitems) length = nitems; if (actual_format_ret == 16) length *= 2; else if (actual_format_ret == 32) length *= 4; /* if hit, it might be an error */ if ((p = (unsigned char *) malloc (length)) == NULL) return (unsigned char *) NULL; memmove (p, prop, length); XFree (prop); } return (unsigned char *) p; } static void ReadXConnectMessage (XIMS ims, XClientMessageEvent *ev) { Xi18n i18n_core = ims->protocol; XSpecRec *spec = (XSpecRec *) i18n_core->address.connect_addr; XEvent event; Display *dpy = i18n_core->address.dpy; Window new_client = ev->data.l[0]; CARD32 major_version = ev->data.l[1]; CARD32 minor_version = ev->data.l[2]; XClient *x_client = NewXClient (i18n_core, new_client); if (ev->window != i18n_core->address.im_window) return; /* incorrect connection request */ /*endif*/ if (major_version != 0 || minor_version != 0) { major_version = minor_version = 0; /* Only supporting only-CM & Property-with-CM method */ } /*endif*/ _XRegisterFilterByType (dpy, x_client->accept_win, ClientMessage, ClientMessage, WaitXIMProtocol, (XPointer)ims); event.xclient.type = ClientMessage; event.xclient.display = dpy; event.xclient.window = new_client; event.xclient.message_type = spec->connect_request; event.xclient.format = 32; event.xclient.data.l[0] = x_client->accept_win; event.xclient.data.l[1] = major_version; event.xclient.data.l[2] = minor_version; event.xclient.data.l[3] = XCM_DATA_LIMIT; XSendEvent (dpy, new_client, False, NoEventMask, &event); XFlush (dpy); } static Bool Xi18nXBegin (XIMS ims) { Xi18n i18n_core = ims->protocol; Display *dpy = i18n_core->address.dpy; XSpecRec *spec = (XSpecRec *) i18n_core->address.connect_addr; spec->xim_request = XInternAtom (i18n_core->address.dpy, _XIM_PROTOCOL, False); spec->connect_request = XInternAtom (i18n_core->address.dpy, _XIM_XCONNECT, False); _XRegisterFilterByType (dpy, i18n_core->address.im_window, ClientMessage, ClientMessage, WaitXConnectMessage, (XPointer)ims); return True; } static Bool Xi18nXEnd(XIMS ims) { Xi18n i18n_core = ims->protocol; Display *dpy = i18n_core->address.dpy; _XUnregisterFilter (dpy, i18n_core->address.im_window, WaitXConnectMessage, (XPointer)ims); return True; } static char *MakeNewAtom (CARD16 connect_id, char *atomName, size_t atomNameLen) { static int sequence = 0; snprintf (atomName, atomNameLen - 1, "_server%d_%d", connect_id, ((sequence > 20) ? (sequence = 0) : sequence++)); atomName[atomNameLen - 1] = '\0'; return atomName; } static Bool Xi18nXSend (XIMS ims, CARD16 connect_id, unsigned char *reply, long length) { Xi18n i18n_core = ims->protocol; Xi18nClient *client = _Xi18nFindClient (i18n_core, connect_id); XSpecRec *spec = (XSpecRec *) i18n_core->address.connect_addr; XClient *x_client = (XClient *) client->trans_rec; XEvent event; event.type = ClientMessage; event.xclient.window = x_client->client_win; event.xclient.message_type = spec->xim_request; if (length > XCM_DATA_LIMIT) { Atom atom; char atomName[32]; Atom actual_type_ret; int actual_format_ret; int return_code; unsigned long nitems_ret; unsigned long bytes_after_ret; unsigned char *win_data; event.xclient.format = 32; atom = XInternAtom (i18n_core->address.dpy, MakeNewAtom (connect_id, atomName,sizeof(atomName)), False); return_code = XGetWindowProperty (i18n_core->address.dpy, x_client->client_win, atom, 0L, 10000L, False, XA_STRING, &actual_type_ret, &actual_format_ret, &nitems_ret, &bytes_after_ret, &win_data); if (return_code != Success) return False; /*endif*/ if (win_data) XFree ((char *) win_data); /*endif*/ XChangeProperty (i18n_core->address.dpy, x_client->client_win, atom, XA_STRING, 8, PropModeAppend, (unsigned char *) reply, length); event.xclient.data.l[0] = length; event.xclient.data.l[1] = atom; } else { unsigned char buffer[XCM_DATA_LIMIT]; int i; event.xclient.format = 8; /* Clear unused field with NULL */ memmove(buffer, reply, length); for (i = length; i < XCM_DATA_LIMIT; i++) buffer[i] = (char) 0; /*endfor*/ length = XCM_DATA_LIMIT; memmove (event.xclient.data.b, buffer, length); } XSendEvent (i18n_core->address.dpy, x_client->client_win, False, NoEventMask, &event); XFlush (i18n_core->address.dpy); return True; } static Bool CheckCMEvent (Display *display, XEvent *event, XPointer xi18n_core) { Xi18n i18n_core = (Xi18n) ((void *) xi18n_core); XSpecRec *spec = (XSpecRec *) i18n_core->address.connect_addr; if ((event->type == ClientMessage) && (event->xclient.message_type == spec->xim_request)) { return True; } /*endif*/ return False; } static Bool Xi18nXWait (XIMS ims, CARD16 connect_id, CARD8 major_opcode, CARD8 minor_opcode) { Xi18n i18n_core = ims->protocol; XEvent event; Xi18nClient *client = _Xi18nFindClient (i18n_core, connect_id); XClient *x_client = (XClient *) client->trans_rec; for (;;) { unsigned char *packet; XimProtoHdr *hdr; int connect_id_ret; XIfEvent (i18n_core->address.dpy, &event, CheckCMEvent, (XPointer) i18n_core); if (event.xclient.window == x_client->accept_win) { if ((packet = ReadXIMMessage (ims, (XClientMessageEvent *) & event, &connect_id_ret)) == (unsigned char*) NULL) { return False; } /*endif*/ hdr = (XimProtoHdr *)packet; if ((hdr->major_opcode == major_opcode) && (hdr->minor_opcode == minor_opcode)) { Bool delete = True; _Xi18nMessageHandler (ims, connect_id_ret, packet, &delete); if (delete) free (packet); return True; } else if (hdr->major_opcode == XIM_ERROR) { return False; } /*endif*/ } /*endif*/ } /*endfor*/ } static Bool Xi18nXDisconnect (XIMS ims, CARD16 connect_id) { Xi18n i18n_core = ims->protocol; Display *dpy = i18n_core->address.dpy; Xi18nClient *client = _Xi18nFindClient (i18n_core, connect_id); XClient *x_client = (XClient *) client->trans_rec; XDestroyWindow (dpy, x_client->accept_win); _XUnregisterFilter (dpy, x_client->accept_win, WaitXIMProtocol, (XPointer)ims); free (x_client); _Xi18nDeleteClient (i18n_core, connect_id); return True; } Bool _Xi18nCheckXAddress (Xi18n i18n_core, TransportSW *transSW, char *address) { XSpecRec *spec; if (!(spec = (XSpecRec *) malloc (sizeof (XSpecRec)))) return False; /*endif*/ i18n_core->address.connect_addr = (XSpecRec *) spec; i18n_core->methods.begin = Xi18nXBegin; i18n_core->methods.end = Xi18nXEnd; i18n_core->methods.send = Xi18nXSend; i18n_core->methods.wait = Xi18nXWait; i18n_core->methods.disconnect = Xi18nXDisconnect; return True; } static Bool WaitXConnectMessage (Display *dpy, Window win, XEvent *ev, XPointer client_data) { XIMS ims = (XIMS)client_data; Xi18n i18n_core = ims->protocol; XSpecRec *spec = (XSpecRec *) i18n_core->address.connect_addr; if (((XClientMessageEvent *) ev)->message_type == spec->connect_request) { ReadXConnectMessage (ims, (XClientMessageEvent *) ev); return True; } /*endif*/ return False; } static Bool WaitXIMProtocol (Display *dpy, Window win, XEvent *ev, XPointer client_data) { extern void _Xi18nMessageHandler (XIMS, CARD16, unsigned char *, Bool *); XIMS ims = (XIMS) client_data; Xi18n i18n_core = ims->protocol; XSpecRec *spec = (XSpecRec *) i18n_core->address.connect_addr; Bool delete = True; unsigned char *packet; int connect_id; if (((XClientMessageEvent *) ev)->message_type == spec->xim_request) { if ((packet = ReadXIMMessage (ims, (XClientMessageEvent *) ev, &connect_id)) == (unsigned char *) NULL) { return False; } /*endif*/ _Xi18nMessageHandler (ims, connect_id, packet, &delete); if (delete == True) free (packet); /*endif*/ return True; } /*endif*/ return False; } nabi-1.0.0/src/0000755000175000017500000000000012100712170010200 500000000000000nabi-1.0.0/src/Makefile.am0000644000175000017500000000141611655153252012174 00000000000000 bin_PROGRAMS = nabi nabi_CFLAGS = \ $(X_CFLAGS) \ $(GTK_CFLAGS) \ $(LIBHANGUL_CFLAGS) \ -DLOCALEDIR=\"$(localedir)\" \ -DNABI_DATA_DIR=\"$(NABI_DATA_DIR)\" \ -DNABI_THEMES_DIR=\"$(NABI_THEMES_DIR)\" nabi_SOURCES = \ nabi.h \ gettext.h \ xim_protocol.h \ default-icons.h \ debug.h debug.c \ server.h server.c \ ic.h ic.c \ fontset.h fontset.c \ eggtrayicon.h eggtrayicon.c \ session.h session.c \ candidate.h candidate.c \ keycapturedialog.h keycapturedialog.c \ conf.h conf.c \ handler.c \ ui.c \ preference.h preference.c \ handlebox.h handlebox.c \ sctc.h util.h util.c \ ustring.h ustring.c \ keyboard-layout.h keyboard-layout.c \ main.c nabi_LDADD = \ ../IMdkit/libXimd.a \ $(GTK_LIBS) \ $(X_LIBS) \ $(X_PRE_LIBS) \ -lX11 \ $(LIBHANGUL_LIBS) nabi-1.0.0/src/Makefile.in0000644000175000017500000012753212066005053012205 00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : bin_PROGRAMS = nabi$(EXEEXT) subdir = src DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" PROGRAMS = $(bin_PROGRAMS) am_nabi_OBJECTS = nabi-debug.$(OBJEXT) nabi-server.$(OBJEXT) \ nabi-ic.$(OBJEXT) nabi-fontset.$(OBJEXT) \ nabi-eggtrayicon.$(OBJEXT) nabi-session.$(OBJEXT) \ nabi-candidate.$(OBJEXT) nabi-keycapturedialog.$(OBJEXT) \ nabi-conf.$(OBJEXT) nabi-handler.$(OBJEXT) nabi-ui.$(OBJEXT) \ nabi-preference.$(OBJEXT) nabi-handlebox.$(OBJEXT) \ nabi-util.$(OBJEXT) nabi-ustring.$(OBJEXT) \ nabi-keyboard-layout.$(OBJEXT) nabi-main.$(OBJEXT) nabi_OBJECTS = $(am_nabi_OBJECTS) am__DEPENDENCIES_1 = nabi_DEPENDENCIES = ../IMdkit/libXimd.a $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) nabi_LINK = $(CCLD) $(nabi_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ SOURCES = $(nabi_SOURCES) DIST_SOURCES = $(nabi_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ LDFLAGS = @LDFLAGS@ LIBHANGUL_CFLAGS = @LIBHANGUL_CFLAGS@ LIBHANGUL_LIBS = @LIBHANGUL_LIBS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ NABI_DATA_DIR = @NABI_DATA_DIR@ NABI_THEMES_DIR = @NABI_THEMES_DIR@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ nabi_CFLAGS = \ $(X_CFLAGS) \ $(GTK_CFLAGS) \ $(LIBHANGUL_CFLAGS) \ -DLOCALEDIR=\"$(localedir)\" \ -DNABI_DATA_DIR=\"$(NABI_DATA_DIR)\" \ -DNABI_THEMES_DIR=\"$(NABI_THEMES_DIR)\" nabi_SOURCES = \ nabi.h \ gettext.h \ xim_protocol.h \ default-icons.h \ debug.h debug.c \ server.h server.c \ ic.h ic.c \ fontset.h fontset.c \ eggtrayicon.h eggtrayicon.c \ session.h session.c \ candidate.h candidate.c \ keycapturedialog.h keycapturedialog.c \ conf.h conf.c \ handler.c \ ui.c \ preference.h preference.c \ handlebox.h handlebox.c \ sctc.h util.h util.c \ ustring.h ustring.c \ keyboard-layout.h keyboard-layout.c \ main.c nabi_LDADD = \ ../IMdkit/libXimd.a \ $(GTK_LIBS) \ $(X_LIBS) \ $(X_PRE_LIBS) \ -lX11 \ $(LIBHANGUL_LIBS) all: all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p; \ then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) nabi$(EXEEXT): $(nabi_OBJECTS) $(nabi_DEPENDENCIES) @rm -f nabi$(EXEEXT) $(nabi_LINK) $(nabi_OBJECTS) $(nabi_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nabi-candidate.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nabi-conf.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nabi-debug.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nabi-eggtrayicon.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nabi-fontset.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nabi-handlebox.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nabi-handler.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nabi-ic.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nabi-keyboard-layout.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nabi-keycapturedialog.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nabi-main.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nabi-preference.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nabi-server.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nabi-session.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nabi-ui.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nabi-ustring.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nabi-util.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` nabi-debug.o: debug.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nabi_CFLAGS) $(CFLAGS) -MT nabi-debug.o -MD -MP -MF $(DEPDIR)/nabi-debug.Tpo -c -o nabi-debug.o `test -f 'debug.c' || echo '$(srcdir)/'`debug.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/nabi-debug.Tpo $(DEPDIR)/nabi-debug.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='debug.c' object='nabi-debug.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nabi_CFLAGS) $(CFLAGS) -c -o nabi-debug.o `test -f 'debug.c' || echo '$(srcdir)/'`debug.c nabi-debug.obj: debug.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nabi_CFLAGS) $(CFLAGS) -MT nabi-debug.obj -MD -MP -MF $(DEPDIR)/nabi-debug.Tpo -c -o nabi-debug.obj `if test -f 'debug.c'; then $(CYGPATH_W) 'debug.c'; else $(CYGPATH_W) '$(srcdir)/debug.c'; fi` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/nabi-debug.Tpo $(DEPDIR)/nabi-debug.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='debug.c' object='nabi-debug.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nabi_CFLAGS) $(CFLAGS) -c -o nabi-debug.obj `if test -f 'debug.c'; then $(CYGPATH_W) 'debug.c'; else $(CYGPATH_W) '$(srcdir)/debug.c'; fi` nabi-server.o: server.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nabi_CFLAGS) $(CFLAGS) -MT nabi-server.o -MD -MP -MF $(DEPDIR)/nabi-server.Tpo -c -o nabi-server.o `test -f 'server.c' || echo '$(srcdir)/'`server.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/nabi-server.Tpo $(DEPDIR)/nabi-server.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='server.c' object='nabi-server.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nabi_CFLAGS) $(CFLAGS) -c -o nabi-server.o `test -f 'server.c' || echo '$(srcdir)/'`server.c nabi-server.obj: server.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nabi_CFLAGS) $(CFLAGS) -MT nabi-server.obj -MD -MP -MF $(DEPDIR)/nabi-server.Tpo -c -o nabi-server.obj `if test -f 'server.c'; then $(CYGPATH_W) 'server.c'; else $(CYGPATH_W) '$(srcdir)/server.c'; fi` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/nabi-server.Tpo $(DEPDIR)/nabi-server.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='server.c' object='nabi-server.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nabi_CFLAGS) $(CFLAGS) -c -o nabi-server.obj `if test -f 'server.c'; then $(CYGPATH_W) 'server.c'; else $(CYGPATH_W) '$(srcdir)/server.c'; fi` nabi-ic.o: ic.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nabi_CFLAGS) $(CFLAGS) -MT nabi-ic.o -MD -MP -MF $(DEPDIR)/nabi-ic.Tpo -c -o nabi-ic.o `test -f 'ic.c' || echo '$(srcdir)/'`ic.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/nabi-ic.Tpo $(DEPDIR)/nabi-ic.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ic.c' object='nabi-ic.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nabi_CFLAGS) $(CFLAGS) -c -o nabi-ic.o `test -f 'ic.c' || echo '$(srcdir)/'`ic.c nabi-ic.obj: ic.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nabi_CFLAGS) $(CFLAGS) -MT nabi-ic.obj -MD -MP -MF $(DEPDIR)/nabi-ic.Tpo -c -o nabi-ic.obj `if test -f 'ic.c'; then $(CYGPATH_W) 'ic.c'; else $(CYGPATH_W) '$(srcdir)/ic.c'; fi` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/nabi-ic.Tpo $(DEPDIR)/nabi-ic.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ic.c' object='nabi-ic.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nabi_CFLAGS) $(CFLAGS) -c -o nabi-ic.obj `if test -f 'ic.c'; then $(CYGPATH_W) 'ic.c'; else $(CYGPATH_W) '$(srcdir)/ic.c'; fi` nabi-fontset.o: fontset.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nabi_CFLAGS) $(CFLAGS) -MT nabi-fontset.o -MD -MP -MF $(DEPDIR)/nabi-fontset.Tpo -c -o nabi-fontset.o `test -f 'fontset.c' || echo '$(srcdir)/'`fontset.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/nabi-fontset.Tpo $(DEPDIR)/nabi-fontset.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='fontset.c' object='nabi-fontset.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nabi_CFLAGS) $(CFLAGS) -c -o nabi-fontset.o `test -f 'fontset.c' || echo '$(srcdir)/'`fontset.c nabi-fontset.obj: fontset.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nabi_CFLAGS) $(CFLAGS) -MT nabi-fontset.obj -MD -MP -MF $(DEPDIR)/nabi-fontset.Tpo -c -o nabi-fontset.obj `if test -f 'fontset.c'; then $(CYGPATH_W) 'fontset.c'; else $(CYGPATH_W) '$(srcdir)/fontset.c'; fi` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/nabi-fontset.Tpo $(DEPDIR)/nabi-fontset.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='fontset.c' object='nabi-fontset.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nabi_CFLAGS) $(CFLAGS) -c -o nabi-fontset.obj `if test -f 'fontset.c'; then $(CYGPATH_W) 'fontset.c'; else $(CYGPATH_W) '$(srcdir)/fontset.c'; fi` nabi-eggtrayicon.o: eggtrayicon.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nabi_CFLAGS) $(CFLAGS) -MT nabi-eggtrayicon.o -MD -MP -MF $(DEPDIR)/nabi-eggtrayicon.Tpo -c -o nabi-eggtrayicon.o `test -f 'eggtrayicon.c' || echo '$(srcdir)/'`eggtrayicon.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/nabi-eggtrayicon.Tpo $(DEPDIR)/nabi-eggtrayicon.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='eggtrayicon.c' object='nabi-eggtrayicon.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nabi_CFLAGS) $(CFLAGS) -c -o nabi-eggtrayicon.o `test -f 'eggtrayicon.c' || echo '$(srcdir)/'`eggtrayicon.c nabi-eggtrayicon.obj: eggtrayicon.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nabi_CFLAGS) $(CFLAGS) -MT nabi-eggtrayicon.obj -MD -MP -MF $(DEPDIR)/nabi-eggtrayicon.Tpo -c -o nabi-eggtrayicon.obj `if test -f 'eggtrayicon.c'; then $(CYGPATH_W) 'eggtrayicon.c'; else $(CYGPATH_W) '$(srcdir)/eggtrayicon.c'; fi` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/nabi-eggtrayicon.Tpo $(DEPDIR)/nabi-eggtrayicon.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='eggtrayicon.c' object='nabi-eggtrayicon.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nabi_CFLAGS) $(CFLAGS) -c -o nabi-eggtrayicon.obj `if test -f 'eggtrayicon.c'; then $(CYGPATH_W) 'eggtrayicon.c'; else $(CYGPATH_W) '$(srcdir)/eggtrayicon.c'; fi` nabi-session.o: session.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nabi_CFLAGS) $(CFLAGS) -MT nabi-session.o -MD -MP -MF $(DEPDIR)/nabi-session.Tpo -c -o nabi-session.o `test -f 'session.c' || echo '$(srcdir)/'`session.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/nabi-session.Tpo $(DEPDIR)/nabi-session.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='session.c' object='nabi-session.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nabi_CFLAGS) $(CFLAGS) -c -o nabi-session.o `test -f 'session.c' || echo '$(srcdir)/'`session.c nabi-session.obj: session.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nabi_CFLAGS) $(CFLAGS) -MT nabi-session.obj -MD -MP -MF $(DEPDIR)/nabi-session.Tpo -c -o nabi-session.obj `if test -f 'session.c'; then $(CYGPATH_W) 'session.c'; else $(CYGPATH_W) '$(srcdir)/session.c'; fi` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/nabi-session.Tpo $(DEPDIR)/nabi-session.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='session.c' object='nabi-session.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nabi_CFLAGS) $(CFLAGS) -c -o nabi-session.obj `if test -f 'session.c'; then $(CYGPATH_W) 'session.c'; else $(CYGPATH_W) '$(srcdir)/session.c'; fi` nabi-candidate.o: candidate.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nabi_CFLAGS) $(CFLAGS) -MT nabi-candidate.o -MD -MP -MF $(DEPDIR)/nabi-candidate.Tpo -c -o nabi-candidate.o `test -f 'candidate.c' || echo '$(srcdir)/'`candidate.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/nabi-candidate.Tpo $(DEPDIR)/nabi-candidate.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='candidate.c' object='nabi-candidate.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nabi_CFLAGS) $(CFLAGS) -c -o nabi-candidate.o `test -f 'candidate.c' || echo '$(srcdir)/'`candidate.c nabi-candidate.obj: candidate.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nabi_CFLAGS) $(CFLAGS) -MT nabi-candidate.obj -MD -MP -MF $(DEPDIR)/nabi-candidate.Tpo -c -o nabi-candidate.obj `if test -f 'candidate.c'; then $(CYGPATH_W) 'candidate.c'; else $(CYGPATH_W) '$(srcdir)/candidate.c'; fi` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/nabi-candidate.Tpo $(DEPDIR)/nabi-candidate.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='candidate.c' object='nabi-candidate.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nabi_CFLAGS) $(CFLAGS) -c -o nabi-candidate.obj `if test -f 'candidate.c'; then $(CYGPATH_W) 'candidate.c'; else $(CYGPATH_W) '$(srcdir)/candidate.c'; fi` nabi-keycapturedialog.o: keycapturedialog.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nabi_CFLAGS) $(CFLAGS) -MT nabi-keycapturedialog.o -MD -MP -MF $(DEPDIR)/nabi-keycapturedialog.Tpo -c -o nabi-keycapturedialog.o `test -f 'keycapturedialog.c' || echo '$(srcdir)/'`keycapturedialog.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/nabi-keycapturedialog.Tpo $(DEPDIR)/nabi-keycapturedialog.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='keycapturedialog.c' object='nabi-keycapturedialog.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nabi_CFLAGS) $(CFLAGS) -c -o nabi-keycapturedialog.o `test -f 'keycapturedialog.c' || echo '$(srcdir)/'`keycapturedialog.c nabi-keycapturedialog.obj: keycapturedialog.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nabi_CFLAGS) $(CFLAGS) -MT nabi-keycapturedialog.obj -MD -MP -MF $(DEPDIR)/nabi-keycapturedialog.Tpo -c -o nabi-keycapturedialog.obj `if test -f 'keycapturedialog.c'; then $(CYGPATH_W) 'keycapturedialog.c'; else $(CYGPATH_W) '$(srcdir)/keycapturedialog.c'; fi` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/nabi-keycapturedialog.Tpo $(DEPDIR)/nabi-keycapturedialog.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='keycapturedialog.c' object='nabi-keycapturedialog.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nabi_CFLAGS) $(CFLAGS) -c -o nabi-keycapturedialog.obj `if test -f 'keycapturedialog.c'; then $(CYGPATH_W) 'keycapturedialog.c'; else $(CYGPATH_W) '$(srcdir)/keycapturedialog.c'; fi` nabi-conf.o: conf.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nabi_CFLAGS) $(CFLAGS) -MT nabi-conf.o -MD -MP -MF $(DEPDIR)/nabi-conf.Tpo -c -o nabi-conf.o `test -f 'conf.c' || echo '$(srcdir)/'`conf.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/nabi-conf.Tpo $(DEPDIR)/nabi-conf.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='conf.c' object='nabi-conf.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nabi_CFLAGS) $(CFLAGS) -c -o nabi-conf.o `test -f 'conf.c' || echo '$(srcdir)/'`conf.c nabi-conf.obj: conf.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nabi_CFLAGS) $(CFLAGS) -MT nabi-conf.obj -MD -MP -MF $(DEPDIR)/nabi-conf.Tpo -c -o nabi-conf.obj `if test -f 'conf.c'; then $(CYGPATH_W) 'conf.c'; else $(CYGPATH_W) '$(srcdir)/conf.c'; fi` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/nabi-conf.Tpo $(DEPDIR)/nabi-conf.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='conf.c' object='nabi-conf.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nabi_CFLAGS) $(CFLAGS) -c -o nabi-conf.obj `if test -f 'conf.c'; then $(CYGPATH_W) 'conf.c'; else $(CYGPATH_W) '$(srcdir)/conf.c'; fi` nabi-handler.o: handler.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nabi_CFLAGS) $(CFLAGS) -MT nabi-handler.o -MD -MP -MF $(DEPDIR)/nabi-handler.Tpo -c -o nabi-handler.o `test -f 'handler.c' || echo '$(srcdir)/'`handler.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/nabi-handler.Tpo $(DEPDIR)/nabi-handler.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='handler.c' object='nabi-handler.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nabi_CFLAGS) $(CFLAGS) -c -o nabi-handler.o `test -f 'handler.c' || echo '$(srcdir)/'`handler.c nabi-handler.obj: handler.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nabi_CFLAGS) $(CFLAGS) -MT nabi-handler.obj -MD -MP -MF $(DEPDIR)/nabi-handler.Tpo -c -o nabi-handler.obj `if test -f 'handler.c'; then $(CYGPATH_W) 'handler.c'; else $(CYGPATH_W) '$(srcdir)/handler.c'; fi` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/nabi-handler.Tpo $(DEPDIR)/nabi-handler.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='handler.c' object='nabi-handler.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nabi_CFLAGS) $(CFLAGS) -c -o nabi-handler.obj `if test -f 'handler.c'; then $(CYGPATH_W) 'handler.c'; else $(CYGPATH_W) '$(srcdir)/handler.c'; fi` nabi-ui.o: ui.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nabi_CFLAGS) $(CFLAGS) -MT nabi-ui.o -MD -MP -MF $(DEPDIR)/nabi-ui.Tpo -c -o nabi-ui.o `test -f 'ui.c' || echo '$(srcdir)/'`ui.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/nabi-ui.Tpo $(DEPDIR)/nabi-ui.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ui.c' object='nabi-ui.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nabi_CFLAGS) $(CFLAGS) -c -o nabi-ui.o `test -f 'ui.c' || echo '$(srcdir)/'`ui.c nabi-ui.obj: ui.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nabi_CFLAGS) $(CFLAGS) -MT nabi-ui.obj -MD -MP -MF $(DEPDIR)/nabi-ui.Tpo -c -o nabi-ui.obj `if test -f 'ui.c'; then $(CYGPATH_W) 'ui.c'; else $(CYGPATH_W) '$(srcdir)/ui.c'; fi` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/nabi-ui.Tpo $(DEPDIR)/nabi-ui.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ui.c' object='nabi-ui.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nabi_CFLAGS) $(CFLAGS) -c -o nabi-ui.obj `if test -f 'ui.c'; then $(CYGPATH_W) 'ui.c'; else $(CYGPATH_W) '$(srcdir)/ui.c'; fi` nabi-preference.o: preference.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nabi_CFLAGS) $(CFLAGS) -MT nabi-preference.o -MD -MP -MF $(DEPDIR)/nabi-preference.Tpo -c -o nabi-preference.o `test -f 'preference.c' || echo '$(srcdir)/'`preference.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/nabi-preference.Tpo $(DEPDIR)/nabi-preference.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='preference.c' object='nabi-preference.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nabi_CFLAGS) $(CFLAGS) -c -o nabi-preference.o `test -f 'preference.c' || echo '$(srcdir)/'`preference.c nabi-preference.obj: preference.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nabi_CFLAGS) $(CFLAGS) -MT nabi-preference.obj -MD -MP -MF $(DEPDIR)/nabi-preference.Tpo -c -o nabi-preference.obj `if test -f 'preference.c'; then $(CYGPATH_W) 'preference.c'; else $(CYGPATH_W) '$(srcdir)/preference.c'; fi` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/nabi-preference.Tpo $(DEPDIR)/nabi-preference.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='preference.c' object='nabi-preference.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nabi_CFLAGS) $(CFLAGS) -c -o nabi-preference.obj `if test -f 'preference.c'; then $(CYGPATH_W) 'preference.c'; else $(CYGPATH_W) '$(srcdir)/preference.c'; fi` nabi-handlebox.o: handlebox.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nabi_CFLAGS) $(CFLAGS) -MT nabi-handlebox.o -MD -MP -MF $(DEPDIR)/nabi-handlebox.Tpo -c -o nabi-handlebox.o `test -f 'handlebox.c' || echo '$(srcdir)/'`handlebox.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/nabi-handlebox.Tpo $(DEPDIR)/nabi-handlebox.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='handlebox.c' object='nabi-handlebox.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nabi_CFLAGS) $(CFLAGS) -c -o nabi-handlebox.o `test -f 'handlebox.c' || echo '$(srcdir)/'`handlebox.c nabi-handlebox.obj: handlebox.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nabi_CFLAGS) $(CFLAGS) -MT nabi-handlebox.obj -MD -MP -MF $(DEPDIR)/nabi-handlebox.Tpo -c -o nabi-handlebox.obj `if test -f 'handlebox.c'; then $(CYGPATH_W) 'handlebox.c'; else $(CYGPATH_W) '$(srcdir)/handlebox.c'; fi` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/nabi-handlebox.Tpo $(DEPDIR)/nabi-handlebox.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='handlebox.c' object='nabi-handlebox.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nabi_CFLAGS) $(CFLAGS) -c -o nabi-handlebox.obj `if test -f 'handlebox.c'; then $(CYGPATH_W) 'handlebox.c'; else $(CYGPATH_W) '$(srcdir)/handlebox.c'; fi` nabi-util.o: util.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nabi_CFLAGS) $(CFLAGS) -MT nabi-util.o -MD -MP -MF $(DEPDIR)/nabi-util.Tpo -c -o nabi-util.o `test -f 'util.c' || echo '$(srcdir)/'`util.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/nabi-util.Tpo $(DEPDIR)/nabi-util.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='util.c' object='nabi-util.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nabi_CFLAGS) $(CFLAGS) -c -o nabi-util.o `test -f 'util.c' || echo '$(srcdir)/'`util.c nabi-util.obj: util.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nabi_CFLAGS) $(CFLAGS) -MT nabi-util.obj -MD -MP -MF $(DEPDIR)/nabi-util.Tpo -c -o nabi-util.obj `if test -f 'util.c'; then $(CYGPATH_W) 'util.c'; else $(CYGPATH_W) '$(srcdir)/util.c'; fi` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/nabi-util.Tpo $(DEPDIR)/nabi-util.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='util.c' object='nabi-util.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nabi_CFLAGS) $(CFLAGS) -c -o nabi-util.obj `if test -f 'util.c'; then $(CYGPATH_W) 'util.c'; else $(CYGPATH_W) '$(srcdir)/util.c'; fi` nabi-ustring.o: ustring.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nabi_CFLAGS) $(CFLAGS) -MT nabi-ustring.o -MD -MP -MF $(DEPDIR)/nabi-ustring.Tpo -c -o nabi-ustring.o `test -f 'ustring.c' || echo '$(srcdir)/'`ustring.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/nabi-ustring.Tpo $(DEPDIR)/nabi-ustring.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ustring.c' object='nabi-ustring.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nabi_CFLAGS) $(CFLAGS) -c -o nabi-ustring.o `test -f 'ustring.c' || echo '$(srcdir)/'`ustring.c nabi-ustring.obj: ustring.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nabi_CFLAGS) $(CFLAGS) -MT nabi-ustring.obj -MD -MP -MF $(DEPDIR)/nabi-ustring.Tpo -c -o nabi-ustring.obj `if test -f 'ustring.c'; then $(CYGPATH_W) 'ustring.c'; else $(CYGPATH_W) '$(srcdir)/ustring.c'; fi` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/nabi-ustring.Tpo $(DEPDIR)/nabi-ustring.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ustring.c' object='nabi-ustring.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nabi_CFLAGS) $(CFLAGS) -c -o nabi-ustring.obj `if test -f 'ustring.c'; then $(CYGPATH_W) 'ustring.c'; else $(CYGPATH_W) '$(srcdir)/ustring.c'; fi` nabi-keyboard-layout.o: keyboard-layout.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nabi_CFLAGS) $(CFLAGS) -MT nabi-keyboard-layout.o -MD -MP -MF $(DEPDIR)/nabi-keyboard-layout.Tpo -c -o nabi-keyboard-layout.o `test -f 'keyboard-layout.c' || echo '$(srcdir)/'`keyboard-layout.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/nabi-keyboard-layout.Tpo $(DEPDIR)/nabi-keyboard-layout.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='keyboard-layout.c' object='nabi-keyboard-layout.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nabi_CFLAGS) $(CFLAGS) -c -o nabi-keyboard-layout.o `test -f 'keyboard-layout.c' || echo '$(srcdir)/'`keyboard-layout.c nabi-keyboard-layout.obj: keyboard-layout.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nabi_CFLAGS) $(CFLAGS) -MT nabi-keyboard-layout.obj -MD -MP -MF $(DEPDIR)/nabi-keyboard-layout.Tpo -c -o nabi-keyboard-layout.obj `if test -f 'keyboard-layout.c'; then $(CYGPATH_W) 'keyboard-layout.c'; else $(CYGPATH_W) '$(srcdir)/keyboard-layout.c'; fi` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/nabi-keyboard-layout.Tpo $(DEPDIR)/nabi-keyboard-layout.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='keyboard-layout.c' object='nabi-keyboard-layout.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nabi_CFLAGS) $(CFLAGS) -c -o nabi-keyboard-layout.obj `if test -f 'keyboard-layout.c'; then $(CYGPATH_W) 'keyboard-layout.c'; else $(CYGPATH_W) '$(srcdir)/keyboard-layout.c'; fi` nabi-main.o: main.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nabi_CFLAGS) $(CFLAGS) -MT nabi-main.o -MD -MP -MF $(DEPDIR)/nabi-main.Tpo -c -o nabi-main.o `test -f 'main.c' || echo '$(srcdir)/'`main.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/nabi-main.Tpo $(DEPDIR)/nabi-main.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='main.c' object='nabi-main.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nabi_CFLAGS) $(CFLAGS) -c -o nabi-main.o `test -f 'main.c' || echo '$(srcdir)/'`main.c nabi-main.obj: main.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nabi_CFLAGS) $(CFLAGS) -MT nabi-main.obj -MD -MP -MF $(DEPDIR)/nabi-main.Tpo -c -o nabi-main.obj `if test -f 'main.c'; then $(CYGPATH_W) 'main.c'; else $(CYGPATH_W) '$(srcdir)/main.c'; fi` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/nabi-main.Tpo $(DEPDIR)/nabi-main.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='main.c' object='nabi-main.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nabi_CFLAGS) $(CFLAGS) -c -o nabi-main.obj `if test -f 'main.c'; then $(CYGPATH_W) 'main.c'; else $(CYGPATH_W) '$(srcdir)/main.c'; fi` ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) installdirs: for dir in "$(DESTDIR)$(bindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-binPROGRAMS clean-generic mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binPROGRAMS install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ clean-generic ctags distclean distclean-compile \ distclean-generic distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-binPROGRAMS \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \ uninstall-am uninstall-binPROGRAMS # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: nabi-1.0.0/src/nabi.h0000644000175000017500000000365111655153252011225 00000000000000/* Nabi - X Input Method server for hangul * Copyright (C) 2003-2009 Choe Hwanjin * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #ifndef __NABI_H_ #define __NABI_H_ #include #include #include "conf.h" typedef struct _NabiApplication NabiApplication; struct _NabiApplication { gchar* xim_name; GtkWidget* palette; GtkWidget* keyboard_button; GtkWidget* tray_icon; gboolean status_only; gchar* session_id; int icon_size; /* hangul status data */ GdkWindow *root_window; GdkAtom mode_info_atom; GdkAtom mode_info_type; Atom mode_info_xatom; /* config data */ NabiConfig* config; }; extern NabiApplication* nabi; void nabi_app_new(void); void nabi_app_init(int *argc, char ***argv); void nabi_app_setup_server(void); void nabi_app_quit(void); void nabi_app_free(void); void nabi_app_save_config(void); void nabi_app_set_theme(const char *name); void nabi_app_use_tray_icon(gboolean use); void nabi_app_show_palette(gboolean state); void nabi_app_set_hanja_mode(gboolean state); void nabi_app_set_hangul_keyboard(const char *id); GtkWidget* nabi_app_create_palette(void); #endif /* __NABI_H_ */ /* vim: set ts=8 sw=4 : */ nabi-1.0.0/src/gettext.h0000644000175000017500000000613511655153252012000 00000000000000/* Convenience header for conditional use of GNU . Copyright (C) 1995-1998, 2000-2002 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _LIBGETTEXT_H #define _LIBGETTEXT_H 1 /* NLS can be disabled through the configure --disable-nls option. */ #if ENABLE_NLS /* Get declarations of GNU message catalog functions. */ # include # define _(x) gettext(x) # define N_(String) gettext_noop (String) #else /* Solaris /usr/include/locale.h includes /usr/include/libintl.h, which chokes if dcgettext is defined as a macro. So include it now, to make later inclusions of a NOP. We don't include as well because people using "gettext.h" will not include , and also including would fail on SunOS 4, whereas is OK. */ #if defined(__sun) # include #endif /* Disabled NLS. The casts to 'const char *' serve the purpose of producing warnings for invalid uses of the value returned from these functions. On pre-ANSI systems without 'const', the config.h file is supposed to contain "#define const". */ # define gettext(Msgid) ((const char *) (Msgid)) # define dgettext(Domainname, Msgid) ((const char *) (Msgid)) # define dcgettext(Domainname, Msgid, Category) ((const char *) (Msgid)) # define ngettext(Msgid1, Msgid2, N) \ ((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2)) # define dngettext(Domainname, Msgid1, Msgid2, N) \ ((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2)) # define dcngettext(Domainname, Msgid1, Msgid2, N, Category) \ ((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2)) # define textdomain(Domainname) ((const char *) (Domainname)) # define bindtextdomain(Domainname, Dirname) ((const char *) (Dirname)) # define bind_textdomain_codeset(Domainname, Codeset) ((const char *) (Codeset)) # define N_(String) (String) # define _(x) (x) #endif /* A pseudo function call that serves as a marker for the automated extraction of messages, but does not call gettext(). The run-time translation is done at a different place in the code. The argument, String, should be a literal string. Concatenated strings and other string expressions won't work. The macro's expansion is not parenthesized, so that it is suitable as initializer for static 'char[]' or 'const char[]' variables. */ #define gettext_noop(String) String #endif /* _LIBGETTEXT_H */ nabi-1.0.0/src/xim_protocol.h0000644000175000017500000001057211655153252013032 00000000000000static const char* xim_protocol_name[] = { "XIM_UNKNOWN", /* 0 */ "XIM_CONNECT", /* 1 */ "XIM_CONNECT_REPLY", /* 2 */ "XIM_DISCONNECT", /* 3 */ "XIM_DISCONNECT_REPLY", /* 4 */ "XIM_UNKNOWN", /* 5 */ "XIM_UNKNOWN", /* 6 */ "XIM_UNKNOWN", /* 7 */ "XIM_UNKNOWN", /* 8 */ "XIM_UNKNOWN", /* 9 */ "XIM_AUTH_REQUIRED", /* 10 */ "XIM_AUTH_REPLY", /* 11 */ "XIM_AUTH_NEXT", /* 12 */ "XIM_AUTH_SETUP", /* 13 */ "XIM_AUTH_NG", /* 14 */ "XIM_UNKNOWN", /* 15 */ "XIM_UNKNOWN", /* 16 */ "XIM_UNKNOWN", /* 17 */ "XIM_UNKNOWN", /* 18 */ "XIM_UNKNOWN", /* 19 */ "XIM_ERROR", /* 20 */ "XIM_UNKNOWN", /* 21 */ "XIM_UNKNOWN", /* 22 */ "XIM_UNKNOWN", /* 23 */ "XIM_UNKNOWN", /* 24 */ "XIM_UNKNOWN", /* 25 */ "XIM_UNKNOWN", /* 26 */ "XIM_UNKNOWN", /* 27 */ "XIM_UNKNOWN", /* 28 */ "XIM_UNKNOWN", /* 29 */ "XIM_OPEN", /* 30 */ "XIM_OPEN_REPLY", /* 31 */ "XIM_CLOSE", /* 32 */ "XIM_CLOSE_REPLY", /* 33 */ "XIM_REGISTER_TRIGGERKEYS", /* 34 */ "XIM_TRIGGER_NOTIFY", /* 35 */ "XIM_TRIGGER_NOTIFY_REPLY", /* 36 */ "XIM_SET_EVENT_MASK", /* 37 */ "XIM_ENCODING_NEGOTIATION", /* 38 */ "XIM_ENCODING_NEGOTIATION_REPLY", /* 39 */ "XIM_QUERY_EXTENSION", /* 40 */ "XIM_QUERY_EXTENSION_REPLY", /* 41 */ "XIM_SET_IM_VALUES", /* 42 */ "XIM_SET_IM_VALUES_REPLY", /* 43 */ "XIM_GET_IM_VALUES", /* 44 */ "XIM_GET_IM_VALUES_REPLY", /* 45 */ "XIM_UNKNOWN", /* 46 */ "XIM_UNKNOWN", /* 47 */ "XIM_UNKNOWN", /* 48 */ "XIM_UNKNOWN", /* 49 */ "XIM_CREATE_IC", /* 50 */ "XIM_CREATE_IC_REPLY", /* 51 */ "XIM_DESTROY_IC", /* 52 */ "XIM_DESTROY_IC_REPLY", /* 53 */ "XIM_SET_IC_VALUES", /* 54 */ "XIM_SET_IC_VALUES_REPLY", /* 55 */ "XIM_GET_IC_VALUES", /* 56 */ "XIM_GET_IC_VALUES_REPLY", /* 57 */ "XIM_SET_IC_FOCUS", /* 58 */ "XIM_UNSET_IC_FOCUS", /* 59 */ "XIM_FORWARD_EVENT", /* 60 */ "XIM_SYNC", /* 61 */ "XIM_SYNC_REPLY", /* 62 */ "XIM_COMMIT", /* 63 */ "XIM_RESET_IC", /* 64 */ "XIM_RESET_IC_REPLY", /* 65 */ "XIM_UNKNOWN", /* 66 */ "XIM_UNKNOWN", /* 67 */ "XIM_UNKNOWN", /* 68 */ "XIM_UNKNOWN", /* 69 */ "XIM_GEOMETRY", /* 70 */ "XIM_STR_CONVERSION", /* 71 */ "XIM_STR_CONVERSION_REPLY", /* 72 */ "XIM_PREEDIT_START", /* 73 */ "XIM_PREEDIT_START_REPLY", /* 74 */ "XIM_PREEDIT_DRAW", /* 75 */ "XIM_PREEDIT_CARET", /* 76 */ "XIM_PREEDIT_CARET_REPLY", /* 77 */ "XIM_PREEDIT_DONE", /* 78 */ "XIM_STATUS_START", /* 79 */ "XIM_STATUS_DRAW", /* 80 */ "XIM_STATUS_DONE", /* 81 */ }; nabi-1.0.0/src/default-icons.h0000644000175000017500000026120011655153252013045 00000000000000/* XPM */ static const char * none_default_xpm[] = { "144 96 149 2", " c None", ". c #4E4E4E", "+ c #181818", "@ c #717171", "# c #5D5D5D", "$ c #616161", "% c #484848", "& c #000000", "* c #6E6E6E", "= c #545454", "- c #161616", "; c #5B5B5B", "> c #505050", ", c #464646", "' c #191919", ") c #ABABAB", "! c #373737", "~ c #8C8C8C", "{ c #121212", "] c #101010", "^ c #080808", "/ c #606060", "( c #272727", "_ c #383838", ": c #696969", "< c #747474", "[ c #636363", "} c #292929", "| c #757575", "1 c #595959", "2 c #1E1E1E", "3 c #878787", "4 c #737373", "5 c #9F9F9F", "6 c #9D9D9D", "7 c #9C9C9C", "8 c #808080", "9 c #565656", "0 c #8A8A8A", "a c #5F5F5F", "b c #A4A4A4", "c c #151515", "d c #535353", "e c #AFAFAF", "f c #929292", "g c #959595", "h c #4A4A4A", "i c #777777", "j c #1D1D1D", "k c #6B6B6B", "l c #404040", "m c #9E9E9E", "n c #494949", "o c #A8A8A8", "p c #686868", "q c #3C3C3C", "r c #797979", "s c #848484", "t c #242424", "u c #939393", "v c #8B8B8B", "w c #4D4D4D", "x c #1B1B1B", "y c #A9A9A9", "z c #0E0E0E", "A c #787878", "B c #828282", "C c #515151", "D c #0C0C0C", "E c #979797", "F c #6F6F6F", "G c #6D6D6D", "H c #7D7D7D", "I c #ADADAD", "J c #5C5C5C", "K c #212121", "L c #424242", "M c #262626", "N c #555555", "O c #4B4B4B", "P c #050505", "Q c #323232", "R c #7A7A7A", "S c #3A3A3A", "T c #7C7C7C", "U c #909090", "V c #8D8D8D", "W c #666666", "X c #8F8F8F", "Y c #767676", "Z c #ACACAC", "` c #898989", " . c #818181", ".. c #303030", "+. c #868686", "@. c #888888", "#. c #2A2A2A", "$. c #454545", "%. c #838383", "&. c #3E3E3E", "*. c #1F1F1F", "=. c #131313", "-. c #A1A1A1", ";. c #5E5E5E", ">. c #676767", ",. c #0A0A0A", "'. c #A3A3A3", "). c #363636", "!. c #919191", "~. c #9A9A9A", "{. c #202020", "]. c #AAAAAA", "^. c #A7A7A7", "/. c #2C2C2C", "(. c #727272", "_. c #313131", ":. c #6C6C6C", "<. c #3F3F3F", "[. c #343434", "}. c #A2A2A2", "|. c #252525", "1. c #1A1A1A", "2. c #585858", "3. c #626262", "4. c #5A5A5A", "5. c #646464", "6. c #989898", "7. c #6A6A6A", "8. c #969696", "9. c #8E8E8E", "0. c #3B3B3B", "a. c #282828", "b. c #4F4F4F", "c. c #7F7F7F", "d. c #474747", "e. c #949494", "f. c #9B9B9B", "g. c #4C4C4C", "h. c #333333", "i. c #414141", "j. c #AEAEAE", "k. c #575757", "l. c #7B7B7B", "m. c #858585", "n. c #999999", "o. c #2F2F2F", "p. c #A5A5A5", "q. c #A6A6A6", "r. c #434343", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " . + + + + + + + + + + @ # # # # # # # # # # # $ 7 ~ ~ ~ ~ ~ ~ o # # # # # # # # # # # $ ", " % & & & & & & & & & & * & & & & & & & & & & & + ..& & & & & & b & & & & & & & & & & & + ", " = - & & & & & & & & & * & & & & & & & & & & & + g & & & & & & $. %./ &.*.P & =.} O : f & & & & & & & & & & & + ", " ; & & & & & & & & * > , ' & & & & & & & & + a & & & & & & 8 -.;.] & & & & & & & & & & & t @ > , ' & & & & & & & & + ", " ) & & & & & & & & * ) ! & & & & & & & + ' & & & & & c >.,.& & & & & & & & & & & & & & & j H ) ! & & & & & & & + ", " & & & & & & & & * ~ & & & & & & & + %.& & & & & & ; '.).& & & & & & & & & & & & & & & & & & & w ~ & & & & & & & + ", " & & & & & & & & * & & & & & & & + h & & & & & & !. ~.{.& & & & & & & & & & & & & & & & & & & & & Q ]. & & & & & & & + ", " & & & & & & & & * & & & & & & & + ^.& & & & & & /. 5 2 & & & & & & & & & & ^ j & & & & & & & & & & & ). & & & & & & & + ", " { { { { { { { { { { { { { { ] & & & & & & & & ^ { { { { { { { { { { { { { { / & & & & & & & + (.& & & & & & * _.& & & & & & & & c :.m !.; & & & & & & & & & = & & & & & & & + ", " & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & # & & & & & & & + _.& & & & & & b $ & & & & & & & & <.^. g t & & & & & & & & [._ _ _ _ _ _ _ _ _ _ _ _ ).& & & & & & & + ", " & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & # & & & & & & & + g & & & & & & $. m P & & & & & & & L }.|.& & & & & & & & & & & & & & & & & & & & & & & & & & & & + ", " & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & # & & & & & & & + / & & & & & & 8 J & & & & & & & {.o f P & & & & & & & & & & & & & & & & & & & & & & & & & & & + ", " & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & # & & & & & & & + 1.& & & & & c c & & & & & & & r ; & & & & & & & & & & & & & & & & & & & & & & & & & & & + ", " { { { { { { { ^ & & & & & & & & & & & & & & & & & & & & & & & ] { { { { { { / & & & & & & & + %.& & & & & & ; X & & & & & & & ' m & & & & & & & & & & & & & & & & & & & & & & & & & & & + ", " ( & & & & & & & & & _ : < [ } & & & & & & & & & | & & & & & & & + O & & & & & & !. < & & & & & & & C /.& & & & & & & & & & & & & & & & & & & & & & & & & & + ", " 1 & & & & & & & & 2 3 4 ^ & & & & & & & ] 5 & & & & & & & + o P & & & & & /. $ & & & & & & & F d & & & & & & & A j.& & & & & & & + ", " 6 & & & & & & & & 2 7 8 & & & & & & & & 9 & & & & & & & + (.& & & & & & * 2.& & & & & & & R $ & & & & & & & @ & & & & & & & + ", " ; & & & & & & & & 0 a & & & & & & & ^ b & & & & & & & & { { { { { { { { 3. _.& & & & & & b 4.& & & & & & & A ;.& & & & & & & (. & & & & & & & + ", " c & & & & & & & d e - & & & & & & & | & & & & & & & & & & & & & & & & / g & & & & & & $. 5.& & & & & & & k . & & & & & & & H & & & & & & & + ", " f & & & & & & & & g / & & & & & & & h & & & & & & & & & & & & & & & & / / & & & & & & 8 r & & & & & & & $. 2 & & & & & & & j M M M M M M M M M M t & & & & & & & + ", " i & & & & & & & j 3 & & & & & & & 2 & & & & & & & & & & & & & & & & / 1.& & & & & c 6.& & & & & & & D ]. U & & & & & & & & & & & & & & & & & & & & & & & & & & & + ", " k & & & & & & & l m & & & & & & & & & & & & & & & & & & & & & & & & / %.& & & & & & ; t & & & & & & & >. , & & & & & & & & & & & & & & & & & & & & & & & & & & & + ", " $ & & & & & & & n o & & & & & & & & & & & & & & & & & & & & & & & & / O & & & & & & !. 7.& & & & & & & ,.8. T & & & & & & & & & & & & & & & & & & & & & & & & & & & & + ", " p & & & & & & & q m & & & & & & & & & & & & & & & - o P & & & & & /. ].=.& & & & & & & } }. V ] & & & & & & & & & & & & & & & & & & & & & & & & & & & & + ", " r & & & & & & & { s & & & & & & & t & & & & & & & + 4 & & & & & & * < & & & & & & & & |.9. A D & & & & & & & & + + + + + + + + + + + + + - & & & & & & & + ", " u & & & & & & & & v ; & & & & & & & w & & & & & & & + Q & & & & & & b % & & & & & & & & & O .~.b 8.Y ! & & & & & & & & & k & & & & & & & + ", " x & & & & & & & % y z & & & & & & & A & & & & & & & + 8.& & & & & & $. I ).& & & & & & & & & & & & & & & & & & & & & & & C & & & & & & & + ", " [ & & & & & & & & B C & & & & & & & z ) & & & & & & & + / & & & & & & 8 ) 0.& & & & & & & & & & & & & & & & & & & & & = & & & & & & & + ", " b D & & & & & & & - E F & & & & & & & & [ & & & & & & & + 1.& & & & & c N & & & & & & & & & & & & & & & & & & ^ (. & & & & & & & + ", " G & & & & & & & & + H I J & & & & & & & & K I & & & & & & & + s & & & & & & ; %.a.& & & & & & & & & & & & & & & L 7 & & & & & & & + ", " L & & & & & & & & & M N / O z & & & & & & & & P ~ & & & & & & & + O & & & & & & !. T S & & & & & & & & & & D b.U & & & & & & & + ", " ) Q & & & & & & & & & & & & & & & & & & & & & R & & & & & & & + o P & & & & & /. }.c.[ . L &.d.= G @. & & & & & & & + ", " y S & & & & & & & & & & & & & & & & & & ^ T & & & & & & & + 4 & & & & & & * & & & & & & & + ", " ; & & & & & & & & & & & & & & & & ( U & & & & & & & + Q & & & & & & b ].e.+. .%.v 6 & & & & & & & + ", " V _ & & & & & & & & & & & & { W & & & & & & & + 8.& & & & & & $. !.$ /.& & & & & & & ] $.i Z & & & & & & & + ", " X J M & & & & & & D L Y Z & & & & & & & + / & & & & & & 8 0 _ & & & & & & & & & & & & & ] 3.) ", " o u ` 3 V 6 & & & & & & & + 1.& & & & & c ) C & & & & & & & & & & & & & & & & & x B ", " & & & & & & & + s & & & & & & ; f.#.& & & & & & & & & & & & & & & & & & & & 5. ", " & & & & & & & + g.& & & & & & !. E 1.& & & & & & & & & & & & & & & & & & & & & & k. ", " & & & & & & & + o P & & & & & /. '.*.& & & & & & & & & |.N 5.;.$.^ & & & & & & & & & [ ", " & & & & & & & + 4 & & & & & & * 0.& & & & & & & & [.~ I p D & & & & & & & & s ", " .K K K K K K K K K K K w & & & & & & & + h.& & & & & & b | & & & & & & & & b. !.x & & & & & & & {. ", " H & & & & & & & & & & & L & & & & & & & + 8.& & & & & & $. 2 & & & & & & & i. !.^ & & & & & & & F ", " H & & & & & & & & & & & L & & & & & & & + $ & & & & & & 8 8 & & & & & & & D b 7.& & & & & & & a. ", " 5 H F ..& & & & & & & & L +.+.+.+.+.+.+.@. x & & & & & c C & & & & & & & J I { & & & & & & & 6. ", " #.& & & & & & & L s & & & & & & ; {.& & & & & & & 0 g.& & & & & & & i ", " :.& & & & & & & L g.& & & & & & !. & & & & & & & & ) F & & & & & & & $ ", " R & & & & & & & L o P & & & & & /. p.& & & & & & & & T & & & & & & & k. ", " l.& & & & & & & L 4 & & & & & & * p.& & & & & & & & T & & & & & & & k. ", " l.& & & & & & & L h.& & & & & & b & & & & & & & & ) F & & & & & & & $ ", " l.& & & & & & & L 8.& & & & & & $. {.& & & & & & & v w & & & & & & & i ", " l.& & & & & & & L $ & & & & & & 8 C & & & & & & & ;. j.=.& & & & & & & 6. ", " l.& & & & & & & L x & & & & & c c.& & & & & & & z q. :.& & & & & & & ( ", " l.& & & & & & & L m.& & & & & & ; j & & & & & & & $. e.,.& & & & & & & F ", " l.& & & & & & & M I w & & & & & & !. < & & & & & & & & d g {.& & & & & & & *. ", " T & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & / y P & & & & & /. S & & & & & & & & _ X :.] & & & & & & & & %. ", " B & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & / < & & & & & & * }.j & & & & & & & & & #.2.>.$ n D & & & & & & & & & $ ", " n.& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & / [.& & & & & & b g ' & & & & & & & & & & & & & & & & & & & & & & N ", " o.& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & / E & & & & & & $. n.a.& & & & & & & & & & & & & & & & & & & & $ ", " f =.& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & / -.@.@.@.@.@.@.5 ].. & & & & & & & & & & & & & & & & & 1.8 ", " -./ Q - ,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.$ @.).& & & & & & & & & & & & & z / ]. ", " !.a } & & & & & & & z r.Y ) ", " ].u +.8 %.0 7 ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "}; /* XPM */ const static char * hangul_default_xpm[] = { "144 96 116 2", " c None", ". c #4F4F4F", "+ c #1B1B1B", "@ c #6F6F6F", "# c #5D5D5D", "$ c #616161", "% c #494949", "& c #000000", "* c #6C6C6C", "= c #555555", "- c #191919", "; c #5B5B5B", "> c #515151", ", c #484848", "' c #1C1C1C", ") c #9F9F9F", "! c #3A3A3A", "~ c #868686", "{ c #151515", "] c #131313", "^ c #0A0A0A", "/ c #606060", "( c #2A2A2A", "_ c #3B3B3B", ": c #686868", "< c #717171", "[ c #626262", "} c #2C2C2C", "| c #727272", "1 c #595959", "2 c #212121", "3 c #818181", "4 c #707070", "5 c #969696", "6 c #949494", "7 c #939393", "8 c #7C7C7C", "9 c #565656", "0 c #848484", "a c #5E5E5E", "b c #9A9A9A", "c c #181818", "d c #545454", "e c #A3A3A3", "f c #5F5F5F", "g c #8A8A8A", "h c #8D8D8D", "i c #4B4B4B", "j c #747474", "k c #202020", "l c #828282", "m c #696969", "n c #424242", "o c #959595", "p c #9D9D9D", "q c #676767", "r c #3F3F3F", "s c #757575", "t c #7F7F7F", "u c #272727", "v c #8C8C8C", "w c #858585", "x c #4E4E4E", "y c #1F1F1F", "z c #9E9E9E", "A c #111111", "B c #7E7E7E", "C c #525252", "D c #A0A0A0", "E c #0F0F0F", "F c #8F8F8F", "G c #6D6D6D", "H c #6B6B6B", "I c #797979", "J c #A2A2A2", "K c #5C5C5C", "L c #252525", "M c #444444", "N c #292929", "O c #4D4D4D", "P c #070707", "Q c #353535", "R c #767676", "S c #3C3C3C", "T c #787878", "U c #898989", "V c #878787", "W c #646464", "X c #888888", "Y c #737373", "Z c #8B8B8B", "` c #7D7D7D", " . c #333333", ".. c #808080", "+. c #2D2D2D", "@. c #6A6A6A", "#. c #777777", "$. c #919191", "%. c #161616", "&. c #979797", "*. c #0D0D0D", "=. c #7B7B7B", "-. c #585858", ";. c #9B9B9B", ">. c #929292", ",. c #666666", "'. c #636363", "). c #454545", "!. c #383838", "~. c #2B2B2B", "{. c #575757", "]. c #999999", "^. c #313131", "/. c #1E1E1E", "(. c #A1A1A1", "_. c #5A5A5A", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " . + + + + + + + + + + @ # # # # # # # # # # # $ ", " % & & & & & & & & & & * & & & & & & & & & & & + ", " = - & & & & & & & & & * & & & & & & & & & & & + ~ # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # [ ", " ; & & & & & & & & * > , ' & & & & & & & & + | & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & J ", " ) & & & & & & & & * ) ! & & & & & & & + | & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & J ", " & & & & & & & & * ~ & & & & & & & + | & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & J ", " & & & & & & & & * & & & & & & & + | & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & J ", " & & & & & & & & * & & & & & & & + | & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & J ", " { { { { { { { { { { { { { { ] & & & & & & & & ^ { { { { { { { { { { { { { { / & & & & & & & + o ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` =.-.& & & & & & & & J ", " & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & # & & & & & & & + ;.& & & & & & & & J ", " & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & # & & & & & & & + z & & & & & & & & J ", " & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & # & & & & & & & + z & & & & & & & & J ", " & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & # & & & & & & & + z & & & & & & & & J ", " { { { { { { { ^ & & & & & & & & & & & & & & & & & & & & & & & ] { { { { { { / & & & & & & & + p & & & & & & & & J ", " ( & & & & & & & & & _ : < [ } & & & & & & & & & | & & & & & & & + ;.& & & & & & & & ", " 1 & & & & & & & & 2 3 4 ^ & & & & & & & ] 5 & & & & & & & + &.& & & & & & & & ", " 6 & & & & & & & & 2 7 8 & & & & & & & & 9 & & & & & & & + >.& & & & & & & & ", " ; & & & & & & & & 0 a & & & & & & & ^ b & & & & & & & & { { { { { { { { $ U & & & & & & & E ", " c & & & & & & & d e - & & & & & & & | & & & & & & & & & & & & & & & & f B & & & & & & & ( ", " g & & & & & & & & h / & & & & & & & i & & & & & & & & & & & & & & & & f H & & & & & & & M ", " j & & & & & & & k l & & & & & & & 2 & & & & & & & & & & & & & & & & f , & & & & & & & ,. ", " m & & & & & & & n o & & & & & & & & & & & & & & & & & & & & & & & & f { & & & & & & & U ", " $ & & & & & & & i p & & & & & & & & & & & & & & & & & & & & & & & & f < & & & & & & & S ", " q & & & & & & & r 6 & & & & & & & & & & & & & & & - '.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.L & & & & & & & ).'.'.'.'.'.'.'.0 ", " s & & & & & & & { t & & & & & & & u & & & & & & & + & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & : ", " v & & & & & & & & w ; & & & & & & & x & & & & & & & + & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & : ", " y & & & & & & & % z A & & & & & & & s & & & & & & & + & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & : ", " [ & & & & & & & & B C & & & & & & & A D & & & & & & & + & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & : ", " b E & & & & & & & - F G & & & & & & & & [ & & & & & & & + & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & : ", " H & & & & & & & & + I J K & & & & & & & & L J & & & & & & & + X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X &. ", " M & & & & & & & & & N 9 f O A & & & & & & & & P ~ & & & & & & & + ", " ) Q & & & & & & & & & & & & & & & & & & & & & R & & & & & & & + ", " z S & & & & & & & & & & & & & & & & & & ^ T & & & & & & & + ", " ; & & & & & & & & & & & & & & & & ( U & & & & & & & + ", " V _ & & & & & & & & & & & & { W & & & & & & & + ", " X K N & & & & & & E M Y D & & & & & & & + 0 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * G ) ", " p Z 0 l V 6 & & & & & & & + f & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & t ", " & & & & & & & + f & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & t ", " & & & & & & & + f & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & t ", " & & & & & & & + f & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & t ", " & & & & & & & + W k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k ^ & & & & & & & t ", " ` L L L L L L L L L L L x & & & & & & & + M & & & & & & & t ", " I & & & & & & & & & & & M & & & & & & & + M & & & & & & & t ", " I & & & & & & & & & & & M & & & & & & & + M & & & & & & & t ", " 5 I G .& & & & & & & & M ..............l M & & & & & & & t ", " +.& & & & & & & M Z g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g !.& & & & & & & t ", " @.& & & & & & & M k & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & t ", " #.& & & & & & & M k & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & t ", " #.& & & & & & & M k & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & t ", " #.& & & & & & & M $.. & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & t ", " #.& & & & & & & M ~.& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & A 6 ", " #.& & & & & & & M {.& & & & & & & ; ].].].].].].].].].].].].].].].].].].].].].].].].].].].].].].].]. ", " #.& & & & & & & M f & & & & & & & '. ", " #.& & & & & & & M f & & & & & & & '. ", " #.& & & & & & & N J f & & & & & & & '. ", " T & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & f f & & & & & & & '. ", " B & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & f $ & & & & & & & ' ^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^. ", " $.& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & f @.& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & ", " .& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & f t & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & ", " g %.& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & f /.& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & ", " &./ Q - *.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*./ 0 c & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & ", " (.I '._.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-. ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "}; /* XPM */ const static char * english_default_xpm[] = { "144 96 138 2", " c None", ". c #5D5D5D", "+ c #616161", "@ c #000000", "# c #1B1B1B", "$ c #7F7F7F", "% c #606060", "& c #404040", "* c #232323", "= c #070707", "- c #161616", "; c #2C2C2C", "> c #4C4C4C", ", c #686868", "' c #8B8B8B", ") c #979797", "! c #131313", "~ c #272727", "{ c #6F6F6F", "] c #515151", "^ c #484848", "/ c #1C1C1C", "( c #666666", "_ c #0D0D0D", ": c #202020", "< c #797979", "[ c #9F9F9F", "} c #3A3A3A", "| c #999999", "1 c #383838", "2 c #4E4E4E", "3 c #868686", "4 c #919191", "5 c #242424", "6 c #353535", "7 c #9E9E9E", "8 c #969696", "9 c #212121", "0 c #0A0A0A", "a c #343434", "b c #181818", "c c #6A6A6A", "d c #949494", "e c #8A8A8A", "f c #5B5B5B", "g c #555555", "h c #414141", "i c #9C9C9C", "j c #8D8D8D", "k c #373737", "l c #3B3B3B", "m c #959595", "n c #444444", "o c #989898", "p c #282828", "q c #5C5C5C", "r c #9D9D9D", "s c #757575", "t c #898989", "u c #717171", "v c #525252", "w c #2F2F2F", "x c #6D6D6D", "y c #545454", "z c #A2A2A2", "A c #585858", "B c #777777", "C c #5A5A5A", "D c #5E5E5E", "E c #636363", "F c #696969", "G c #4F4F4F", "H c #474747", "I c #292929", "J c #8F8F8F", "K c #0F0F0F", "L c #8E8E8E", "M c #787878", "N c #727272", "O c #878787", "P c #191919", "Q c #4A4A4A", "R c #7C7C7C", "S c #929292", "T c #9A9A9A", "U c #737373", "V c #3D3D3D", "W c #565656", "X c #707070", "Y c #2B2B2B", "Z c #454545", "` c #939393", " . c #3C3C3C", ".. c #505050", "+. c #7B7B7B", "@. c #626262", "#. c #494949", "$. c #6B6B6B", "%. c #828282", "&. c #8C8C8C", "*. c #818181", "=. c #858585", "-. c #747474", ";. c #A0A0A0", ">. c #848484", ",. c #1F1F1F", "'. c #7E7E7E", "). c #2D2D2D", "!. c #1E1E1E", "~. c #3E3E3E", "{. c #676767", "]. c #434343", "^. c #151515", "/. c #4D4D4D", "(. c #9B9B9B", "_. c #111111", ":. c #2A2A2A", "<. c #888888", "[. c #4B4B4B", "}. c #838383", "|. c #5F5F5F", "1. c #808080", "2. c #7A7A7A", "3. c #323232", "4. c #313131", "5. c #333333", "6. c #7D7D7D", "7. c #424242", "8. c #595959", "9. c #303030", "0. c #535353", "a. c #3F3F3F", "b. c #252525", "c. c #363636", "d. c #393939", "e. c #6C6C6C", "f. c #6E6E6E", "g. c #767676", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " . . . . . . . . . . . + 2.. . . . . . . . . . . m ", " @ @ @ @ @ @ @ @ @ @ @ # f @ @ @ @ @ @ @ @ @ @ @ <. ", " $ % & * = @ - ; > , ' @ @ @ @ @ @ @ @ @ @ @ # f @ @ @ @ @ @ @ @ @ @ @ <. ", " ) . ! @ @ @ @ @ @ @ @ @ @ @ ~ { ] ^ / @ @ @ @ @ @ @ @ # -.G 3.@ @ @ @ @ @ @ @ @ <. ", " ( _ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ : < [ } @ @ @ @ @ @ @ # $.@ @ @ @ @ @ @ @ <. ", " | 1 @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ 2 3 @ @ @ @ @ @ @ # i R + > } 4.5.~.v c >. 4.@ @ @ @ @ @ @ <. ", " 4 5 @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ 6 7 @ @ @ @ @ @ @ # 6.7.@ @ @ @ @ @ @ @ @ @ @ ^.A L W @ @ @ @ @ @ @ <. ", " 8 9 @ @ @ @ @ @ @ @ @ @ 0 : @ @ @ @ @ @ @ @ @ @ @ 1 @ @ @ @ @ @ @ # >.3.@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ ..| f @ @ @ @ @ @ @ <. ", " a @ @ @ @ @ @ @ @ b c d e f @ @ @ @ @ @ @ @ @ g @ @ @ @ @ @ @ # 8.@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ - < f @ @ @ @ @ @ @ <. ", " % @ @ @ @ @ @ @ @ h i j ~ @ @ @ @ @ @ @ @ k l l l l l l l l l l l l 1 @ @ @ @ @ @ @ # r l @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ % f @ @ @ @ @ @ @ <. ", " m = @ @ @ @ @ @ @ n o p @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ # r 9.@ @ @ @ @ @ @ @ @ @ @ / _.@ @ @ @ @ @ @ @ @ @ @ W f @ @ @ @ @ @ @ <. ", " q @ @ @ @ @ @ @ 5 r e = @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ # 1 @ @ @ @ @ @ @ @ @ y =. [ +.n @ @ @ @ @ @ @ @ @ + f @ @ @ @ @ @ @ <. ", " b @ @ @ @ @ @ @ s f @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ # 0.@ @ @ @ @ @ @ @ ; <. B - @ @ @ @ @ @ @ @ R f @ @ @ @ @ @ @ <. ", " t @ @ @ @ @ @ @ / m @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ # $ @ @ @ @ @ @ @ @ w (. O K @ @ @ @ @ @ @ ,.7 f @ @ @ @ @ @ @ <. ", " u @ @ @ @ @ @ @ v w @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ # I @ @ @ @ @ @ @ / o 2.@ @ @ @ @ @ @ @ D f @ @ @ @ @ @ @ <. ", " % @ @ @ @ @ @ @ x y @ @ @ @ @ @ @ s z @ @ @ @ @ @ @ # B @ @ @ @ @ @ @ @ +. [.@ @ @ @ @ @ @ _ r f @ @ @ @ @ @ @ <. ", " A @ @ @ @ @ @ @ B % @ @ @ @ @ @ @ { @ @ @ @ @ @ @ # .@ @ @ @ @ @ @ 7. 8 @ @ @ @ @ @ @ @ { f @ @ @ @ @ @ @ <. ", " C @ @ @ @ @ @ @ s D @ @ @ @ @ @ @ { @ @ @ @ @ @ @ # o @ @ @ @ @ @ @ @ *. /.@ @ @ @ @ @ @ a. f @ @ @ @ @ @ @ <. ", " E @ @ @ @ @ @ @ F G @ @ @ @ @ @ @ < @ @ @ @ @ @ @ # 2.@ @ @ @ @ @ @ # $ @ @ @ @ @ @ @ @ f @ @ @ @ @ @ @ <. ", " s @ @ @ @ @ @ @ H 9 @ @ @ @ @ @ @ : I I I I I I I I I I ~ @ @ @ @ @ @ @ # @.@ @ @ @ @ @ @ G r @ @ @ @ @ @ @ @ u >.>.>.>.>.>.>.>.#.@ @ @ @ @ @ @ <. ", " J @ @ @ @ @ @ @ K [ t @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ # G @ @ @ @ @ @ @ c b.@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ <. ", " ~ @ @ @ @ @ @ @ ( ^ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ # n @ @ @ @ @ @ @ -. 1 @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ <. ", " , @ @ @ @ @ @ @ _ L M @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ # & @ @ @ @ @ @ @ M 7.@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ <. ", " [ - @ @ @ @ @ @ @ ; o 3 ! @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ # H @ @ @ @ @ @ @ X c.@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ <. ", " N @ @ @ @ @ @ @ @ p O s K @ @ @ @ @ @ @ @ # # # # # # # # # # # # # P @ @ @ @ @ @ @ # W @ @ @ @ @ @ @ E ,.@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ <. ", " Q @ @ @ @ @ @ @ @ @ > R S T L U } @ @ @ @ @ @ @ @ @ F @ @ @ @ @ @ @ # $.@ @ @ @ @ @ @ a. ) @ @ @ @ @ @ @ @ /.0.0.0.0.0.0.0.0.).@ @ @ @ @ @ @ <. ", " z 1 @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ v @ @ @ @ @ @ @ # =.@ @ @ @ @ @ @ = z M @ @ @ @ @ @ @ b. f @ @ @ @ @ @ @ <. ", " [ V @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ g @ @ @ @ @ @ @ # ! @ @ @ @ @ @ @ u ~.@ @ @ @ @ @ @ f f @ @ @ @ @ @ @ <. ", " W @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ 0 X @ @ @ @ @ @ @ # W @ @ @ @ @ @ @ ). e @ @ @ @ @ @ @ @ }. f @ @ @ @ @ @ @ <. ", " $ Y @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ Z ` @ @ @ @ @ @ @ # j @ @ @ @ @ @ @ @ , c.@ @ @ @ @ @ @ d. f @ @ @ @ @ @ @ <. ", " M .@ @ @ @ @ @ @ @ @ @ K ..t @ @ @ @ @ @ @ # 2 @ @ @ @ @ @ @ 0 t @.@ @ @ @ @ @ @ @ 1. f @ @ @ @ @ @ @ <. ", " o +.@.G n & #.g $.%. @ @ @ @ @ @ @ # | - @ @ @ @ @ @ @ # J e.@ @ @ @ @ @ @ @ [. f @ @ @ @ @ @ @ <. ", " @ @ @ @ @ @ @ # +.@ @ @ @ @ @ @ @ ! U [ v @ @ @ @ @ @ @ @ p [ f @ @ @ @ @ @ @ <. ", " [ &.*.R $ =.d @ @ @ @ @ @ @ # {.@ @ @ @ @ @ @ @ @ ; F %.L e R g ! @ @ @ @ @ @ @ @ - ' f @ @ @ @ @ @ @ <. ", " e % w @ @ @ @ @ @ @ ! H -.;. @ @ @ @ @ @ @ # E @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ # ' f @ @ @ @ @ @ @ <. ", " >.l @ @ @ @ @ @ @ @ @ @ @ @ @ ! + ;. u = @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ ; J f @ @ @ @ @ @ @ <. ", " ;.v @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ ,.'. e 9.@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ 8. f @ @ @ @ @ @ @ <. ", " S ).@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ E f.* @ @ @ @ @ @ @ @ @ @ @ @ @ @ H 3 f @ @ @ @ @ @ @ <. ", " J !.@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ A R 2 b @ @ @ @ @ @ @ @ c.+ J f @ @ @ @ @ @ @ <. ", " | * @ @ @ @ @ @ @ @ @ p g E . H 0 @ @ @ @ @ @ @ @ @ @. S *.g.N g.$ <.7 f @ @ @ @ @ @ @ <. ", " ~.@ @ @ @ @ @ @ @ k =. z {.K @ @ @ @ @ @ @ @ $ f @ @ @ @ @ @ @ <. ", " N @ @ @ @ @ @ @ @ .. e ,.@ @ @ @ @ @ @ 5 f @ @ @ @ @ @ @ <. ", " 9 @ @ @ @ @ @ @ ]. e 0 @ @ @ @ @ @ @ x f @ @ @ @ @ @ @ <. ", " +.@ @ @ @ @ @ @ K T , @ @ @ @ @ @ @ Y f @ @ @ @ @ @ @ <. ", " v @ @ @ @ @ @ @ q z ^.@ @ @ @ @ @ @ J f @ @ @ @ @ @ @ <. ", " 5 @ @ @ @ @ @ @ >. /.@ @ @ @ @ @ @ -. f @ @ @ @ @ @ @ <. ", " @ @ @ @ @ @ @ @ [ x @ @ @ @ @ @ @ + f @ @ @ @ @ @ @ <. ", " (.@ @ @ @ @ @ @ @ M @ @ @ @ @ @ @ A f @ @ @ @ @ @ @ <. ", " (.@ @ @ @ @ @ @ @ M @ @ @ @ @ @ @ A f @ @ @ @ @ @ @ <. ", " @ @ @ @ @ @ @ @ ;. x @ @ @ @ @ @ @ + f @ @ @ @ @ @ @ <. ", " 5 @ @ @ @ @ @ @ =. 2 @ @ @ @ @ @ @ -. f @ @ @ @ @ @ @ <. ", " v @ @ @ @ @ @ @ . z - @ @ @ @ @ @ @ J f @ @ @ @ @ @ @ <. ", " +.@ @ @ @ @ @ @ _.i c @ @ @ @ @ @ @ :. f @ @ @ @ @ @ @ <. ", " : @ @ @ @ @ @ @ H &._ @ @ @ @ @ @ @ x f @ @ @ @ @ @ @ <. ", " u @ @ @ @ @ @ @ @ y j 5 @ @ @ @ @ @ @ * f @ @ @ @ @ @ @ <. ", " .@ @ @ @ @ @ @ @ l <. c ! @ @ @ @ @ @ @ @ '. f @ @ @ @ @ @ @ <. ", " o : @ @ @ @ @ @ @ @ @ ).A ( + [.K @ @ @ @ @ @ @ @ @ % f @ @ @ @ @ @ @ <. ", " j / @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ g f @ @ @ @ @ @ @ <. ", " 4 Y @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ % f @ @ @ @ @ @ @ <. ", " [ G @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ !.R f @ @ @ @ @ @ @ <. ", " }.1 @ @ @ @ @ @ @ @ @ @ @ @ @ _.|.[ f @ @ @ @ @ @ @ <. ", " e D ; @ @ @ @ @ @ @ _.Z U ;. B A A A A A A A ` ", " 7 ' 1.R '.>.` ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "}; nabi-1.0.0/src/debug.h0000644000175000017500000000201211655153252011370 00000000000000/* Nabi - X Input Method server for hangul * Copyright (C) 2007-2008 Choe Hwanjin * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #ifndef nabi_debug_h #define nabi_debug_h int nabi_log_get_level(); void nabi_log_set_level(int level); void nabi_log_set_device(const char* device); void nabi_log(int level, const char* format, ...); #endif /* nabi_debug_h */ nabi-1.0.0/src/debug.c0000644000175000017500000000300011655153252011361 00000000000000/* Nabi - X Input Method server for hangul * Copyright (C) 2007-2008 Choe Hwanjin * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #include #include #include static FILE* output_device = NULL; static int log_level = 0; void nabi_log_set_level(int level) { log_level = level; } int nabi_log_get_level(int level) { return log_level; } void nabi_log_set_device(const char* device) { if (strcmp(device, "stdout") == 0) { output_device = stdout; } else if (strcmp(device, "stderr") == 0) { output_device = stderr; } } void nabi_log(int level, const char* format, ...) { if (output_device == NULL) return; if (level <= log_level) { va_list ap; fprintf(output_device, "Nabi(%d): ", level); va_start(ap, format); vfprintf(output_device, format, ap); va_end(ap); fflush(output_device); } } nabi-1.0.0/src/server.h0000644000175000017500000001702211655153252011617 00000000000000/* Nabi - X Input Method server for hangul * Copyright (C) 2003-2009 Choe Hwanjin * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #ifndef __SERVER_H_ #define __SERVER_H_ #ifdef HAVE_STDINT_H #include #endif #include #include #include #include #include #include "../IMdkit/IMdkit.h" #include "../IMdkit/Xi18n.h" #include "ic.h" #include "keyboard-layout.h" typedef struct _NabiHangulKeyboard NabiHangulKeyboard; typedef struct _NabiServer NabiServer; #define KEYBOARD_TABLE_SIZE 94 struct _NabiHangulKeyboard { const gchar* id; const gchar* name; }; typedef enum { NABI_OUTPUT_SYLLABLE, NABI_OUTPUT_JAMO, NABI_OUTPUT_MANUAL } NabiOutputMode; typedef enum { NABI_INPUT_MODE_PER_DESKTOP, NABI_INPUT_MODE_PER_APPLICATION, NABI_INPUT_MODE_PER_TOPLEVEL, NABI_INPUT_MODE_PER_IC } NabiInputModeScope; enum { NABI_MODE_INFO_NONE, NABI_MODE_INFO_DIRECT, NABI_MODE_INFO_COMPOSE }; typedef void (*NabiModeInfoCallback)(int); struct NabiStatistics { int total; int space; int backspace; int shift; int jamo[256]; }; struct _NabiServer { /* XIMS */ Display* display; int screen; char* name; XIMS xims; Window window; long filter_mask; XIMTriggerKeys trigger_keys; XIMTriggerKeys off_keys; XIMTriggerKeys candidate_keys; char** locales; /* xim connection list */ GSList* connections; GSList* toplevels; /* keyboard translate */ GList* layouts; NabiKeyboardLayout* layout; /* hangul automata */ char* hangul_keyboard; NabiHangulKeyboard* hangul_keyboard_list; NabiOutputMode output_mode; /* hanja */ HanjaTable* hanja_table; /* symbol */ HanjaTable* symbol_table; /* options */ Bool dynamic_event_flow; Bool commit_by_word; Bool auto_reorder; Bool show_status; Bool hanja_mode; Bool use_simplified_chinese; Bool ignore_app_fontset; Bool use_system_keymap; NabiInputMode default_input_mode; NabiInputMode input_mode; NabiInputModeScope input_mode_scope; GdkColor preedit_fg; GdkColor preedit_bg; PangoFontDescription* preedit_font; PangoFontDescription* candidate_font; /* statistics */ time_t start_time; struct NabiStatistics statistics; }; extern NabiServer* nabi_server; NabiServer* nabi_server_new (Display* display, int screen, const char* name); void nabi_server_destroy (NabiServer* server); int nabi_server_start (NabiServer* server); int nabi_server_stop (NabiServer *server); Bool nabi_server_is_running(); Bool nabi_server_is_trigger_key (NabiServer* server, KeySym key, unsigned int state); Bool nabi_server_is_off_key (NabiServer* server, KeySym key, unsigned int state); Bool nabi_server_is_candidate_key(NabiServer* server, KeySym key, unsigned int state); void nabi_server_set_trigger_keys (NabiServer *server, char **keys); void nabi_server_set_off_keys (NabiServer *server, char **keys); void nabi_server_set_candidate_keys(NabiServer *server, char **keys); void nabi_server_load_keyboard_layout(NabiServer *server, const char *filename); void nabi_server_set_keyboard_layout(NabiServer *server, const char* name); void nabi_server_set_hangul_keyboard(NabiServer *server, const char *id); void nabi_server_toggle_input_mode(NabiServer* server); void nabi_server_set_mode_info(NabiServer *server, int state); void nabi_server_set_output_mode (NabiServer *server, NabiOutputMode mode); void nabi_server_set_preedit_font(NabiServer *server, const gchar *font_desc); void nabi_server_set_candidate_font(NabiServer *server, const gchar *font_desc); void nabi_server_set_dynamic_event_flow(NabiServer* server, Bool flag); void nabi_server_set_xim_name(NabiServer* server, const char* name); void nabi_server_set_commit_by_word(NabiServer* server, Bool flag); void nabi_server_set_auto_reorder(NabiServer* server, Bool flag); void nabi_server_set_hanja_mode(NabiServer* server, Bool flag); void nabi_server_set_default_input_mode(NabiServer* server, NabiInputMode mode); void nabi_server_set_input_mode_scope(NabiServer* server, NabiInputModeScope scope); void nabi_server_set_simplified_chinese(NabiServer* server, Bool state); void nabi_server_set_ignore_app_fontset(NabiServer* server, Bool state); void nabi_server_set_use_system_keymap(NabiServer* server, Bool state); NabiIC* nabi_server_get_ic (NabiServer *server, CARD16 connect_id, CARD16 icid); gboolean nabi_server_is_valid_ic (NabiServer* server, NabiIC* ic); NabiConnection* nabi_server_create_connection (NabiServer *server, CARD16 connect_id, const char* locale); NabiConnection* nabi_server_get_connection (NabiServer *server, CARD16 connect_id); void nabi_server_destroy_connection(NabiServer *server, CARD16 connect_id); NabiToplevel* nabi_server_get_toplevel(NabiServer* server, Window id); void nabi_server_remove_toplevel(NabiServer* server, NabiToplevel* toplevel); Bool nabi_server_is_locale_supported(NabiServer *server, const char *locale); Bool nabi_server_is_valid_str (NabiServer *server, const char* str); void nabi_server_log_key (NabiServer *server, ucschar c, unsigned int state); void nabi_server_write_log(NabiServer *server); Bool nabi_server_load_keyboard_table(NabiServer *server, const char *filename); Bool nabi_server_load_compose_table(NabiServer *server, const char *filename); const NabiHangulKeyboard* nabi_server_get_hangul_keyboard_list(NabiServer* server); const char* nabi_server_get_keyboard_name_by_id(NabiServer* server, const char* id); const char* nabi_server_get_current_keyboard_name(NabiServer* server); #endif /* __SERVER_H_ */ /* vim: set ts=8 sw=4 sts=4 : */ nabi-1.0.0/src/server.c0000644000175000017500000006534611655153252011626 00000000000000/* Nabi - X Input Method server for hangul * Copyright (C) 2003-2009 Choe Hwanjin * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include "debug.h" #include "gettext.h" #include "server.h" #include "fontset.h" #include "hangul.h" #define NABI_SYMBOL_TABLE NABI_DATA_DIR G_DIR_SEPARATOR_S "symbol.txt" /* from handler.c */ Bool nabi_handler(XIMS ims, IMProtocol *call_data); static void nabi_server_delete_layouts(NabiServer* server); long nabi_filter_mask = KeyPressMask | KeyReleaseMask; /* Supported Inputstyles */ static XIMStyle nabi_input_styles[] = { XIMPreeditCallbacks | XIMStatusCallbacks, XIMPreeditCallbacks | XIMStatusNothing, XIMPreeditPosition | XIMStatusNothing, XIMPreeditArea | XIMStatusNothing, XIMPreeditNothing | XIMStatusNothing, 0 }; static XIMEncoding nabi_encodings[] = { "COMPOUND_TEXT", NULL }; static char *nabi_locales[] = { "ko_KR.UTF-8", "ko_KR.utf8", "ko_KR.eucKR", "ko_KR.euckr", "ko.UTF-8", "ko.utf8", "ko.eucKR", "ko.euckr", "ko", "a3_AZ.UTF-8", "af_ZA.UTF-8", "am_ET.UTF-8", "ar_AA.UTF-8", "ar_AE.UTF-8", "ar_BH.UTF-8", "ar_DZ.UTF-8", "ar_EG.UTF-8", "ar_IN.UTF-8", "ar_IQ.UTF-8", "ar_JO.UTF-8", "ar_KW.UTF-8", "ar_LB.UTF-8", "ar_LY.UTF-8", "ar_MA.UTF-8", "ar_OM.UTF-8", "ar_QA.UTF-8", "ar_SA.UTF-8", "ar_SD.UTF-8", "ar_SY.UTF-8", "ar_TN.UTF-8", "ar_YE.UTF-8", "as_IN.UTF-8", "az_AZ.UTF-8", "be_BY.UTF-8", "bg_BG.UTF-8", "bn_BD.UTF-8", "bn_IN.UTF-8", "bo_IN.UTF-8", "br_FR.UTF-8", "bs_BA.UTF-8", "ca_AD.UTF-8", "ca_ES.UTF-8", "ca_FR.UTF-8", "ca_IT.UTF-8", "cs_CZ.UTF-8", "cy_GB.UTF-8", "da_DK.UTF-8", "de_AT.UTF-8", "de_BE.UTF-8", "de_CH.UTF-8", "de_DE.UTF-8", "de_LI.UTF-8", "de_LU.UTF-8", "el_CY.UTF-8", "el_GR.UTF-8", "en_AU.UTF-8", "en_BE.UTF-8", "en_BZ.UTF-8", "en_CA.UTF-8", "en_GB.UTF-8", "en_IE.UTF-8", "en_JM.UTF-8", "en_MT.UTF-8", "en_NZ.UTF-8", "en_TT.UTF-8", "en_UK.UTF-8", "en_US.UTF-8", "en_ZA.UTF-8", "eo_EO.UTF-8", "eo_XX.UTF-8", "es_AR.UTF-8", "es_BO.UTF-8", "es_CL.UTF-8", "es_CO.UTF-8", "es_CR.UTF-8", "es_DO.UTF-8", "es_EC.UTF-8", "es_ES.UTF-8", "es_GT.UTF-8", "es_HN.UTF-8", "es_MX.UTF-8", "es_NI.UTF-8", "es_PA.UTF-8", "es_PE.UTF-8", "es_PR.UTF-8", "es_PY.UTF-8", "es_SV.UTF-8", "es_US.UTF-8", "es_UY.UTF-8", "es_VE.UTF-8", "et_EE.UTF-8", "eu_ES.UTF-8", "fa_IR.UTF-8", "fi_FI.UTF-8", "fo_FO.UTF-8", "fr_BE.UTF-8", "fr_CA.UTF-8", "fr_CH.UTF-8", "fr_FR.UTF-8", "fr_LU.UTF-8", "ga_IE.UTF-8", "gd_GB.UTF-8", "gl_ES.UTF-8", "gu_IN.UTF-8", "gv_GB.UTF-8", "he_IL.UTF-8", "hi_IN.UTF-8", "hne_IN.UTF-8", "hr_HR.UTF-8", "hu_HU.UTF-8", "hy_AM.UTF-8", "id_ID.UTF-8", "is_IS.UTF-8", "it_CH.UTF-8", "it_IT.UTF-8", "iu_CA.UTF-8", "ja_JP.UTF-8", "ka_GE.UTF-8", "kk_KZ.UTF-8", "kl_GL.UTF-8", "kn_IN.UTF-8", "ko_KR.UTF-8", "ks_IN.UTF-8", "ks_IN@devanagari.UTF-8", "kw_GB.UTF-8", "ky_KG.UTF-8", "lo_LA.UTF-8", "lt_LT.UTF-8", "lv_LV.UTF-8", "mai_IN.UTF-8", "mi_NZ.UTF-8", "mk_MK.UTF-8", "ml_IN.UTF-8", "mr_IN.UTF-8", "ms_MY.UTF-8", "mt_MT.UTF-8", "nb_NO.UTF-8", "ne_NP.UTF-8", "nl_BE.UTF-8", "nl_NL.UTF-8", "nn_NO.UTF-8", "no_NO.UTF-8", "nr_ZA.UTF-8", "nso_ZA.UTF-8", "ny_NO.UTF-8", "oc_FR.UTF-8", "or_IN.UTF-8", "pa_IN.UTF-8", "pa_PK.UTF-8", "pd_DE.UTF-8", "pd_US.UTF-8", "ph_PH.UTF-8", "pl_PL.UTF-8", "pp_AN.UTF-8", "pt_BR.UTF-8", "pt_PT.UTF-8", "ro_RO.UTF-8", "ru_RU.UTF-8", "ru_UA.UTF-8", "rw_RW.UTF-8", "sa_IN.UTF-8", "sd_IN.UTF-8", "sd_IN@devanagari.UTF-8", "se_NO.UTF-8", "sh_BA.UTF-8", "sh_YU.UTF-8", "si_LK.UTF-8", "sk_SK.UTF-8", "sl_SI.UTF-8", "sq_AL.UTF-8", "sr_CS.UTF-8", "sr_ME.UTF-8", "sr_RS.UTF-8", "sr_YU.UTF-8", "ss_ZA.UTF-8", "st_ZA.UTF-8", "sv_FI.UTF-8", "sv_SE.UTF-8", "ta_IN.UTF-8", "te_IN.UTF-8", "tg_TJ.UTF-8", "th_TH.UTF-8", "ti_ER.UTF-8", "ti_ET.UTF-8", "tl_PH.UTF-8", "tn_ZA.UTF-8", "tr_TR.UTF-8", "ts_ZA.UTF-8", "tt_RU.UTF-8", "uk_UA.UTF-8", "ur_IN.UTF-8", "ur_PK.UTF-8", "uz_UZ.UTF-8", "ve_ZA.UTF-8", "vi_VN.UTF-8", "wa_BE.UTF-8", "xh_ZA.UTF-8", "yi_US.UTF-8", "zh_CN.UTF-8", "zh_HK.UTF-8", "zh_SG.UTF-8", "zh_TW.UTF-8", "zu_ZA.UTF-8", NULL, NULL }; NabiServer* nabi_server_new(Display* display, int screen, const char *name) { unsigned i; unsigned n; const char *charset; char *trigger_keys[3] = { "Hangul", "Shift+space", NULL }; char *off_keys[2] = { "Escape", NULL }; char *candidate_keys[3] = { "Hangul_Hanja", "F9", NULL }; NabiServer *server; server = (NabiServer*)malloc(sizeof(NabiServer)); server->display = display; server->screen = screen; /* server var */ if (name == NULL) server->name = strdup(PACKAGE); else server->name = strdup(name); server->xims = 0; server->window = 0; server->filter_mask = 0; server->trigger_keys.count_keys = 0; server->trigger_keys.keylist = NULL; server->off_keys.count_keys = 0; server->off_keys.keylist = NULL; server->candidate_keys.count_keys = 0; server->candidate_keys.keylist = NULL; server->locales = nabi_locales; server->filter_mask = KeyPressMask; /* keys */ nabi_server_set_trigger_keys(server, trigger_keys); nabi_server_set_off_keys(server, off_keys); nabi_server_set_candidate_keys(server, candidate_keys); /* check locale encoding */ if (g_get_charset(&charset)) { /* utf8 encoding */ /* We add current locale to nabi support locales array, * so whatever the locale string is, if its encoding is utf8, * nabi support the locale */ for (i = 0; server->locales[i] != NULL; i++) continue; server->locales[i] = setlocale(LC_CTYPE, NULL); } /* connection list */ server->connections = NULL; /* toplevel window list */ server->toplevels = NULL; /* hangul data */ server->layouts = NULL; server->layout = NULL; server->hangul_keyboard = NULL; /* init keyboard list from libhangul */ n = hangul_ic_get_n_keyboards(); server->hangul_keyboard_list = g_new(NabiHangulKeyboard, n + 1); for (i = 0; i < n; ++i) { const char* id = hangul_ic_get_keyboard_id(i); const char* name = hangul_ic_get_keyboard_name(i); server->hangul_keyboard_list[i].id = id; server->hangul_keyboard_list[i].name= name; } server->hangul_keyboard_list[i].id = NULL; server->hangul_keyboard_list[i].name= NULL; server->dynamic_event_flow = True; server->commit_by_word = False; server->auto_reorder = True; server->hanja_mode = False; server->default_input_mode = NABI_INPUT_MODE_DIRECT; server->input_mode = server->default_input_mode; server->input_mode_scope = NABI_INPUT_MODE_PER_TOPLEVEL; server->output_mode = NABI_OUTPUT_SYLLABLE; /* hanja */ server->hanja_table = hanja_table_load(NULL); /* symbol */ server->symbol_table = hanja_table_load(NABI_SYMBOL_TABLE); /* options */ server->show_status = False; server->use_simplified_chinese = False; server->ignore_app_fontset = False; server->use_system_keymap = False; server->preedit_fg.pixel = 0; server->preedit_fg.red = 0xffff; server->preedit_fg.green = 0; server->preedit_fg.blue = 0; server->preedit_bg.pixel = 0; server->preedit_bg.red = 0; server->preedit_bg.green = 0; server->preedit_bg.blue = 0; server->preedit_font = pango_font_description_from_string("Sans 9"); server->candidate_font = pango_font_description_from_string("Sans 14"); /* statistics */ memset(&(server->statistics), 0, sizeof(server->statistics)); return server; } void nabi_server_destroy(NabiServer *server) { GSList *item; if (server == NULL) return; /* destroy remaining connections */ if (server->connections != NULL) { item = server->connections; while (item != NULL) { if (item->data != NULL) { NabiConnection* conn = (NabiConnection*)item->data; nabi_log(3, "remove remaining connection: 0x%x\n", conn->id); nabi_connection_destroy(conn); } item = g_slist_next(item); } g_slist_free(server->connections); server->connections = NULL; } /* free remaining toplevel list */ if (server->toplevels != NULL) { item = server->toplevels; while (item != NULL) { NabiToplevel* toplevel = (NabiToplevel*)item->data; nabi_log(3, "remove remaining toplevel: 0x%x\n", toplevel->id); g_free(item->data); item = g_slist_next(item); } g_slist_free(server->toplevels); server->toplevels = NULL; } /* free remaining fontsets */ nabi_fontset_free_all(server->display); /* keyboard */ nabi_server_delete_layouts(server); g_free(server->hangul_keyboard); /* delete hanja table */ if (server->hanja_table != NULL) hanja_table_delete(server->hanja_table); /* delete symbol table */ if (server->symbol_table != NULL) hanja_table_delete(server->symbol_table); /* libhangul keyboard list */ g_free(server->hangul_keyboard_list); g_free(server->trigger_keys.keylist); g_free(server->candidate_keys.keylist); g_free(server->off_keys.keylist); pango_font_description_free(server->preedit_font); pango_font_description_free(server->candidate_font); g_free(server->name); g_free(server); } void nabi_server_set_hangul_keyboard(NabiServer *server, const char *id) { if (server == NULL) return; if (server->hangul_keyboard != NULL) g_free(server->hangul_keyboard); server->hangul_keyboard = g_strdup(id); } void nabi_server_set_mode_info(NabiServer *server, int state) { long data; Window root; Atom property; Atom type; if (server == NULL) return; data = state; root = RootWindow(server->display, server->screen); property = XInternAtom(server->display, "_HANGUL_INPUT_MODE", FALSE); type = XInternAtom(server->display, "INTEGER", FALSE); XChangeProperty(server->display, root, property, type, 32, PropModeReplace, (unsigned char*)&data, 1); } void nabi_server_set_output_mode(NabiServer *server, NabiOutputMode mode) { if (server == NULL) return; if (mode == NABI_OUTPUT_SYLLABLE) { server->output_mode = mode; } else { server->output_mode = mode; } } void nabi_server_set_preedit_font(NabiServer *server, const char *font_desc) { if (server == NULL) return; if (font_desc != NULL) pango_font_description_free(server->preedit_font); server->preedit_font = pango_font_description_from_string(font_desc); nabi_log(3, "set preedit font: %s\n", font_desc); } void nabi_server_set_candidate_font(NabiServer *server, const char *font_desc) { if (server == NULL) return; if (font_desc != NULL) pango_font_description_free(server->candidate_font); server->candidate_font = pango_font_description_from_string(font_desc); nabi_log(3, "set candidate font: %s\n", font_desc); } static void xim_trigger_keys_set_value(XIMTriggerKeys* keys, char** key_strings) { int i, j, n; XIMTriggerKey *keylist; if (keys == NULL) return; if (keys->keylist != NULL) { g_free(keys->keylist); keys->keylist = NULL; keys->count_keys = 0; } if (key_strings == NULL) return; for (n = 0; key_strings[n] != NULL; n++) continue; keylist = g_new(XIMTriggerKey, n); for (i = 0; i < n; i++) { keylist[i].keysym = 0; keylist[i].modifier = 0; keylist[i].modifier_mask = 0; } for (i = 0; i < n; i++) { gchar **list = g_strsplit(key_strings[i], "+", 0); for (j = 0; list[j] != NULL; j++) { if (strcmp("Shift", list[j]) == 0) { keylist[i].modifier |= ShiftMask; keylist[i].modifier_mask |= ShiftMask; } else if (strcmp("Control", list[j]) == 0) { keylist[i].modifier |= ControlMask; keylist[i].modifier_mask |= ControlMask; } else if (strcmp("Alt", list[j]) == 0) { keylist[i].modifier |= Mod1Mask; keylist[i].modifier_mask |= Mod1Mask; } else if (strcmp("Super", list[j]) == 0) { keylist[i].modifier |= Mod4Mask; keylist[i].modifier_mask |= Mod4Mask; } else { keylist[i].keysym = gdk_keyval_from_name(list[j]); } } g_strfreev(list); } keys->keylist = keylist; keys->count_keys = n; } void nabi_server_set_trigger_keys(NabiServer *server, char **keys) { xim_trigger_keys_set_value(&server->trigger_keys, keys); if (server->xims != NULL && server->dynamic_event_flow) { IMSetIMValues(server->xims, IMOnKeysList, &(server->trigger_keys), NULL); } } void nabi_server_set_off_keys(NabiServer *server, char **keys) { xim_trigger_keys_set_value(&server->off_keys, keys); } void nabi_server_set_candidate_keys(NabiServer *server, char **keys) { xim_trigger_keys_set_value(&server->candidate_keys, keys); } gboolean nabi_server_is_valid_ic(NabiServer* server, NabiIC* ic) { GSList* item = server->connections; while (item != NULL) { NabiConnection* conn = (NabiConnection*)item->data; if (g_slist_find(conn->ic_list, ic) != NULL) return TRUE; item = g_slist_next(item); } return FALSE; } NabiIC* nabi_server_get_ic(NabiServer *server, CARD16 connect_id, CARD16 ic_id) { NabiConnection* conn; conn = nabi_server_get_connection(server, connect_id); if (conn != NULL) { return nabi_connection_get_ic(conn, ic_id); } return NULL; } static Bool nabi_server_is_key(XIMTriggerKey *keylist, int count, KeySym key, unsigned int state) { int i; for (i = 0; i < count; i++) { if (key == keylist[i].keysym && (state & keylist[i].modifier_mask) == keylist[i].modifier) return True; } return False; } Bool nabi_server_is_trigger_key(NabiServer* server, KeySym key, unsigned int state) { return nabi_server_is_key(server->trigger_keys.keylist, server->trigger_keys.count_keys, key, state); } Bool nabi_server_is_off_key(NabiServer* server, KeySym key, unsigned int state) { return nabi_server_is_key(server->off_keys.keylist, server->off_keys.count_keys, key, state); } Bool nabi_server_is_candidate_key(NabiServer* server, KeySym key, unsigned int state) { return nabi_server_is_key(server->candidate_keys.keylist, server->candidate_keys.count_keys, key, state); } Bool nabi_server_is_running(const char* name) { Display* display; Atom atom; Window owner; char atom_name[64]; display = gdk_x11_get_default_xdisplay(); snprintf(atom_name, sizeof(atom_name), "@server=%s", name); atom = XInternAtom(display, atom_name, True); if (atom != None) { owner = XGetSelectionOwner(display, atom); if (owner != None) return True; } return False; } int nabi_server_start(NabiServer *server) { Window window; XIMS xims; XIMStyles input_styles; XIMEncodings encodings; char *locales; if (server == NULL) return 0; if (server->xims != NULL) return 0; window = XCreateSimpleWindow(server->display, RootWindow(server->display, server->screen), 0, 0, 1, 1, 1, 0, 0); input_styles.count_styles = sizeof(nabi_input_styles) / sizeof(XIMStyle) - 1; input_styles.supported_styles = nabi_input_styles; encodings.count_encodings = sizeof(nabi_encodings) / sizeof(XIMEncoding) - 1; encodings.supported_encodings = nabi_encodings; locales = g_strjoinv(",", server->locales); xims = IMOpenIM(server->display, IMModifiers, "Xi18n", IMServerWindow, window, IMServerName, server->name, IMLocale, locales, IMServerTransport, "X/", IMInputStyles, &input_styles, NULL); g_free(locales); if (xims == NULL) { nabi_log(1, "can't open input method service\n"); exit(1); } if (server->dynamic_event_flow) { IMSetIMValues(xims, IMOnKeysList, &(server->trigger_keys), NULL); } IMSetIMValues(xims, IMEncodingList, &encodings, IMProtocolHandler, nabi_handler, IMFilterEventMask, nabi_filter_mask, NULL); server->xims = xims; server->window = window; server->start_time = time(NULL); nabi_log(1, "xim server started\n"); return 0; } int nabi_server_stop(NabiServer *server) { if (server == NULL) return 0; if (server->xims != NULL) { IMCloseIM(server->xims); server->xims = NULL; } nabi_log(1, "xim server stoped\n"); return 0; } NabiConnection* nabi_server_create_connection(NabiServer *server, CARD16 connect_id, const char* locale) { NabiConnection* conn; if (server == NULL) return NULL; conn = nabi_connection_create(connect_id, locale); server->connections = g_slist_prepend(server->connections, conn); return conn; } NabiConnection* nabi_server_get_connection(NabiServer *server, CARD16 connect_id) { GSList* item; item = server->connections; while (item != NULL) { NabiConnection* conn = (NabiConnection*)item->data; if (conn != NULL && conn->id == connect_id) return conn; item = g_slist_next(item); } return NULL; } void nabi_server_destroy_connection(NabiServer *server, CARD16 connect_id) { NabiConnection* conn = nabi_server_get_connection(server, connect_id); server->connections = g_slist_remove(server->connections, conn); nabi_connection_destroy(conn); } NabiToplevel* nabi_server_get_toplevel(NabiServer* server, Window id) { NabiToplevel* toplevel; GSList* item; item = server->toplevels; while (item != NULL) { NabiToplevel* toplevel = (NabiToplevel*)item->data; if (toplevel != NULL && toplevel->id == id) { nabi_toplevel_ref(toplevel); return toplevel; } item = g_slist_next(item); } toplevel = nabi_toplevel_new(id); server->toplevels = g_slist_prepend(server->toplevels, toplevel); return toplevel; } void nabi_server_remove_toplevel(NabiServer* server, NabiToplevel* toplevel) { if (server != NULL && server->toplevels != NULL) server->toplevels = g_slist_remove(server->toplevels, toplevel); } Bool nabi_server_is_locale_supported(NabiServer *server, const char *locale) { const char *charset; if (strncmp("ko", locale, 2) == 0) return True; if (g_get_charset(&charset)) { return True; } return False; } void nabi_server_log_key(NabiServer *server, ucschar c, unsigned int state) { if (c == XK_BackSpace) { server->statistics.backspace++; server->statistics.total++; } else if (c == XK_space) { server->statistics.space++; server->statistics.total++; } else if (c >= 0x1100 && c <= 0x11FF) { int index = (unsigned int)c & 0xff; if (index >= 0 && index <= 255) { server->statistics.jamo[index]++; server->statistics.total++; } } if (state & ShiftMask) server->statistics.shift++; } static gchar* skip_space(gchar* p) { while (g_ascii_isspace(*p)) p++; return p; } static void nabi_server_delete_layouts(NabiServer* server) { if (server->layouts != NULL) { g_list_foreach(server->layouts, nabi_keyboard_layout_free, NULL); g_list_free(server->layouts); server->layouts = NULL; } } void nabi_server_load_keyboard_layout(NabiServer *server, const char *filename) { FILE *file; char *p, *line; char *saved_position = NULL; char buf[256]; GList *list = NULL; NabiKeyboardLayout *layout = NULL; file = fopen(filename, "r"); if (file == NULL) { fprintf(stderr, "Nabi: Failed to open keyboard layout file: %s\n", filename); return; } layout = nabi_keyboard_layout_new("none"); list = g_list_append(list, layout); layout = NULL; for (line = fgets(buf, sizeof(buf), file); line != NULL; line = fgets(buf, sizeof(buf), file)) { p = skip_space(buf); /* skip comments */ if (*p == '\0' || *p == ';' || *p == '#') continue; if (p[0] == '[') { p = strtok_r(p + 1, "]", &saved_position); if (p != NULL) { if (layout != NULL) list = g_list_append(list, layout); layout = nabi_keyboard_layout_new(p); } } else if (layout != NULL) { KeySym key, value; p = strtok_r(p, " \t", &saved_position); if (p == NULL) continue; key = strtol(p, NULL, 16); if (key == 0) continue; p = strtok_r(NULL, "\r\n\t ", &saved_position); if (p == NULL) continue; value = strtol(p, NULL, 16); if (value == 0) continue; nabi_keyboard_layout_append(layout, key, value); } } if (layout != NULL) list = g_list_append(list, layout); fclose(file); nabi_server_delete_layouts(server); server->layouts = list; } void nabi_server_set_keyboard_layout(NabiServer *server, const char* name) { GList* list; if (server == NULL) return; if (strcmp(name, "none") == 0) { server->layout = NULL; return; } list = server->layouts; while (list != NULL) { NabiKeyboardLayout* layout = list->data; if (strcmp(layout->name, name) == 0) { server->layout = layout; } list = g_list_next(list); } } const NabiHangulKeyboard* nabi_server_get_hangul_keyboard_list(NabiServer* server) { if (server != NULL) return server->hangul_keyboard_list; return NULL; } const char* nabi_server_get_keyboard_name_by_id(NabiServer* server, const char* id) { int i; if (server == NULL) return NULL; for (i = 0; server->hangul_keyboard_list[i].id != NULL; i++) { if (strcmp(id, server->hangul_keyboard_list[i].id) == 0) { return server->hangul_keyboard_list[i].name; } } return NULL; } const char* nabi_server_get_current_keyboard_name(NabiServer* server) { return nabi_server_get_keyboard_name_by_id(server, server->hangul_keyboard); } void nabi_server_toggle_input_mode(NabiServer* server) { if (server == NULL) return; if (server->input_mode_scope == NABI_INPUT_MODE_PER_DESKTOP) { if (server->input_mode == NABI_INPUT_MODE_DIRECT) { server->input_mode = NABI_INPUT_MODE_COMPOSE; nabi_server_set_mode_info(nabi_server, NABI_MODE_INFO_COMPOSE); nabi_log(1, "change input mode: compose\n"); } else { server->input_mode = NABI_INPUT_MODE_DIRECT; nabi_server_set_mode_info(nabi_server, NABI_MODE_INFO_DIRECT); nabi_log(1, "change input mode: direct\n"); } } } void nabi_server_set_dynamic_event_flow(NabiServer* server, Bool flag) { if (server != NULL) server->dynamic_event_flow = flag; } void nabi_server_set_xim_name(NabiServer* server, const char* name) { if (server != NULL) { g_free(server->name); server->name = g_strdup(name); } } void nabi_server_set_commit_by_word(NabiServer* server, Bool flag) { if (server != NULL) server->commit_by_word = flag; } void nabi_server_set_auto_reorder(NabiServer* server, Bool flag) { if (server != NULL) server->auto_reorder = flag; } void nabi_server_set_default_input_mode(NabiServer* server, NabiInputMode mode) { if (server != NULL) server->default_input_mode = mode; } void nabi_server_set_input_mode_scope(NabiServer* server, NabiInputModeScope scope) { if (server != NULL) server->input_mode_scope = scope; } void nabi_server_set_hanja_mode(NabiServer* server, Bool flag) { if (server != NULL) server->hanja_mode = flag; } void nabi_server_set_simplified_chinese(NabiServer* server, Bool state) { if (server != NULL) server->use_simplified_chinese = state; } void nabi_server_set_ignore_app_fontset(NabiServer* server, Bool state) { if (server != NULL) server->ignore_app_fontset = state; } void nabi_server_set_use_system_keymap(NabiServer* server, Bool state) { if (server != NULL) server->use_system_keymap = state; } void nabi_server_write_log(NabiServer *server) { const gchar *homedir; gchar *filename; FILE *file; if (server->statistics.total <= 0) return; homedir = g_get_home_dir(); filename = g_build_filename(homedir, ".nabi", "nabi.log", NULL); file = fopen(filename, "a"); if (file != NULL) { int i, sum; time_t current_time; struct tm local_time; char buf[256] = { '\0', }; localtime_r(&server->start_time, &local_time); strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", &local_time); fprintf(file, "%s - ", buf); current_time = time(NULL); localtime_r(¤t_time, &local_time); strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", &local_time); fprintf(file, "%s", buf); fprintf(file, " (%ds)\n", (int)(current_time - server->start_time)); fprintf(file, "total: %d\n", server->statistics.total); fprintf(file, "space: %d\n", server->statistics.space); fprintf(file, "backspace: %d\n", server->statistics.backspace); fprintf(file, "keyboard: %s\n", server->hangul_keyboard); /* choseong */ sum = 0; for (i = 0x00; i <= 0x12; i++) sum += server->statistics.jamo[i]; if (sum > 0) { fprintf(file, "cho: "); for (i = 0x0; i <= 0x12; i++) { char label[8] = { '\0', }; g_unichar_to_utf8(0x1100 + i, label); fprintf(file, "%s: %-3d ", label, server->statistics.jamo[i]); } fprintf(file, "\n"); } else { fprintf(file, "cho: 0\n"); } /* jungseong */ sum = 0; for (i = 0x61; i <= 0x75; i++) sum += server->statistics.jamo[i]; if (sum > 0) { fprintf(file, "jung: "); for (i = 0x61; i <= 0x75; i++) { char label[8] = { '\0', }; g_unichar_to_utf8(0x1100 + i, label); fprintf(file, "%s: %-3d ", label, server->statistics.jamo[i]); } fprintf(file, "\n"); } else { fprintf(file, "jung: 0\n"); } /* jong seong */ sum = 0; for (i = 0xa8; i <= 0xc2; i++) sum += server->statistics.jamo[i]; if (sum > 0) { fprintf(file, "jong: "); for (i = 0xa8; i <= 0xc2; i++) { char label[8] = { '\0', }; g_unichar_to_utf8(0x1100 + i, label); fprintf(file, "%s: %-3d ", label, server->statistics.jamo[i]); } fprintf(file, "\n"); } fprintf(file, "\n"); fclose(file); } g_free(filename); } nabi-1.0.0/src/ic.h0000644000175000017500000001462011655153252010705 00000000000000/* Nabi - X Input Method server for hangul * Copyright (C) 2003-2008 Choe Hwanjin * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #ifndef _NABIIC_H_ #define _NABIIC_H_ #include #include #include #include #include "../IMdkit/IMdkit.h" #include "../IMdkit/Xi18n.h" #include "candidate.h" #include "ustring.h" typedef struct _PreeditAttributes PreeditAttributes; typedef struct _StatusAttributes StatusAttributes; typedef struct _NabiIC NabiIC; typedef struct _NabiConnection NabiConnection; typedef struct _NabiToplevel NabiToplevel; typedef enum { NABI_INPUT_MODE_DIRECT, NABI_INPUT_MODE_COMPOSE } NabiInputMode; struct _NabiConnection { CARD16 id; NabiInputMode mode; GIConv cd; CARD16 next_new_ic_id; GSList* ic_list; }; struct _NabiToplevel { Window id; NabiInputMode mode; unsigned int ref; }; struct _PreeditAttributes { UString* str; GdkWindow* window; /* where to draw the preedit string */ int width; /* preedit area width */ int height; /* preedit area height */ XPoint spot; /* window position */ XRectangle area; /* area */ XRectangle area_needed; /* area needed */ Colormap cmap; /* colormap */ GdkGC* normal_gc; /* gc */ GdkGC* hilight_gc; /* gc */ unsigned long foreground; /* foreground */ unsigned long background; /* background */ char *base_font; /* base font of fontset */ XFontSet font_set; /* font set */ int ascent; /* font property */ int descent; /* font property */ Pixmap bg_pixmap; /* background pixmap */ CARD32 line_space; /* line spacing */ Cursor cursor; /* cursor */ XIMPreeditState state; /* preedit state */ Bool start; /* preedit start */ int prev_length; /* previous preedit string length */ gboolean has_start_cb; /* whether XNPreeditStartCallback * registered */ gboolean has_draw_cb; /* whether XNPreeditDrawCallback * registered */ gboolean has_done_cb; /* whether XNPreeditDoneCallback * registered */ }; struct _StatusAttributes { XRectangle area; /* area */ XRectangle area_needed; /* area needed */ Colormap cmap; /* colormap */ unsigned long foreground; /* foreground */ unsigned long background; /* background */ Pixmap bg_pixmap; /* background pixmap */ char *base_font; /* base font of fontset */ CARD32 line_space; /* line spacing */ Cursor cursor; /* cursor */ }; struct _NabiIC { CARD16 id; /* ic id */ INT32 input_style; /* input style */ Window client_window; /* client window */ Window focus_window; /* focus window */ char* resource_name; /* resource name */ char* resource_class; /* resource class */ StatusAttributes status; /* status attributes */ PreeditAttributes preedit; /* preedit attributes */ NabiConnection* connection; NabiToplevel* toplevel; /* hangul data */ NabiInputMode mode; HangulInputContext* hic; /* hanja or symbol select window */ NabiCandidate* candidate; gboolean composing_started; UString* client_text; gboolean wait_for_client_text; /* whether this ic requested * client text */ gboolean has_str_conv_cb; /* whether XNStringConversionCallback * registered */ }; NabiConnection* nabi_connection_create(CARD16 id, const char* encoding); void nabi_connection_destroy(NabiConnection* conn); NabiIC* nabi_connection_create_ic(NabiConnection* conn, IMChangeICStruct* data); void nabi_connection_destroy_ic(NabiConnection* conn, NabiIC* ic); NabiIC* nabi_connection_get_ic(NabiConnection* conn, CARD16 id); NabiToplevel* nabi_toplevel_new(Window id); void nabi_toplevel_ref(NabiToplevel* toplevel); void nabi_toplevel_unref(NabiToplevel* toplevel); NabiIC* nabi_ic_create(NabiConnection* conn, IMChangeICStruct *data); void nabi_ic_destroy(NabiIC *ic); void nabi_ic_real_destroy(NabiIC *ic); void nabi_ic_set_values(NabiIC *ic, IMChangeICStruct *data); void nabi_ic_get_values(NabiIC *ic, IMChangeICStruct *data); Bool nabi_ic_is_empty(NabiIC *ic); CARD16 nabi_ic_get_id(NabiIC* ic); void nabi_ic_set_focus(NabiIC *ic); void nabi_ic_set_mode(NabiIC *ic, NabiInputMode mode); void nabi_ic_start_composing(NabiIC *ic); void nabi_ic_end_composing(NabiIC *ic); void nabi_ic_preedit_start(NabiIC *ic); void nabi_ic_preedit_done(NabiIC *ic); void nabi_ic_preedit_update(NabiIC *ic); void nabi_ic_preedit_clear(NabiIC *ic); void nabi_ic_status_start(NabiIC *ic); void nabi_ic_status_done(NabiIC *ic); void nabi_ic_status_update(NabiIC *ic); Bool nabi_ic_commit(NabiIC *ic); Bool nabi_ic_process_keyevent(NabiIC* ic, KeySym keysym, unsigned int state); void nabi_ic_flush(NabiIC *ic); void nabi_ic_reset(NabiIC *ic, IMResetICStruct *data); Bool nabi_ic_popup_candidate_window(NabiIC *ic, const char* key); void nabi_ic_insert_candidate(NabiIC *ic, const Hanja* hanja); void nabi_ic_process_string_conversion_reply(NabiIC* ic, const char* text); #endif /* _NABIIC_H_ */ /* vim: set ts=8 sw=4 sts=4 : */ nabi-1.0.0/src/ic.c0000644000175000017500000021100411767102422010670 00000000000000/* Nabi - X Input Method server for hangul * Copyright (C) 2003-2009 Choe Hwanjin * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include #include #include #include #include #include #include "gettext.h" #include "ic.h" #include "server.h" #include "fontset.h" #include "debug.h" #include "util.h" #include "ustring.h" #include "nabi.h" #include "keyboard-layout.h" static void nabi_ic_preedit_configure(NabiIC *ic); static char* nabi_ic_get_hic_preedit_string(NabiIC *ic); static char* nabi_ic_get_flush_string(NabiIC *ic); static void nabi_ic_hic_on_translate(HangulInputContext* hic, int ascii, ucschar* c, void* data); static bool nabi_ic_hic_on_transition(HangulInputContext* hic, ucschar c, const ucschar* preedit, void* data); static Bool nabi_ic_update_candidate_window(NabiIC *ic); static gboolean is_syllable_boundary(ucschar prev, ucschar next) { if (hangul_is_choseong(prev)) { if (hangul_is_choseong(next)) return FALSE; if (hangul_is_jungseong(next)) return FALSE; } else if (hangul_is_jungseong(prev)) { if (hangul_is_jungseong(next)) return FALSE; if (hangul_is_jongseong(next)) return FALSE; } else if (hangul_is_jongseong(prev)) { if (hangul_is_jongseong(next)) return FALSE; } return TRUE; } static const ucschar* ustr_syllable_iter_prev(const ucschar* iter, const ucschar* begin) { if (iter > begin) iter--; while (iter > begin) { ucschar prev = *(iter - 1); ucschar curr = *iter; if (is_syllable_boundary(prev, curr)) break; iter--; } return iter; } static const ucschar* ustr_syllable_iter_next(const ucschar* iter, const ucschar* end) { while (iter < end) { ucschar curr = iter[0]; ucschar next = iter[1]; iter++; if (is_syllable_boundary(curr, next)) break; } return iter; } static inline void * nabi_malloc(size_t size) { void *ptr = malloc(size); if (ptr == NULL) { fprintf(stderr, "Nabi: memory allocation error\n"); exit(1); } return ptr; } static inline void nabi_free(void *ptr) { if (ptr != NULL) free(ptr); } static inline gboolean strniequal(const char* a, const char* b, gsize n) { return g_ascii_strncasecmp(a, b, n) == 0; } NabiConnection* nabi_connection_create(CARD16 id, const char* locale) { NabiConnection* conn; conn = g_new(NabiConnection, 1); conn->id = id; conn->mode = nabi_server->default_input_mode; conn->cd = (GIConv)-1; if (locale != NULL) { char* encoding = strchr(locale, '.'); if (encoding != NULL) { encoding++; // skip '.' if (!strniequal(encoding, "UTF-8", 5) || !strniequal(encoding, "UTF8", 4)) { conn->cd = g_iconv_open(encoding, "UTF-8"); nabi_log(3, "connection %d use encoding: %s (%x)\n", id, encoding, (int)conn->cd); } } } conn->next_new_ic_id = 1; conn->ic_list = NULL; return conn; } void nabi_connection_destroy(NabiConnection* conn) { GSList* item; if (conn->cd != (GIConv)-1) g_iconv_close(conn->cd); item = conn->ic_list; while (item != NULL) { if (item->data != NULL) nabi_ic_destroy((NabiIC*)item->data); item = g_slist_next(item); } g_slist_free(conn->ic_list); g_free(conn); } NabiIC* nabi_connection_create_ic(NabiConnection* conn, IMChangeICStruct* data) { NabiIC* ic; if (conn == NULL) return NULL; ic = nabi_ic_create(conn, data); ic->id = conn->next_new_ic_id; conn->next_new_ic_id++; if (conn->next_new_ic_id == 0) conn->next_new_ic_id++; conn->ic_list = g_slist_prepend(conn->ic_list, ic); return ic; } void nabi_connection_destroy_ic(NabiConnection* conn, NabiIC* ic) { if (conn == NULL || ic == NULL) return; conn->ic_list = g_slist_remove(conn->ic_list, ic); nabi_ic_destroy(ic); } NabiIC* nabi_connection_get_ic(NabiConnection* conn, CARD16 id) { GSList* item; if (conn == NULL || id == 0) return NULL; item = conn->ic_list; while (item != NULL) { NabiIC* ic = (NabiIC*)item->data; if (ic->id == id) return ic; item = g_slist_next(item); } return NULL; } gboolean nabi_connection_need_check_charset(NabiConnection* conn) { if (conn == NULL) return FALSE; return conn->cd != (GIConv)-1; } gboolean nabi_connection_is_valid_str(NabiConnection* conn, const char* str) { size_t ret; gchar buf[32]; gsize inbytesleft, outbytesleft; gchar *inbuf, *outbuf; if (!nabi_connection_need_check_charset(conn)) return TRUE; inbuf = (char*)str; outbuf = buf; inbytesleft = strlen(str); outbytesleft = sizeof(buf); ret = g_iconv(conn->cd, &inbuf, &inbytesleft, &outbuf, &outbytesleft); if (ret == -1) return False; return True; } NabiToplevel* nabi_toplevel_new(Window id) { NabiToplevel* toplevel = g_new(NabiToplevel, 1); toplevel->id = id; toplevel->mode = nabi_server->default_input_mode; toplevel->ref = 1; return toplevel; } void nabi_toplevel_ref(NabiToplevel* toplevel) { if (toplevel != NULL) toplevel->ref++; } void nabi_toplevel_unref(NabiToplevel* toplevel) { if (toplevel != NULL) { toplevel->ref--; if (toplevel->ref <= 0) { nabi_server_remove_toplevel(nabi_server, toplevel); g_free(toplevel); } } } static void nabi_ic_init_values(NabiIC *ic) { ic->input_style = 0; ic->client_window = 0; ic->focus_window = 0; ic->resource_name = NULL; ic->resource_class = NULL; ic->mode = nabi_server->default_input_mode; /* preedit attr */ ic->preedit.str = ustring_new(); ic->preedit.window = NULL; ic->preedit.width = 1; /* minimum window size is 1 x 1 */ ic->preedit.height = 1; /* minimum window size is 1 x 1 */ ic->preedit.area.x = 0; ic->preedit.area.y = 0; ic->preedit.area.width = 0; ic->preedit.area.height = 0; ic->preedit.area_needed.x = 0; ic->preedit.area_needed.y = 0; ic->preedit.area_needed.width = 0; ic->preedit.area_needed.height = 0; ic->preedit.spot.x = 0; ic->preedit.spot.y = 0; ic->preedit.cmap = 0; ic->preedit.normal_gc = NULL; ic->preedit.hilight_gc = NULL; ic->preedit.foreground = nabi_server->preedit_fg.pixel; ic->preedit.background = nabi_server->preedit_bg.pixel; ic->preedit.bg_pixmap = 0; ic->preedit.cursor = 0; ic->preedit.base_font = NULL; ic->preedit.font_set = NULL; ic->preedit.ascent = 0; ic->preedit.descent = 0; ic->preedit.line_space = 0; ic->preedit.state = XIMPreeditEnable; ic->preedit.start = False; ic->preedit.prev_length = 0; ic->preedit.has_start_cb = FALSE; ic->preedit.has_draw_cb = FALSE; ic->preedit.has_done_cb = FALSE; /* status attributes */ ic->status.area.x = 0; ic->status.area.y = 0; ic->status.area.width = 0; ic->status.area.height = 0; ic->status.area_needed.x = 0; ic->status.area_needed.y = 0; ic->status.area_needed.width = 0; ic->status.area_needed.height = 0; ic->status.cmap = 0; ic->status.foreground = 0; ic->status.background = 0; ic->status.background = 0; ic->status.bg_pixmap = 0; ic->status.line_space = 0; ic->status.cursor = 0; ic->status.base_font = NULL; ic->candidate = NULL; ic->toplevel = NULL; ic->composing_started = FALSE; ic->client_text = NULL; ic->wait_for_client_text = FALSE; ic->has_str_conv_cb = FALSE; ic->hic = hangul_ic_new(nabi_server->hangul_keyboard); hangul_ic_connect_callback(ic->hic, "translate", nabi_ic_hic_on_translate, ic); hangul_ic_connect_callback(ic->hic, "transition", nabi_ic_hic_on_transition, ic); } NabiIC* nabi_ic_create(NabiConnection* conn, IMChangeICStruct *data) { NabiIC *ic = g_new(NabiIC, 1); ic->connection = conn; nabi_ic_init_values(ic); nabi_ic_set_values(ic, data); return ic; } void nabi_ic_destroy(NabiIC *ic) { if (ic == NULL) return; nabi_free(ic->resource_name); ic->resource_name = NULL; nabi_free(ic->resource_class); ic->resource_class = NULL; nabi_free(ic->preedit.base_font); ic->preedit.base_font = NULL; nabi_free(ic->status.base_font); /* destroy preedit string */ if (ic->preedit.str != NULL) { g_array_free(ic->preedit.str, TRUE); ic->preedit.str = NULL; } /* destroy preedit window */ if (ic->preedit.window != NULL) gdk_window_destroy(ic->preedit.window); /* destroy fontset */ if (ic->preedit.font_set != NULL) { nabi_fontset_free(nabi_server->display, ic->preedit.font_set); ic->preedit.font_set = NULL; } if (ic->preedit.normal_gc != NULL) { g_object_unref(G_OBJECT(ic->preedit.normal_gc)); ic->preedit.normal_gc = NULL; } if (ic->preedit.hilight_gc != NULL) { g_object_unref(G_OBJECT(ic->preedit.hilight_gc)); ic->preedit.hilight_gc = NULL; } if (ic->candidate != NULL) { nabi_candidate_delete(ic->candidate); ic->candidate = NULL; } if (ic->client_text != NULL) { g_array_free(ic->client_text, TRUE); ic->client_text = NULL; } if (ic->toplevel != NULL) { nabi_toplevel_unref(ic->toplevel); ic->toplevel = NULL; } if (ic->hic != NULL) { hangul_ic_delete(ic->hic); ic->hic = NULL; } g_free(ic); } CARD16 nabi_ic_get_id(NabiIC* ic) { if (ic == NULL) return 0; return ic->id; } Bool nabi_ic_is_empty(NabiIC *ic) { if (ic == NULL || ic->hic == NULL) return True; return hangul_ic_is_empty(ic->hic); } void nabi_ic_set_hangul_keyboard(NabiIC *ic, const char* hangul_keyboard) { if (ic == NULL || ic->hic == NULL) return; hangul_ic_select_keyboard(ic->hic, hangul_keyboard); if (nabi_server->output_mode == NABI_OUTPUT_JAMO) { hangul_ic_set_output_mode(ic->hic, HANGUL_OUTPUT_JAMO); } else { hangul_ic_set_output_mode(ic->hic, HANGUL_OUTPUT_SYLLABLE); } } static void nabi_ic_hic_on_translate(HangulInputContext* hic, int ascii, ucschar* c, void* data) { nabi_server_log_key(nabi_server, *c, 0); } static bool nabi_ic_hic_on_transition(HangulInputContext* hic, ucschar c, const ucschar* preedit, void* data) { bool ret = true; NabiIC* ic = (NabiIC*)data; if (!nabi_server->auto_reorder) { if (hangul_is_choseong(c)) { if (hangul_ic_has_jungseong(hic) || hangul_ic_has_jongseong(hic)) { return false; } } if (hangul_is_jungseong(c)) { if (hangul_ic_has_jongseong(hic)) { return false; } } } if (ic != NULL) { char* utf8 = g_ucs4_to_utf8((const gunichar*)preedit, -1, NULL, NULL, NULL); ret = nabi_connection_is_valid_str(ic->connection, utf8); nabi_log(6, "on translation: %s: %s\n", utf8, ret ? "true" : "false"); g_free(utf8); } return ret; } static PangoLayout* nabi_ic_create_pango_layout(NabiIC *ic, const char* text) { GdkScreen* screen; PangoContext* context; PangoLayout* layout; screen = gdk_drawable_get_screen(ic->preedit.window); context = gdk_pango_context_get_for_screen(screen); pango_context_set_font_description(context, nabi_server->preedit_font); pango_context_set_base_dir(context, PANGO_DIRECTION_LTR); pango_context_set_language(context, pango_language_from_string("ko")); layout = pango_layout_new(context); if (text != NULL) pango_layout_set_text(layout, text, -1); return layout; } static void nabi_ic_preedit_gdk_draw_string(NabiIC *ic, char *preedit, char* normal, char* hilight) { GdkGC *normal_gc; GdkGC *hilight_gc; PangoContext *context; const PangoFontDescription *desc; PangoFontMetrics *metrics; int ascent; PangoLayout *normal_l; PangoLayout *hilight_l; PangoRectangle normal_r = { 0, 0, 12, 12 }; PangoRectangle hilight_r = { 0, 0, 12, 12 }; GdkColor fg, bg; GdkColormap* colormap; if (ic->preedit.window == NULL) return; normal_gc = ic->preedit.normal_gc; hilight_gc = ic->preedit.hilight_gc; normal_l = nabi_ic_create_pango_layout(ic, normal); pango_layout_get_pixel_extents(normal_l, NULL, &normal_r); hilight_l = nabi_ic_create_pango_layout(ic, hilight); pango_layout_get_pixel_extents(hilight_l, NULL, &hilight_r); fg = nabi_server->preedit_fg; bg = nabi_server->preedit_bg; colormap = gdk_drawable_get_colormap(ic->preedit.window); if (colormap != NULL) { gdk_colormap_query_color(colormap, ic->preedit.foreground, &fg); gdk_colormap_query_color(colormap, ic->preedit.background, &bg); } context = pango_layout_get_context(hilight_l); desc = pango_layout_get_font_description(hilight_l); metrics = pango_context_get_metrics(context, desc, pango_language_from_string("ko")); ascent = pango_font_metrics_get_ascent(metrics); ic->preedit.ascent = PANGO_PIXELS(ascent); ic->preedit.descent = normal_r.height - ic->preedit.ascent; ic->preedit.width = normal_r.width + hilight_r.height + 3; ic->preedit.height = MAX(normal_r.height, hilight_r.height) + 3; nabi_ic_preedit_configure(ic); gdk_window_clear(ic->preedit.window); gdk_draw_layout_with_colors(ic->preedit.window, normal_gc, 1, 1, normal_l, &fg, &bg); gdk_draw_layout_with_colors(ic->preedit.window, hilight_gc, 1 + normal_r.width, 1, hilight_l, &bg, &fg); if (normal_r.width > 0) { int w = normal_r.width + hilight_r.width; int h = MAX(normal_r.height, hilight_r.height); gdk_draw_line(ic->preedit.window, normal_gc, 1, h, 1 + w, h); } g_object_unref(G_OBJECT(normal_l)); g_object_unref(G_OBJECT(hilight_l)); } static void nabi_ic_preedit_x11_draw_string(NabiIC *ic, char* preedit, char *normal, char* hilight) { GC normal_gc; GC hilight_gc; Drawable drawable; XFontSet fontset; XRectangle rect = { 0, }; char* preedit_mb = NULL; char* normal_mb = NULL; char* hilight_mb = NULL; int preedit_size = 0; int normal_size = 0; int hilight_size = 0; if (ic->preedit.window == NULL) return; if (ic->preedit.font_set == 0) return; drawable = GDK_WINDOW_XWINDOW(ic->preedit.window); normal_gc = gdk_x11_gc_get_xgc(ic->preedit.normal_gc); hilight_gc = gdk_x11_gc_get_xgc(ic->preedit.hilight_gc); fontset = ic->preedit.font_set; normal_size = strlen(normal); if (normal_size > 0) { preedit_mb = g_locale_from_utf8(preedit, -1, NULL, NULL, NULL); normal_mb = g_locale_from_utf8(normal, -1, NULL, NULL, NULL); hilight_mb = g_locale_from_utf8(hilight, -1, NULL, NULL, NULL); normal_size = strlen(normal_mb); hilight_size = strlen(hilight_mb); preedit_size = strlen(preedit_mb); } else { preedit_mb = g_locale_from_utf8(preedit, -1, NULL, NULL, NULL); preedit_size = strlen(preedit_mb); } XmbTextExtents(fontset, preedit_mb, preedit_size, NULL, &rect); ic->preedit.ascent = ABS(rect.y); ic->preedit.descent = rect.height - ABS(rect.y); ic->preedit.width = rect.width; ic->preedit.height = rect.height + 1; nabi_ic_preedit_configure(ic); if (normal_size > 0) { int x = 0; int offset; offset = XmbTextEscapement(fontset, normal_mb, normal_size); XmbDrawImageString(nabi_server->display, drawable, fontset, normal_gc, x, ic->preedit.ascent, normal_mb, normal_size); if (hilight_size > 0) { XmbDrawImageString(nabi_server->display, drawable, fontset, hilight_gc, x + offset, ic->preedit.ascent, hilight_mb, hilight_size); } XDrawLine(nabi_server->display, drawable, normal_gc, x, rect.height, x + rect.width, rect.height); } else { XmbDrawImageString(nabi_server->display, drawable, fontset, hilight_gc, 0, ic->preedit.ascent, preedit_mb, preedit_size); } g_free(preedit_mb); g_free(normal_mb); g_free(hilight_mb); } static void nabi_ic_preedit_draw(NabiIC *ic) { char* preedit; char* normal; char* hilight; normal = ustring_to_utf8(ic->preedit.str, -1); hilight = nabi_ic_get_hic_preedit_string(ic); preedit = g_strconcat(normal, hilight, NULL); if (ic->input_style & XIMPreeditPosition) { if (!nabi_server->ignore_app_fontset && ic->preedit.font_set != NULL) nabi_ic_preedit_x11_draw_string(ic, preedit, normal, hilight); else nabi_ic_preedit_gdk_draw_string(ic, preedit, normal, hilight); } else if (ic->input_style & XIMPreeditArea) { nabi_ic_preedit_gdk_draw_string(ic, preedit, normal, hilight); } else if (ic->input_style & XIMPreeditNothing) { nabi_ic_preedit_gdk_draw_string(ic, preedit, normal, hilight); } g_free(preedit); g_free(normal); g_free(hilight); } /* map preedit window */ static void nabi_ic_preedit_show(NabiIC *ic) { if (ic->preedit.window == NULL) return; nabi_log(4, "show preedit window: id = %d-%d\n", ic->connection->id, ic->id); nabi_ic_preedit_configure(ic); /* draw preedit only when ic have any hangul data */ if (!nabi_ic_is_empty(ic)) gdk_window_show(ic->preedit.window); } /* unmap preedit window */ static void nabi_ic_preedit_hide(NabiIC *ic) { if (ic->preedit.window == NULL) return; nabi_log(4, "hide preedit window: id = %d-%d\n", ic->connection->id, ic->id); if (gdk_window_is_visible(ic->preedit.window)) gdk_window_hide(ic->preedit.window); } /* move and resize preedit window */ static void nabi_ic_preedit_configure(NabiIC *ic) { int x = 0, y = 0, w = 1, h = 1; if (ic->preedit.window == NULL) return; if (ic->input_style & XIMPreeditPosition) { x = ic->preedit.spot.x; y = ic->preedit.spot.y - ic->preedit.ascent; w = ic->preedit.width; h = ic->preedit.height; if (ic->preedit.area.width != 0) { /* if preedit window is out of focus window * we force to put it in focus window (preedit.area) */ if (x + w > ic->preedit.area.width) x = ic->preedit.area.width - w; } } else if (ic->input_style & XIMPreeditArea) { x = ic->preedit.area.x; y = ic->preedit.area.y; w = ic->preedit.width; h = ic->preedit.height; } else if (ic->input_style & XIMPreeditNothing) { x = 0; y = 0; w = ic->preedit.width; h = ic->preedit.height; } nabi_log(5, "configure preedit window: %d,%d %dx%d\n", x, y, w, h); gdk_window_move_resize(ic->preedit.window, x, y, w, h); } static GdkFilterReturn gdk_event_filter(GdkXEvent *xevent, GdkEvent *gevent, gpointer data) { XEvent *event = (XEvent*)xevent; guint connect_id = GPOINTER_TO_UINT(data) >> 16; guint ic_id = GPOINTER_TO_UINT(data) & 0xFFFF; NabiIC *ic = nabi_server_get_ic(nabi_server, connect_id, ic_id); if (ic == NULL) return GDK_FILTER_REMOVE; if (ic->preedit.window == NULL) return GDK_FILTER_REMOVE; if (event->xany.window != GDK_WINDOW_XWINDOW(ic->preedit.window)) return GDK_FILTER_CONTINUE; switch (event->type) { case DestroyNotify: /* preedit window is destroyed, so we set it 0 */ ic->preedit.window = NULL; return GDK_FILTER_REMOVE; break; case Expose: //g_print("Redraw Window\n"); nabi_ic_preedit_draw(ic); break; default: //g_print("event type: %d\n", event->type); break; } return GDK_FILTER_CONTINUE; } static void nabi_ic_preedit_window_new(NabiIC *ic) { GdkWindow *parent = NULL; GdkWindowAttr attr; gint mask; guint connect_id; guint ic_id; GdkColor fg = { 0, 0, 0, 0 }; GdkColor bg = { 0, 0, 0, 0 }; if (ic->focus_window != 0) parent = gdk_window_foreign_new(ic->focus_window); else if (ic->client_window != 0) parent = gdk_window_foreign_new(ic->client_window); else return; attr.wclass = GDK_INPUT_OUTPUT; attr.event_mask = GDK_EXPOSURE_MASK | GDK_STRUCTURE_MASK; attr.window_type = GDK_WINDOW_TEMP; attr.x = ic->preedit.spot.x; attr.y = ic->preedit.spot.y - ic->preedit.ascent; attr.width = ic->preedit.width; attr.height = ic->preedit.height; /* set override-redirect to true * we should set this to show preedit window on qt apps */ attr.override_redirect = TRUE; mask = GDK_WA_X | GDK_WA_Y | GDK_WA_NOREDIR; ic->preedit.window = gdk_window_new(parent, &attr, mask); fg.pixel = ic->preedit.foreground; bg.pixel = ic->preedit.background; gdk_window_set_background(ic->preedit.window, &bg); if (ic->preedit.normal_gc != NULL) g_object_unref(G_OBJECT(ic->preedit.normal_gc)); if (ic->preedit.hilight_gc != NULL) g_object_unref(G_OBJECT(ic->preedit.hilight_gc)); ic->preedit.normal_gc = gdk_gc_new(ic->preedit.window); gdk_gc_set_foreground(ic->preedit.normal_gc, &fg); gdk_gc_set_background(ic->preedit.normal_gc, &bg); ic->preedit.hilight_gc = gdk_gc_new(ic->preedit.window); gdk_gc_set_foreground(ic->preedit.hilight_gc, &bg); gdk_gc_set_background(ic->preedit.hilight_gc, &fg); /* install our preedit window event filter */ connect_id = ic->connection->id; ic_id = ic->id; gdk_window_add_filter(ic->preedit.window, gdk_event_filter, GUINT_TO_POINTER(connect_id << 16 | ic_id)); g_object_unref(G_OBJECT(parent)); } static void nabi_ic_set_client_window(NabiIC* ic, Window client_window) { Status s; Window w; Window root = None; Window parent = None; Window* children = NULL; unsigned int nchildren = 0; ic->client_window = client_window; w = client_window; s = XQueryTree(nabi_server->display, w, &root, &parent, &children, &nchildren); if (s) { while (parent != root) { if (children != NULL) { XFree(children); children = NULL; } w = parent; s = XQueryTree(nabi_server->display, w, &root, &parent, &children, &nchildren); if (!s) break; } if (children != NULL) { XFree(children); children = NULL; } } nabi_log(3, "ic: %d-%d, toplevel: %x\n", ic->id, ic->connection->id, w); if (ic->toplevel != NULL) nabi_toplevel_unref(ic->toplevel); ic->toplevel = nabi_server_get_toplevel(nabi_server, w); } static void nabi_ic_set_focus_window(NabiIC *ic, Window focus_window) { ic->focus_window = focus_window; } static void nabi_ic_set_preedit_foreground(NabiIC *ic, unsigned long foreground) { GdkColor color = { foreground, 0, 0, 0 }; ic->preedit.foreground = foreground; if (ic->preedit.normal_gc != NULL) gdk_gc_set_foreground(ic->preedit.normal_gc, &color); if (ic->preedit.hilight_gc != NULL) gdk_gc_set_background(ic->preedit.hilight_gc, &color); } static void nabi_ic_set_preedit_background(NabiIC *ic, unsigned long background) { GdkColor color = { background, 0, 0, 0 }; ic->preedit.background = background; if (ic->preedit.normal_gc != NULL) gdk_gc_set_background(ic->preedit.normal_gc, &color); if (ic->preedit.hilight_gc != NULL) gdk_gc_set_foreground(ic->preedit.hilight_gc, &color); if (ic->preedit.window != 0) gdk_window_set_background(ic->preedit.window, &color); } static void nabi_ic_load_preedit_fontset(NabiIC *ic, char *font_name) { NabiFontSet *fontset; if (ic->preedit.base_font != NULL && strcmp(ic->preedit.base_font, font_name) == 0) /* same font, do not create fontset */ return; nabi_free(ic->preedit.base_font); ic->preedit.base_font = strdup(font_name); if (ic->preedit.font_set) nabi_fontset_free(nabi_server->display, ic->preedit.font_set); fontset = nabi_fontset_create(nabi_server->display, font_name); if (fontset == NULL) return; ic->preedit.font_set = fontset->xfontset; ic->preedit.ascent = fontset->ascent; ic->preedit.descent = fontset->descent; ic->preedit.height = ic->preedit.ascent + ic->preedit.descent; ic->preedit.width = 1; } static void nabi_ic_set_spot(NabiIC *ic, XPoint *point) { if (point == NULL) return; ic->preedit.spot.x = point->x; ic->preedit.spot.y = point->y; /* if preedit window is out of focus window * we force it in focus window (preedit.area) */ if (ic->preedit.area.width != 0) { if (ic->preedit.spot.x + ic->preedit.width > ic->preedit.area.width) ic->preedit.spot.x = ic->preedit.area.width - ic->preedit.width; } nabi_ic_preedit_configure(ic); return; if (nabi_ic_is_empty(ic)) nabi_ic_preedit_hide(ic); else nabi_ic_preedit_show(ic); } static void nabi_ic_set_area(NabiIC *ic, XRectangle *rect) { if (rect == NULL) return; ic->preedit.area.x = rect->x; ic->preedit.area.y = rect->y; ic->preedit.area.width = rect->width; ic->preedit.area.height = rect->height; nabi_ic_preedit_configure(ic); if (nabi_ic_is_empty(ic)) nabi_ic_preedit_hide(ic); else nabi_ic_preedit_show(ic); } #define streql(x, y) (strcmp((x), (y)) == 0) void nabi_ic_set_values(NabiIC *ic, IMChangeICStruct *data) { XICAttribute *attr; CARD16 i; if (ic == NULL) return; attr = data->ic_attr; for (i = 0; i < data->ic_attr_num; i++, attr++) { if (streql(XNInputStyle, attr->name)) { CARD32 style = *(CARD32*)attr->value; ic->input_style = style; } else if (streql(XNClientWindow, attr->name)) { Window w = *(CARD32*)attr->value; nabi_ic_set_client_window(ic, w); } else if (streql(XNFocusWindow, attr->name)) { Window w = *(CARD32*)attr->value; nabi_ic_set_focus_window(ic, w); } else if (streql(XNStringConversionCallback, attr->name)) { ic->has_str_conv_cb = TRUE; } else { nabi_log(1, "set unknown ic attribute: %s\n", attr->name); } } attr = data->preedit_attr; for (i = 0; i < data->preedit_attr_num; i++, attr++) { if (streql(XNSpotLocation, attr->name)) { XPoint* point = (XPoint*)attr->value; nabi_ic_set_spot(ic, point); } else if (streql(XNForeground, attr->name)) { CARD32 color = *(CARD32*)attr->value; nabi_ic_set_preedit_foreground(ic, color); } else if (streql(XNBackground, attr->name)) { CARD32 color = *(CARD32*)attr->value; nabi_ic_set_preedit_background(ic, color); } else if (streql(XNArea, attr->name)) { XRectangle* rect = (XRectangle*)attr->value; nabi_ic_set_area(ic, rect); } else if (streql(XNLineSpace, attr->name)) { CARD32 line_space = *(CARD32*)attr->value; ic->preedit.line_space = line_space; } else if (streql(XNPreeditState, attr->name)) { CARD32 state = *(CARD32*)attr->value; ic->preedit.state = state; } else if (streql(XNFontSet, attr->name)) { char* fontset = (char*)attr->value; if (!nabi_server->ignore_app_fontset) { nabi_ic_load_preedit_fontset(ic, fontset); } nabi_log(5, "set ic value: id = %d-%d, fontset = %s\n", ic->id, ic->connection->id, fontset); } else if (streql(XNPreeditStartCallback, attr->name)) { ic->preedit.has_start_cb = TRUE; } else if (streql(XNPreeditDrawCallback, attr->name)) { ic->preedit.has_draw_cb = TRUE; } else if (streql(XNPreeditDoneCallback, attr->name)) { ic->preedit.has_done_cb = TRUE; } else { nabi_log(1, "set unknown preedit attribute: %s\n", attr->name); } } attr = data->status_attr; for (i = 0; i < data->status_attr_num; i++, attr++) { if (streql(XNArea, attr->name)) { XRectangle* rect = (XRectangle*)attr->value; ic->status.area = *rect; } else if (streql(XNAreaNeeded, attr->name)) { XRectangle* rect = (XRectangle*)attr->value; ic->status.area_needed = *rect; } else if (streql(XNForeground, attr->name)) { CARD32 color = *(CARD32*)attr->value; ic->status.foreground = color; } else if (streql(XNBackground, attr->name)) { CARD32 color = *(CARD32*)attr->value; ic->status.background = color; } else if (streql(XNLineSpace, attr->name)) { CARD32 line_space = *(CARD32*)attr->value; ic->status.line_space = line_space; } else if (streql(XNFontSet, attr->name)) { char* fontset = (char*)attr->value; g_free(ic->status.base_font); ic->status.base_font = g_strdup(fontset); } else { nabi_log(1, "set unknown status attributes: %s\n", attr->name); } } } void nabi_ic_get_values(NabiIC *ic, IMChangeICStruct *data) { XICAttribute *attr; CARD16 i; if (ic == NULL) return; attr = data->ic_attr; for (i = 0; i < data->ic_attr_num; i++, attr++) { if (streql(XNFilterEvents, attr->name)) { attr->value_length = sizeof(CARD32); attr->value = malloc(attr->value_length); if (attr->value != NULL) *(CARD32*)attr->value = KeyPressMask | KeyReleaseMask; } else if (streql(XNInputStyle, attr->name)) { attr->value_length = sizeof(CARD32); attr->value = malloc(attr->value_length); if (attr->value != NULL) *(CARD32*)attr->value = ic->input_style; } else if (streql(XNPreeditState, attr->name)) { /* some java applications need XNPreeditState attribute in * IC attribute instead of Preedit attributes * so we support XNPreeditState attr here */ attr->value_length = sizeof(CARD32); attr->value = malloc(attr->value_length); if (attr->value != NULL) *(CARD32*)attr->value = ic->preedit.state; } else if (streql(XNSeparatorofNestedList, attr->name)) { // ignore } else { nabi_log(1, "get unknown ic attributes: %s\n", attr->name); } if (attr->value == NULL) attr->value_length = 0; } attr = data->preedit_attr; for (i = 0; i < data->preedit_attr_num; i++, attr++) { if (streql(XNArea, attr->name)) { attr->value_length = sizeof(XRectangle); attr->value = malloc(attr->value_length); if (attr->value != NULL) *(XRectangle*)attr->value = ic->preedit.area; } else if (streql(XNAreaNeeded, attr->name)) { attr->value_length = sizeof(XRectangle); attr->value = malloc(attr->value_length); if (attr->value != NULL) *(XRectangle*)attr->value = ic->preedit.area_needed; } else if (streql(XNSpotLocation, attr->name)) { attr->value_length = sizeof(XPoint); attr->value = malloc(attr->value_length); if (attr->value != NULL) *(XPoint*)attr->value = ic->preedit.spot; } else if (streql(XNForeground, attr->name)) { attr->value_length = sizeof(CARD32); attr->value = malloc(attr->value_length); if (attr->value != NULL) *(CARD32*)attr->value = ic->preedit.foreground; } else if (streql(XNBackground, attr->name)) { attr->value_length = sizeof(CARD32); attr->value = malloc(attr->value_length); if (attr->value != NULL) *(CARD32*)attr->value = ic->preedit.background; } else if (streql(XNLineSpace, attr->name)) { attr->value_length = sizeof(CARD32); attr->value = malloc(attr->value_length); if (attr->value != NULL) *(CARD32*)attr->value = ic->preedit.line_space; } else if (streql(XNPreeditState, attr->name)) { attr->value_length = sizeof(CARD32); attr->value = malloc(attr->value_length); if (attr->value != NULL) *(CARD32*)attr->value = ic->preedit.state; } else if (streql(XNFontSet, attr->name)) { attr->value_length = strlen(ic->preedit.base_font) + 1; attr->value = malloc(attr->value_length); if (attr->value != NULL) strncpy(attr->value, ic->preedit.base_font, attr->value_length); } else { nabi_log(1, "get unknown preedit attributes: %s\n", attr->name); } if (attr->value == NULL) attr->value_length = 0; } attr = data->status_attr; for (i = 0; i < data->status_attr_num; i++, attr++) { if (streql(XNArea, attr->name)) { attr->value_length = sizeof(XRectangle); attr->value = malloc(attr->value_length); if (attr->value != NULL) *(XRectangle*)attr->value = ic->status.area; } else if (streql(XNAreaNeeded, attr->name)) { attr->value_length = sizeof(XRectangle); attr->value = malloc(attr->value_length); if (attr->value != NULL) *(XRectangle*)attr->value = ic->status.area_needed; } else if (streql(XNForeground, attr->name)) { attr->value_length = sizeof(CARD32); attr->value = malloc(attr->value_length); if (attr->value != NULL) *(CARD32*)attr->value = ic->status.foreground; } else if (streql(XNBackground, attr->name)) { attr->value_length = sizeof(CARD32); attr->value = malloc(attr->value_length); if (attr->value != NULL) *(CARD32*)attr->value = ic->status.background; } else if (streql(XNLineSpace, attr->name)) { attr->value_length = sizeof(CARD32); attr->value = malloc(attr->value_length); if (attr->value != NULL) *(CARD32*)attr->value = ic->status.line_space; } else if (streql(XNFontSet, attr->name)) { attr->value_length = strlen(ic->status.base_font) + 1; attr->value = malloc(attr->value_length); if (attr->value != NULL) strncpy(attr->value, ic->status.base_font, attr->value_length); } else { nabi_log(1, "get unknown status attributes: %s\n", attr->name); } if (attr->value == NULL) attr->value_length = 0; } } #undef streql static char *utf8_to_compound_text(const char *utf8) { char *list[2]; XTextProperty tp; int ret; list[0] = g_locale_from_utf8(utf8, -1, NULL, NULL, NULL); list[1] = 0; ret = XmbTextListToTextProperty(nabi_server->display, list, 1, XCompoundTextStyle, &tp); g_free(list[0]); if (ret > 0) nabi_log(1, "conversion failure: %d\n", ret); return (char*)tp.value; } void nabi_ic_reset(NabiIC *ic, IMResetICStruct *data) { char* preedit = nabi_ic_get_flush_string(ic); if (preedit != NULL && strlen(preedit) > 0) { char* compound_text = utf8_to_compound_text(preedit); data->commit_string = compound_text; data->length = strlen(compound_text); } else { data->commit_string = NULL; data->length = 0; } g_free(preedit); ustring_clear(ic->preedit.str); ic->preedit.prev_length = 0; if (ic->input_style & XIMPreeditPosition) { nabi_ic_preedit_hide(ic); } else if (ic->input_style & XIMPreeditArea) { nabi_ic_preedit_hide(ic); } else if (ic->input_style & XIMPreeditNothing) { nabi_ic_preedit_hide(ic); } } void nabi_ic_set_focus(NabiIC* ic) { NabiInputMode mode = ic->mode; switch (nabi_server->input_mode_scope) { case NABI_INPUT_MODE_PER_DESKTOP: mode = nabi_server->input_mode; break; case NABI_INPUT_MODE_PER_APPLICATION: if (ic->connection != NULL) mode = ic->connection->mode; break; case NABI_INPUT_MODE_PER_TOPLEVEL: if (ic->toplevel != NULL) mode = ic->toplevel->mode; break; case NABI_INPUT_MODE_PER_IC: default: break; } nabi_ic_set_mode(ic, mode); nabi_ic_set_hangul_keyboard(ic, nabi_server->hangul_keyboard); } void nabi_ic_set_mode(NabiIC *ic, NabiInputMode mode) { switch (nabi_server->input_mode_scope) { case NABI_INPUT_MODE_PER_DESKTOP: nabi_server->input_mode = mode; break; case NABI_INPUT_MODE_PER_APPLICATION: if (ic->connection != NULL) ic->connection->mode = mode; break; case NABI_INPUT_MODE_PER_TOPLEVEL: if (ic->toplevel != NULL) ic->toplevel->mode = mode; break; case NABI_INPUT_MODE_PER_IC: default: break; } ic->mode = mode; switch (mode) { case NABI_INPUT_MODE_DIRECT: nabi_ic_flush(ic); nabi_server_set_mode_info(nabi_server, NABI_MODE_INFO_DIRECT); nabi_ic_end_composing(ic); break; case NABI_INPUT_MODE_COMPOSE: /* 전에는 여기서 nabi_ic_preedit_start()함수를 불렀는데 * gvim에서 문제가 생겨서 키 입력이 시작될때 preedit start를 부르도록 * 수정했다. #305259 * gvim에서 :이나 /입력할때 영문 상태로 바꾸기위해서 * xic를 destroy했다가 create하는데, * 그런데 focus 이벤트에서 preedit start 콜백을 부르면 * xim client에서는 두번째 XCreateIC() 안에서 xim server로부터 응답을 * 기다리다가 방금전 focus 이벤트에서 보냈던 preedit start callback을 * 받아 이제 처리하게 된다. 이것은 방금전에 destroy된 IC의 것임에도 * xlib에서는 그 응답을 받아서 preedit_start callback을 처리하는데 * gvim의 preedit start callback에서는 다시 XIC를 create한다. * 따라서 XCreateIC() 함수안에서 다시 XCreateIC()를 부른 상황이 되는데 * 이러면 첫번째 XCreateIC()의 응답이 먼처 처리되어야 하는데, 그렇지 * 못하고 두번째 XCreateIC() 함수의 응답을 기다리게 되면서 xim * client 가 block 된다. * 이 문제를 쉽게 해결하기 위해서 preedit start 프로토콜을 * 아무 키입력이나 시작했을 때에 보내는 방식으로 바꾼다. */ nabi_server_set_mode_info(nabi_server, NABI_MODE_INFO_COMPOSE); nabi_ic_start_composing(ic); break; default: break; } nabi_ic_status_update(ic); } void nabi_ic_start_composing(NabiIC *ic) { if (ic->composing_started) return; nabi_log(3, "start composing: %d-%d\n", ic->connection->id, ic->id); ic->composing_started = TRUE; if (nabi_server->dynamic_event_flow) { IMPreeditStateStruct preedit_state; preedit_state.connect_id = ic->connection->id; preedit_state.icid = ic->id; IMPreeditStart(nabi_server->xims, (XPointer)&preedit_state); } } void nabi_ic_end_composing(NabiIC *ic) { if (!ic->composing_started) return; nabi_log(3, "end composing: %d-%d\n", ic->connection->id, ic->id); ic->composing_started = FALSE; if (nabi_server->dynamic_event_flow) { IMPreeditStateStruct preedit_state; preedit_state.connect_id = ic->connection->id; preedit_state.icid = ic->id; IMPreeditEnd(nabi_server->xims, (XPointer)&preedit_state); } } void nabi_ic_preedit_start(NabiIC *ic) { if (ic->preedit.start) return; nabi_log(3, "preedit start: %d-%d\n", ic->connection->id, ic->id); if (ic->input_style & XIMPreeditCallbacks) { if (ic->preedit.has_start_cb) { IMPreeditCBStruct preedit_data; preedit_data.major_code = XIM_PREEDIT_START; preedit_data.minor_code = 0; preedit_data.connect_id = ic->connection->id; preedit_data.icid = ic->id; preedit_data.todo.return_value = 0; IMCallCallback(nabi_server->xims, (XPointer)&preedit_data); } } else if (ic->input_style & XIMPreeditPosition) { if (ic->preedit.window == NULL) nabi_ic_preedit_window_new(ic); } else if (ic->input_style & XIMPreeditArea) { if (ic->preedit.window == NULL) nabi_ic_preedit_window_new(ic); } else if (ic->input_style & XIMPreeditNothing) { if (ic->preedit.window == NULL) nabi_ic_preedit_window_new(ic); } ic->preedit.start = True; } void nabi_ic_preedit_done(NabiIC *ic) { if (!ic->preedit.start) return; nabi_log(3, "preedit done: %d-%d\n", ic->connection->id, ic->id); if (ic->input_style & XIMPreeditCallbacks) { if (ic->preedit.has_done_cb) { IMPreeditCBStruct preedit_data; preedit_data.major_code = XIM_PREEDIT_DONE; preedit_data.minor_code = 0; preedit_data.connect_id = ic->connection->id; preedit_data.icid = ic->id; preedit_data.todo.return_value = 0; IMCallCallback(nabi_server->xims, (XPointer)&preedit_data); } } else if (ic->input_style & XIMPreeditPosition) { nabi_ic_preedit_hide(ic); } else if (ic->input_style & XIMPreeditArea) { nabi_ic_preedit_hide(ic); } else if (ic->input_style & XIMPreeditNothing) { nabi_ic_preedit_hide(ic); } ic->preedit.start = False; } static char* nabi_ic_get_hic_preedit_string(NabiIC *ic) { const ucschar *str = hangul_ic_get_preedit_string(ic->hic); return g_ucs4_to_utf8((const gunichar*)str, -1, NULL, NULL, NULL); } static char* nabi_ic_get_preedit_string(NabiIC *ic) { char* preedit; const ucschar* hic_preedit; UString* str; str = ustring_new(); ustring_append(str, ic->preedit.str); hic_preedit = hangul_ic_get_preedit_string(ic->hic); ustring_append_ucs4(str, hic_preedit, -1); preedit = ustring_to_utf8(str, str->len); ustring_delete(str); return preedit; } static char* nabi_ic_get_hic_commit_string(NabiIC *ic) { const ucschar *str = hangul_ic_get_commit_string(ic->hic); return g_ucs4_to_utf8((const gunichar*)str, -1, NULL, NULL, NULL); } static char* nabi_ic_get_flush_string(NabiIC *ic) { char* flushed; const ucschar* hic_flushed; GArray* str; str = ustring_new(); ustring_append(str, ic->preedit.str); hic_flushed = hangul_ic_flush(ic->hic); ustring_append_ucs4(str, hic_flushed, -1); flushed = ustring_to_utf8(str, -1); ustring_delete(str); return flushed; } static inline XIMFeedback * nabi_ic_preedit_feedback_new(int underline_len, int reverse_len) { int i, len = underline_len + reverse_len; XIMFeedback *feedback = g_new(XIMFeedback, len + 1); if (feedback != NULL) { for (i = 0; i < underline_len; ++i) feedback[i] = XIMUnderline; for (i = underline_len; i < len; ++i) feedback[i] = XIMReverse; feedback[len] = 0; } return feedback; } void nabi_ic_preedit_update(NabiIC *ic) { int preedit_len, normal_len, hilight_len; char* preedit; char* normal; char* hilight; normal = ustring_to_utf8(ic->preedit.str, -1); hilight = nabi_ic_get_hic_preedit_string(ic); preedit = g_strconcat(normal, hilight, NULL); normal_len = g_utf8_strlen(normal, -1); hilight_len = g_utf8_strlen(hilight, -1); preedit_len = normal_len + hilight_len; if (preedit_len <= 0) { if (ic->candidate != NULL) { nabi_candidate_delete(ic->candidate); ic->candidate = NULL; } nabi_ic_preedit_clear(ic); g_free(normal); g_free(hilight); g_free(preedit); if (ic->preedit.start) nabi_ic_preedit_done(ic); return; } if (!ic->preedit.start) nabi_ic_preedit_start(ic); nabi_log(3, "update preedit: id = %d-%d, preedit = '%s' + '%s'\n", ic->connection->id, ic->id, normal, hilight); if (ic->input_style & XIMPreeditCallbacks) { if (ic->preedit.has_draw_cb) { char *compound_text; XIMText text; IMPreeditCBStruct data; compound_text = utf8_to_compound_text(preedit); data.major_code = XIM_PREEDIT_DRAW; data.minor_code = 0; data.connect_id = ic->connection->id; data.icid = ic->id; data.todo.draw.caret = preedit_len; data.todo.draw.chg_first = 0; data.todo.draw.chg_length = ic->preedit.prev_length; data.todo.draw.text = &text; text.feedback = nabi_ic_preedit_feedback_new(normal_len, hilight_len); text.encoding_is_wchar = False; text.string.multi_byte = compound_text; text.length = strlen(compound_text); IMCallCallback(nabi_server->xims, (XPointer)&data); g_free(text.feedback); XFree(compound_text); } } else if (ic->input_style & XIMPreeditPosition) { nabi_ic_preedit_show(ic); if (!nabi_server->ignore_app_fontset && ic->preedit.font_set != NULL) nabi_ic_preedit_x11_draw_string(ic, preedit, normal, hilight); else nabi_ic_preedit_gdk_draw_string(ic, preedit, normal, hilight); } else if (ic->input_style & XIMPreeditArea) { nabi_ic_preedit_show(ic); nabi_ic_preedit_gdk_draw_string(ic, preedit, normal, hilight); } else if (ic->input_style & XIMPreeditNothing) { nabi_ic_preedit_show(ic); nabi_ic_preedit_gdk_draw_string(ic, preedit, normal, hilight); } ic->preedit.prev_length = preedit_len; g_free(normal); g_free(hilight); g_free(preedit); } void nabi_ic_preedit_clear(NabiIC *ic) { if (ic->preedit.prev_length == 0) return; if (ic->input_style & XIMPreeditCallbacks) { if (ic->preedit.has_draw_cb) { XIMText text; XIMFeedback feedback[4] = { XIMReverse, 0, 0, 0 }; IMPreeditCBStruct data; nabi_log(3, "clear preedit: id = %d-%d\n", ic->connection->id, ic->id); data.major_code = XIM_PREEDIT_DRAW; data.minor_code = 0; data.connect_id = ic->connection->id; data.icid = ic->id; data.todo.draw.caret = 0; data.todo.draw.chg_first = 0; data.todo.draw.chg_length = ic->preedit.prev_length; data.todo.draw.text = &text; text.feedback = feedback; text.encoding_is_wchar = False; text.string.multi_byte = NULL; text.length = 0; IMCallCallback(nabi_server->xims, (XPointer)&data); } } else if (ic->input_style & XIMPreeditPosition) { nabi_ic_preedit_hide(ic); } else if (ic->input_style & XIMPreeditArea) { nabi_ic_preedit_hide(ic); } else if (ic->input_style & XIMPreeditNothing) { nabi_ic_preedit_hide(ic); } ic->preedit.prev_length = 0; } static void nabi_ic_commit_utf8(NabiIC *ic, const char *utf8_str) { IMCommitStruct commit_data; char *compound_text; /* According to XIM Spec, We should delete preedit string here * befor commiting the string. but it makes too many flickering * so I first send commit string and then delete preedit string. * This makes some problem on gtk2 entry */ /* Now, Conforming to XIM spec */ /* On XIMPreeditPosition mode, input sequence is wrong on gtk+ 1 app, * so we commit and then clear preedit string on XIMPreeditPosition mode */ if (ic->input_style & XIMPreeditCallbacks) nabi_ic_preedit_clear(ic); nabi_log(1, "commit: id = %d-%d, str = '%s'\n", ic->connection->id, ic->id, utf8_str); compound_text = utf8_to_compound_text(utf8_str); commit_data.major_code = XIM_COMMIT; commit_data.minor_code = 0; commit_data.connect_id = ic->connection->id; commit_data.icid = ic->id; commit_data.flag = XimLookupChars; commit_data.commit_string = compound_text; IMCommitString(nabi_server->xims, (XPointer)&commit_data); XFree(compound_text); /* we delete preedit string here when PreeditPosition */ if (!(ic->input_style & XIMPreeditCallbacks)) nabi_ic_preedit_clear(ic); } Bool nabi_ic_commit(NabiIC *ic) { if (nabi_server->commit_by_word || nabi_server->hanja_mode) { const ucschar *str = hangul_ic_get_commit_string(ic->hic); ustring_append_ucs4(ic->preedit.str, str, -1); if (hangul_ic_is_empty(ic->hic)) nabi_ic_flush(ic); } else { char* str = nabi_ic_get_hic_commit_string(ic); if (str != NULL && strlen(str) > 0) nabi_ic_commit_utf8(ic, str); g_free(str); } return True; } void nabi_ic_flush(NabiIC *ic) { char* str; nabi_ic_preedit_clear(ic); nabi_ic_preedit_done(ic); str = nabi_ic_get_flush_string(ic); if (str != NULL && strlen(str) > 0) nabi_ic_commit_utf8(ic, str); g_free(str); ustring_clear(ic->preedit.str); } void nabi_ic_status_start(NabiIC *ic) { if (!nabi_server->show_status) return; if (ic->input_style & XIMStatusCallbacks) { IMStatusCBStruct data; char *compound_text; XIMText text; XIMFeedback feedback[4] = { 0, 0, 0, 0 }; compound_text = ""; data.major_code = XIM_STATUS_START; data.minor_code = 0; data.connect_id = ic->connection->id; data.icid = ic->id; data.todo.draw.data.text = &text; data.todo.draw.type = XIMTextType; text.feedback = feedback; text.encoding_is_wchar = False; text.string.multi_byte = compound_text; text.length = strlen(compound_text); IMCallCallback(nabi_server->xims, (XPointer)&data); } g_print("Status start\n"); } void nabi_ic_status_done(NabiIC *ic) { if (!nabi_server->show_status) return; if (ic->input_style & XIMStatusCallbacks) { IMStatusCBStruct data; char *compound_text; XIMText text; XIMFeedback feedback[4] = { 0, 0, 0, 0 }; compound_text = ""; data.major_code = XIM_STATUS_DONE; data.minor_code = 0; data.connect_id = ic->connection->id; data.icid = ic->id; data.todo.draw.data.text = &text; data.todo.draw.type = XIMTextType; text.feedback = feedback; text.encoding_is_wchar = False; text.string.multi_byte = compound_text; text.length = strlen(compound_text); IMCallCallback(nabi_server->xims, (XPointer)&data); } g_print("Status done\n"); } void nabi_ic_status_update(NabiIC *ic) { if (!nabi_server->show_status) return; if (ic->input_style & XIMStatusCallbacks) { IMStatusCBStruct data; char *status_str; char *compound_text; XIMText text; XIMFeedback feedback[4] = { 0, 0, 0, 0 }; switch (ic->mode) { case NABI_INPUT_MODE_DIRECT: status_str = "영어"; break; case NABI_INPUT_MODE_COMPOSE: status_str = "한글"; break; default: status_str = ""; break; } compound_text = utf8_to_compound_text(status_str); data.major_code = XIM_STATUS_DRAW; data.minor_code = 0; data.connect_id = ic->connection->id; data.icid = ic->id; data.todo.draw.data.text = &text; data.todo.draw.type = XIMTextType; text.feedback = feedback; text.encoding_is_wchar = False; text.string.multi_byte = compound_text; text.length = strlen(compound_text); IMCallCallback(nabi_server->xims, (XPointer)&data); } g_print("Status draw\n"); } static Bool nabi_ic_candidate_process(NabiIC* ic, KeySym keyval) { const Hanja* hanja = NULL; switch (keyval) { case XK_Up: nabi_candidate_prev(ic->candidate); break; case XK_Down: nabi_candidate_next(ic->candidate); break; case XK_Left: case XK_Page_Up: case XK_KP_Subtract: nabi_candidate_prev_page(ic->candidate); break; case XK_Right: case XK_Page_Down: case XK_KP_Add: nabi_candidate_next_page(ic->candidate); break; case XK_Escape: nabi_candidate_delete(ic->candidate); ic->candidate = NULL; break; case XK_Return: case XK_KP_Enter: hanja = nabi_candidate_get_current(ic->candidate); break; case XK_1: case XK_2: case XK_3: case XK_4: case XK_5: case XK_6: case XK_7: case XK_8: case XK_9: hanja = nabi_candidate_get_nth(ic->candidate, keyval - XK_1); break; case XK_KP_1: case XK_KP_2: case XK_KP_3: case XK_KP_4: case XK_KP_5: case XK_KP_6: case XK_KP_7: case XK_KP_8: case XK_KP_9: hanja = nabi_candidate_get_nth(ic->candidate, keyval - XK_KP_1); break; case XK_KP_End: hanja = nabi_candidate_get_nth(ic->candidate, 0); break; case XK_KP_Down: hanja = nabi_candidate_get_nth(ic->candidate, 1); break; case XK_KP_Next: hanja = nabi_candidate_get_nth(ic->candidate, 2); break; case XK_KP_Left: hanja = nabi_candidate_get_nth(ic->candidate, 3); break; case XK_KP_Begin: hanja = nabi_candidate_get_nth(ic->candidate, 4); break; case XK_KP_Right: hanja = nabi_candidate_get_nth(ic->candidate, 5); break; case XK_KP_Home: hanja = nabi_candidate_get_nth(ic->candidate, 6); break; case XK_KP_Up: hanja = nabi_candidate_get_nth(ic->candidate, 7); break; case XK_KP_Prior: hanja = nabi_candidate_get_nth(ic->candidate, 8); break; default: if (nabi_server->hanja_mode) { return False; } else { switch (keyval) { case XK_k: nabi_candidate_prev(ic->candidate); break; case XK_j: nabi_candidate_next(ic->candidate); break; case XK_h: nabi_candidate_prev_page(ic->candidate); break; case XK_l: case XK_space: case XK_Tab: nabi_candidate_next_page(ic->candidate); break; default: return False; } } } if (hanja != NULL) { nabi_ic_insert_candidate(ic, hanja); nabi_ic_preedit_update(ic); nabi_ic_update_candidate_window(ic); } return True; } static void nabi_ic_request_client_text(NabiIC* ic) { if (ic->has_str_conv_cb) { IMStrConvCBStruct data; ic->wait_for_client_text = TRUE; data.major_code = XIM_STR_CONVERSION; data.minor_code = 0; data.connect_id = ic->connection->id; data.icid = ic->id; data.strconv.position = (XIMStringConversionPosition)0; data.strconv.direction = XIMBackwardChar; data.strconv.operation = XIMStringConversionRetrieval; data.strconv.factor = 10; data.strconv.text = NULL; IMCallCallback(nabi_server->xims, (XPointer)&data); nabi_log(3, "request client text: id = %d-%d\n", ic->connection->id, ic->id); } } static void nabi_ic_delete_client_text(NabiIC* ic, size_t len) { if (ic->has_str_conv_cb) { IMStrConvCBStruct data; data.major_code = XIM_STR_CONVERSION; data.minor_code = 0; data.connect_id = ic->connection->id; data.icid = ic->id; data.strconv.position = (XIMStringConversionPosition)0; data.strconv.direction = XIMBackwardChar; data.strconv.operation = XIMStringConversionSubstitution; data.strconv.factor = len; data.strconv.text = NULL; IMCallCallback(nabi_server->xims, (XPointer)&data); nabi_log(3, "delete client text: id = %d-%d, pos = %d, len = %d\n", ic->connection->id, ic->id, data.strconv.position, data.strconv.factor); } } static KeySym nabi_ic_normalize_keysym(NabiIC* ic, KeySym keysym, unsigned int state) { KeySym upper, lower; bool need_normalize; /* unicode keysym */ if ((keysym & 0xff000000) == 0x01000000) keysym &= 0x00ffffff; need_normalize = !hangul_ic_is_transliteration(ic->hic); if (need_normalize) { /* for non-qwerty mapping */ if (nabi_server->use_system_keymap && nabi_server->layout != NULL) { keysym = nabi_keyboard_layout_get_key(nabi_server->layout, keysym); } upper = keysym; lower = keysym; XConvertCase(keysym, &lower, &upper); if (state & ShiftMask) keysym = upper; else keysym = lower; } return keysym; } Bool nabi_ic_process_keyevent(NabiIC* ic, KeySym keysym, unsigned int state) { Bool ret; if (ic->candidate) { ret = nabi_ic_candidate_process(ic, keysym); if (nabi_server->hanja_mode) { if (ret) return ret; } else { return ret; } } /* if shift is pressed, we dont commit current string * and silently ignore it */ if (keysym == XK_Shift_L || keysym == XK_Shift_R) return False; /* for vi user: on Esc we change state to direct mode */ if (nabi_server_is_off_key(nabi_server, keysym, state)) { /* 이 경우는 vi 나 emacs등 에디터에서 사용하기 위한 키이므로 * 이 키를 xim에서 사용하지 않고 그대로 다시 forwarding하는 * 방식으로 작동하게 한다. */ nabi_ic_set_mode(ic, NABI_INPUT_MODE_DIRECT); return False; } /* candiate */ if (nabi_server_is_candidate_key(nabi_server, keysym, state)) { nabi_ic_request_client_text(ic); nabi_ic_update_candidate_window(ic); return True; } /* forward key event and commit current string if any state is on */ if (state & (ControlMask | /* Ctl */ Mod1Mask | /* Alt */ Mod3Mask | Mod4Mask | /* Windows */ Mod5Mask)) { if (!nabi_ic_is_empty(ic)) nabi_ic_flush(ic); return False; } /* save key event log */ nabi_server_log_key(nabi_server, keysym, state); if (keysym == XK_BackSpace) { ret = hangul_ic_backspace(ic->hic); if (ret) nabi_ic_preedit_update(ic); else { guint len = ustring_length(ic->preedit.str); if (len > 0) { ustring_erase(ic->preedit.str, len - 1, 1); nabi_ic_preedit_update(ic); return True; } } return ret; } keysym = nabi_ic_normalize_keysym(ic, keysym, state); if (keysym >= XK_exclam && keysym <= XK_asciitilde) { ret = hangul_ic_process(ic->hic, keysym); nabi_ic_commit(ic); nabi_ic_preedit_update(ic); if (nabi_server->hanja_mode) { nabi_ic_update_candidate_window(ic); } return ret; } if (nabi_server->hanja_mode) { if (ic->candidate != NULL) { nabi_candidate_delete(ic->candidate); ic->candidate = NULL; } } nabi_ic_flush(ic); return False; } static void nabi_ic_candidate_commit_cb(NabiCandidate *candidate, const Hanja* hanja, gpointer data) { NabiIC *ic; if (candidate == NULL || data == NULL) return; ic = (NabiIC*)data; nabi_ic_insert_candidate(ic, hanja); nabi_ic_preedit_update(ic); nabi_ic_update_candidate_window(ic); } static void nabi_ic_close_candidate_window(NabiIC* ic) { nabi_candidate_delete(ic->candidate); ic->candidate = NULL; } static Bool nabi_ic_update_candidate_window_with_key(NabiIC *ic, const char* key) { Window parent = 0; HanjaList* list; char* p; char* normalized; int valid_list_length = 0; const Hanja **valid_list = NULL; if (ic->focus_window != 0) parent = ic->focus_window; else if (ic->client_window != 0) parent = ic->client_window; p = strrchr(key, ' '); if (p != NULL) key = p; while (isspace(*key) || ispunct(*key)) key++; if (key[0] == '\0') { nabi_ic_close_candidate_window(ic); return True; } /* candidate 검색을 위한 스트링이 자모형일 수도 있으므로 normalized하여 * hanja table에서 검색을 해야 한다. */ normalized = g_utf8_normalize(key, -1, G_NORMALIZE_DEFAULT_COMPOSE); if (normalized == NULL) { nabi_ic_close_candidate_window(ic); return True; } nabi_log(6, "lookup string: %s\n", normalized); if (nabi_server->hanja_mode && ic->client_text == NULL) list = hanja_table_match_prefix(nabi_server->symbol_table, normalized); else if (nabi_server->commit_by_word && ic->client_text == NULL) list = hanja_table_match_prefix(nabi_server->symbol_table, normalized); else list = hanja_table_match_suffix(nabi_server->symbol_table, normalized); if (list == NULL) { if (nabi_server->hanja_mode && ic->client_text == NULL) list = hanja_table_match_prefix(nabi_server->hanja_table, normalized); else if (nabi_server->commit_by_word && ic->client_text == NULL) list = hanja_table_match_prefix(nabi_server->hanja_table, normalized); else list = hanja_table_match_suffix(nabi_server->hanja_table, normalized); } if (list != NULL) { int i; int n = hanja_list_get_size(list); valid_list = g_new(const Hanja*, n); if (nabi_connection_need_check_charset(ic->connection)) { int j; for (i = 0, j = 0; i < n; i++) { const Hanja* hanja = hanja_list_get_nth(list, i); const char* value = hanja_get_value(hanja); if (nabi_connection_is_valid_str(ic->connection, value)) { valid_list[j] = hanja; j++; } } valid_list_length = j; } else { for (i = 0; i < n; i++) { valid_list[i] = hanja_list_get_nth(list, i); } valid_list_length = n; } } if (valid_list_length > 0) { if (ic->candidate != NULL) { nabi_candidate_set_hanja_list(ic->candidate, list, valid_list, valid_list_length); } else { ic->candidate = nabi_candidate_new(key, 9, list, valid_list, valid_list_length, parent, &nabi_ic_candidate_commit_cb, ic); } } else { nabi_ic_close_candidate_window(ic); } g_free(normalized); return True; } static Bool nabi_ic_update_candidate_window(NabiIC *ic) { Bool res; char* key = nabi_ic_get_preedit_string(ic); res = nabi_ic_update_candidate_window_with_key(ic, key); g_free(key); return res; } void nabi_ic_insert_candidate(NabiIC *ic, const Hanja* hanja) { const char* key; const char* value; int keylen = -1; if (!nabi_server_is_valid_ic(nabi_server, ic)) return; value = hanja_get_value(hanja); if (value == NULL) return; key = hanja_get_key(hanja); if (key != NULL) keylen = g_utf8_strlen(key, -1); if ((nabi_server->hanja_mode && ic->client_text == NULL) || (nabi_server->commit_by_word && ic->client_text == NULL)) { /* 한자 모드나 단어 단위 입력에서는 prefix 방식으로 매칭하여 변환하므로 * 앞에서부터 preedit text를 지워 나간다. * 그러나 client text가 있을 때에는 suffix 방식으로 검색해야 한다. */ if (ic->preedit.str != NULL && ic->preedit.str->len > 0) { const ucschar* begin = ustring_begin(ic->preedit.str); const ucschar* end = ustring_end(ic->preedit.str); const ucschar* iter = begin; guint n; while (keylen > 0 && iter < end) { iter = ustr_syllable_iter_next(iter, end); keylen--; } n = iter - begin; if (n > 0) ustring_erase(ic->preedit.str, 0, n); } if (keylen > 0) { if (!hangul_ic_is_empty(ic->hic)) { hangul_ic_reset(ic->hic); keylen--; } } } else { /* candidate를 입력하려면 원래 텍스트에서 candidate로 교체될 부분을 * 지우고 commit 하여야 한다. * 입력이 자모스트링으로 된 경우를 대비하여 syllable 단위로 글자를 * 지운다. libhangul의 suffix 방식으로 매칭하는 것이므로 뒤쪽부터 한 * 음절씩 지워 나간다. * candidate string의 구조는 * * client_text + nabi_ic_preedit_str + hangul_ic_preedit_str * * 과 같으므로 뒤쪽부터 순서대로 지운다.*/ /* hangul_ic_preedit_str */ if (keylen > 0) { if (!hangul_ic_is_empty(ic->hic)) { hangul_ic_reset(ic->hic); keylen--; } } /* nabi_ic_preedit_str */ if (ic->preedit.str != NULL) { const ucschar* begin = ustring_begin(ic->preedit.str); const ucschar* iter = ustring_end(ic->preedit.str); while (keylen > 0 && ustring_length(ic->preedit.str) > 0) { guint pos; guint n; iter = ustr_syllable_iter_prev(iter, begin); pos = iter - begin; n = ustring_length(ic->preedit.str) - pos; ustring_erase(ic->preedit.str, pos, n); keylen--; } } /* client_text */ if (ic->client_text != NULL) { const ucschar* begin = ustring_begin(ic->client_text); const ucschar* end = ustring_end(ic->client_text); const ucschar* iter = end; while (keylen > 0 && iter > begin) { iter = ustr_syllable_iter_prev(iter, begin); keylen--; } nabi_ic_delete_client_text(ic, end - iter); } } if (strlen(value) > 0) { char* preedit_left = NULL; char* modified_value; char* candidate; /* nabi ic의 preedit string이 남아 있으면 그것도 commit해야지 * 그렇지 않으면 한자로 변환되지 않은 preedit string은 한자 변환후 * commit된 스트링뒤에서 나타나게 된다. */ if (ustring_length(ic->preedit.str) > 0) { preedit_left = ustring_to_utf8(ic->preedit.str, -1); if (!nabi_server->hanja_mode && !nabi_server->commit_by_word) { ustring_clear(ic->preedit.str); } } else { preedit_left = g_strdup(""); } if (nabi_server->use_simplified_chinese) { modified_value = nabi_traditional_to_simplified(value); if (!nabi_connection_is_valid_str(ic->connection, modified_value)) { g_free(modified_value); modified_value = g_strdup(value); } } else { modified_value = g_strdup(value); } if (strcmp(nabi->config->candidate_format->str, "hanja(hangul)") == 0) { if (nabi_server->hanja_mode || nabi_server->commit_by_word) candidate = g_strdup_printf("%s(%s)", modified_value, key); else candidate = g_strdup_printf("%s%s(%s)", preedit_left, modified_value, key); } else if (strcmp(nabi->config->candidate_format->str, "hangul(hanja)") == 0) { if (nabi_server->hanja_mode || nabi_server->commit_by_word) candidate = g_strdup_printf("%s(%s)", key, modified_value); else candidate = g_strdup_printf("%s%s(%s)", preedit_left, key, modified_value); } else { if (nabi_server->hanja_mode || nabi_server->commit_by_word) candidate = g_strdup_printf("%s", modified_value); else candidate = g_strdup_printf("%s%s", preedit_left, modified_value); } nabi_ic_commit_utf8(ic, candidate); g_free(preedit_left); g_free(modified_value); g_free(candidate); } if (ic->client_text != NULL) ustring_clear(ic->client_text); } void nabi_ic_process_string_conversion_reply(NabiIC* ic, const char* text) { char* key; char* preedit; if (text == NULL) return; // gtk2의 xim module은 XIMStringConversionSubstitution에도 // string을 보내온다. 그런 경우에 무시하기 위해서 client text를 요구한 // 경우에만 candidate window를 띄우고 아니면 무시한다. if (!ic->wait_for_client_text) return; ic->wait_for_client_text = FALSE; if (ic->client_text == NULL) ic->client_text = ustring_new(); ustring_clear(ic->client_text); ustring_append_utf8(ic->client_text, text); preedit = nabi_ic_get_preedit_string(ic); key = g_strconcat(text, preedit, NULL); nabi_ic_update_candidate_window_with_key(ic, key); g_free(preedit); g_free(key); } /* 이 테이블은 US layout을 기준으로 만든것이다. * 그러나 keycode의 값은 하드웨어마다 다를 수 있으므로 * 일반 PC 환경이 아닌 곳에서는 문제가 될지도 모른다. */ static const unsigned int keymap[][2] = { { XK_1, XK_exclam }, /* 10 */ { XK_2, XK_at }, /* 11 */ { XK_3, XK_numbersign }, /* 12 */ { XK_4, XK_dollar }, /* 13 */ { XK_5, XK_percent }, /* 14 */ { XK_6, XK_asciicircum }, /* 15 */ { XK_7, XK_ampersand }, /* 16 */ { XK_8, XK_asterisk }, /* 17 */ { XK_9, XK_parenleft }, /* 18 */ { XK_0, XK_parenright }, /* 19 */ { XK_minus, XK_underscore }, /* 20 */ { XK_equal, XK_plus }, /* 21 */ { XK_BackSpace, XK_BackSpace }, /* 22 */ { XK_Tab, XK_Tab }, /* 23 */ { XK_q, XK_Q }, /* 24 */ { XK_w, XK_W }, /* 25 */ { XK_e, XK_E }, /* 26 */ { XK_r, XK_R }, /* 27 */ { XK_t, XK_T }, /* 28 */ { XK_y, XK_Y }, /* 29 */ { XK_u, XK_U }, /* 30 */ { XK_i, XK_I }, /* 31 */ { XK_o, XK_O }, /* 32 */ { XK_p, XK_P }, /* 33 */ { XK_bracketleft, XK_braceleft }, /* 34 */ { XK_bracketright, XK_braceright }, /* 35 */ { XK_Return, XK_Return }, /* 36 */ { XK_Control_L, XK_Control_L }, /* 37 */ { XK_a, XK_A }, /* 38 */ { XK_s, XK_S }, /* 39 */ { XK_d, XK_D }, /* 40 */ { XK_f, XK_F }, /* 41 */ { XK_g, XK_G }, /* 42 */ { XK_h, XK_H }, /* 43 */ { XK_j, XK_J }, /* 44 */ { XK_k, XK_K }, /* 45 */ { XK_l, XK_L }, /* 46 */ { XK_semicolon, XK_colon }, /* 47 */ { XK_apostrophe, XK_quotedbl }, /* 48 */ { XK_grave, XK_asciitilde }, /* 49 */ { XK_Shift_L, XK_Shift_L }, /* 50 */ { XK_backslash, XK_bar }, /* 51 */ { XK_z, XK_Z }, /* 52 */ { XK_x, XK_X }, /* 53 */ { XK_c, XK_C }, /* 54 */ { XK_v, XK_V }, /* 55 */ { XK_b, XK_B }, /* 56 */ { XK_n, XK_N }, /* 57 */ { XK_m, XK_M }, /* 58 */ { XK_comma, XK_less }, /* 59 */ { XK_period, XK_greater }, /* 60 */ { XK_slash, XK_question }, /* 61 */ }; KeySym nabi_ic_lookup_keysym(NabiIC* ic, XKeyEvent* event) { int index; KeySym keysym; bool is_transliteration; is_transliteration = hangul_ic_is_transliteration(ic->hic); if (is_transliteration) { /* transliteration method인 경우에는 사용자의 자판 설정에서 * 오는 값을 임의로 바꿔서는 안된다. 사용자 설정에 따르는 것이 * 맞다. */ char buf[64]; XLookupString(event, buf, sizeof(buf), &keysym, NULL); } else { keysym = NoSymbol; index = (event->state & ShiftMask) ? 1 : 0; /* 자판 설정에 따른 변환 문제를 피하기 위해서 내장 keymap을 사용하여 * keycode를 keysym으로 변환함 */ if (!nabi_server->use_system_keymap) { if (event->keycode >= 10 && event->keycode <= 61) keysym = keymap[event->keycode - 10][index]; } /* XLookupString()을 사용하지 않고 XLookupKeysym()함수를 * 사용한 것은 데스크탑에서 여러 언어 자판을 지원하기위해서 Xkb를 * 사용하는 경우에 쉽게 처리하기 위한 방편이다. * Xkb를 사용하게 되면 keymap이 재정의되므로 XLookupString()의 리턴값은 * 재정의된 키값을 얻게되어 각 언어(예를 들어 프랑스, 러시아 등)의 * 자판에서 일반 qwerty 자판으로 변환을 해줘야 한다. 이 문제를 좀더 * 손쉽게 풀기 위해서 재정의된 자판이 아닌 첫번째 자판의 값을 직접 * 가져오기 위해서 XLookupKeysym()함수를 사용한다. */ if (keysym == NoSymbol) { keysym = XLookupKeysym(event, index); } /* 그러나 이 함수를 사용하게되면 새로 정의된 키를 가져와야 되는 경우에 * 못가져오는 수가 생긴다. 이를 피하기 위해서 XLookupKeysym() 함수가 * 0을 리턴하면 XLookupString()으로 다시한번 시도하는 방식으로 * 처리한다. */ if (keysym == NoSymbol) { char buf[64]; XLookupString(event, buf, sizeof(buf), &keysym, NULL); } } return keysym; } /* vim: set ts=8 sw=4 sts=4 : */ nabi-1.0.0/src/fontset.h0000644000175000017500000000231711655153252011774 00000000000000/* Nabi - X Input Method server for hangul * Copyright (C) 2003-2008 Choe Hwanjin * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #ifndef _FONTSET_H #define _FONTSET_H struct _NabiFontSet { XFontSet xfontset; char *name; int ascent; int descent; int ref; }; typedef struct _NabiFontSet NabiFontSet; NabiFontSet* nabi_fontset_create (Display *display, const char *fontset_name); void nabi_fontset_free (Display *display, XFontSet xfontset); void nabi_fontset_free_all (Display *display); #endif /* _FONTSET_H */ nabi-1.0.0/src/fontset.c0000644000175000017500000001111111655153252011757 00000000000000/* Nabi - X Input Method server for hangul * Copyright (C) 2003-2008 Choe Hwanjin * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include #include "debug.h" #include "gettext.h" #include "fontset.h" static GHashTable *fontset_hash = NULL; static GSList *fontset_list = NULL; static Display *_display = NULL; static NabiFontSet* nabi_fontset_new(const char *name) { XFontSet xfontset; XFontSetExtents* ext; NabiFontSet *fontset; char **missing_list; int missing_list_count; char *error_message; nabi_log(4, "create fontset: %s\n", name); xfontset = XCreateFontSet(_display, name, &missing_list, &missing_list_count, &error_message); if (missing_list_count > 0) { gchar *name2; XFreeStringList(missing_list); name2 = g_strconcat(name, ",*", NULL); xfontset = XCreateFontSet(_display, name2, &missing_list, &missing_list_count, &error_message); g_free(name2); if (missing_list_count > 0) { int i; nabi_log(1, "missing charset\n"); nabi_log(1, "font: %s\n", name); for (i = 0; i < missing_list_count; i++) nabi_log(1, " %s\n", missing_list[i]); XFreeStringList(missing_list); return NULL; } } ext = XExtentsOfFontSet(xfontset); fontset = g_malloc(sizeof(NabiFontSet)); fontset->name = g_strdup(name); fontset->ref = 1; fontset->xfontset = xfontset; fontset->ascent = ABS(ext->max_logical_extent.y); fontset->descent = ext->max_logical_extent.height - fontset->ascent; g_hash_table_insert(fontset_hash, fontset->name, fontset); fontset_list = g_slist_prepend(fontset_list, fontset); return fontset; } static void nabi_fontset_ref(NabiFontSet *fontset) { if (fontset == NULL) return; fontset->ref++; } static void nabi_fontset_unref(NabiFontSet *fontset) { if (fontset == NULL) return; fontset->ref--; if (fontset->ref <= 0) { g_hash_table_remove(fontset_hash, fontset->name); fontset_list = g_slist_remove(fontset_list, fontset); nabi_log(4, "delete fontset: %s\n", fontset->name); XFreeFontSet(_display, fontset->xfontset); g_free(fontset->name); g_free(fontset); } } static NabiFontSet* nabi_fontset_find_by_xfontset(XFontSet xfontset) { NabiFontSet *fontset; GSList *list; list = fontset_list; while (list != NULL) { fontset = (NabiFontSet*)(list->data); if (fontset->xfontset == xfontset) return fontset; list = list->next; } return NULL; } NabiFontSet* nabi_fontset_create(Display *display, const char *fontset_name) { NabiFontSet *nabi_fontset; _display = display; if (fontset_hash == NULL) fontset_hash = g_hash_table_new(g_str_hash, g_str_equal); nabi_fontset = g_hash_table_lookup(fontset_hash, fontset_name); if (nabi_fontset != NULL) { nabi_fontset_ref(nabi_fontset); return nabi_fontset; } nabi_fontset = nabi_fontset_new(fontset_name); return nabi_fontset; } void nabi_fontset_free(Display *display, XFontSet xfontset) { NabiFontSet *nabi_fontset; _display = display; nabi_fontset = nabi_fontset_find_by_xfontset(xfontset); nabi_fontset_unref(nabi_fontset); } void nabi_fontset_free_all(Display *display) { NabiFontSet *fontset; GSList *list; _display = display; if (fontset_list != NULL) { nabi_log(1, "remaining fontsets will be freed," "this must be an error\n"); list = fontset_list; while (list != NULL) { fontset = (NabiFontSet*)(list->data); XFreeFontSet(_display, fontset->xfontset); g_free(fontset->name); g_free(fontset); list = list->next; } } if (fontset_hash != NULL) g_hash_table_destroy(fontset_hash); if (fontset_list != NULL) g_slist_free(fontset_list); } /* vim: set ts=8 sw=4 : */ nabi-1.0.0/src/eggtrayicon.h0000644000175000017500000000473711655153252012635 00000000000000/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* eggtrayicon.h * Copyright (C) 2002 Anders Carlsson * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __EGG_TRAY_ICON_H__ #define __EGG_TRAY_ICON_H__ #include #include G_BEGIN_DECLS #define EGG_TYPE_TRAY_ICON (egg_tray_icon_get_type ()) #define EGG_TRAY_ICON(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EGG_TYPE_TRAY_ICON, EggTrayIcon)) #define EGG_TRAY_ICON_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EGG_TYPE_TRAY_ICON, EggTrayIconClass)) #define EGG_IS_TRAY_ICON(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EGG_TYPE_TRAY_ICON)) #define EGG_IS_TRAY_ICON_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EGG_TYPE_TRAY_ICON)) #define EGG_TRAY_ICON_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EGG_TYPE_TRAY_ICON, EggTrayIconClass)) typedef struct _EggTrayIcon EggTrayIcon; typedef struct _EggTrayIconClass EggTrayIconClass; struct _EggTrayIcon { GtkPlug parent_instance; guint stamp; Atom selection_atom; Atom manager_atom; Atom system_tray_opcode_atom; Atom orientation_atom; Window manager_window; GtkOrientation orientation; }; struct _EggTrayIconClass { GtkPlugClass parent_class; }; GType egg_tray_icon_get_type (void); EggTrayIcon *egg_tray_icon_new_for_screen (GdkScreen *screen, const gchar *name); EggTrayIcon *egg_tray_icon_new (const gchar *name); guint egg_tray_icon_send_message (EggTrayIcon *icon, gint timeout, const char *message, gint len); void egg_tray_icon_cancel_message (EggTrayIcon *icon, guint id); GtkOrientation egg_tray_icon_get_orientation (EggTrayIcon *icon); G_END_DECLS #endif /* __EGG_TRAY_ICON_H__ */ nabi-1.0.0/src/eggtrayicon.c0000644000175000017500000003015211655153252012616 00000000000000/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* eggtrayicon.c * Copyright (C) 2002 Anders Carlsson * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include #include #include #include "eggtrayicon.h" #include #include #ifndef EGG_COMPILATION #ifndef _ #define _(x) dgettext (GETTEXT_PACKAGE, x) #define N_(x) x #endif #else #define _(x) x #define N_(x) x #endif #define SYSTEM_TRAY_REQUEST_DOCK 0 #define SYSTEM_TRAY_BEGIN_MESSAGE 1 #define SYSTEM_TRAY_CANCEL_MESSAGE 2 #define SYSTEM_TRAY_ORIENTATION_HORZ 0 #define SYSTEM_TRAY_ORIENTATION_VERT 1 enum { PROP_0, PROP_ORIENTATION }; static GtkPlugClass *parent_class = NULL; static void egg_tray_icon_init (EggTrayIcon *icon); static void egg_tray_icon_class_init (EggTrayIconClass *klass); static void egg_tray_icon_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); static void egg_tray_icon_realize (GtkWidget *widget); static void egg_tray_icon_unrealize (GtkWidget *widget); static void egg_tray_icon_update_manager_window (EggTrayIcon *icon); GType egg_tray_icon_get_type (void) { static GType our_type = 0; if (our_type == 0) { static const GTypeInfo our_info = { sizeof (EggTrayIconClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) egg_tray_icon_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (EggTrayIcon), 0, /* n_preallocs */ (GInstanceInitFunc) egg_tray_icon_init }; our_type = g_type_register_static (GTK_TYPE_PLUG, "EggTrayIcon", &our_info, 0); } return our_type; } static void egg_tray_icon_init (EggTrayIcon *icon) { icon->stamp = 1; icon->orientation = GTK_ORIENTATION_HORIZONTAL; gtk_widget_add_events (GTK_WIDGET (icon), GDK_PROPERTY_CHANGE_MASK); } static void egg_tray_icon_class_init (EggTrayIconClass *klass) { GObjectClass *gobject_class = (GObjectClass *)klass; GtkWidgetClass *widget_class = (GtkWidgetClass *)klass; parent_class = g_type_class_peek_parent (klass); gobject_class->get_property = egg_tray_icon_get_property; widget_class->realize = egg_tray_icon_realize; widget_class->unrealize = egg_tray_icon_unrealize; g_object_class_install_property (gobject_class, PROP_ORIENTATION, g_param_spec_enum ("orientation", _("Orientation"), _("The orientation of the tray."), GTK_TYPE_ORIENTATION, GTK_ORIENTATION_HORIZONTAL, G_PARAM_READABLE)); } static void egg_tray_icon_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { EggTrayIcon *icon = EGG_TRAY_ICON (object); switch (prop_id) { case PROP_ORIENTATION: g_value_set_enum (value, icon->orientation); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void egg_tray_icon_get_orientation_property (EggTrayIcon *icon) { Display *xdisplay; Atom type; int format; union { gulong *prop; guchar *prop_ch; } prop = { NULL }; gulong nitems; gulong bytes_after; int error, result; g_assert (icon->manager_window != None); xdisplay = GDK_DISPLAY_XDISPLAY (gtk_widget_get_display (GTK_WIDGET (icon))); gdk_error_trap_push (); type = None; result = XGetWindowProperty (xdisplay, icon->manager_window, icon->orientation_atom, 0, G_MAXLONG, FALSE, XA_CARDINAL, &type, &format, &nitems, &bytes_after, &(prop.prop_ch)); error = gdk_error_trap_pop (); if (error || result != Success) return; if (type == XA_CARDINAL) { GtkOrientation orientation; orientation = (prop.prop [0] == SYSTEM_TRAY_ORIENTATION_HORZ) ? GTK_ORIENTATION_HORIZONTAL : GTK_ORIENTATION_VERTICAL; if (icon->orientation != orientation) { icon->orientation = orientation; g_object_notify (G_OBJECT (icon), "orientation"); } } if (prop.prop) XFree (prop.prop); } static GdkFilterReturn egg_tray_icon_manager_filter (GdkXEvent *xevent, GdkEvent *event, gpointer user_data) { EggTrayIcon *icon = user_data; XEvent *xev = (XEvent *)xevent; if (xev->xany.type == ClientMessage && xev->xclient.message_type == icon->manager_atom && xev->xclient.data.l[1] == icon->selection_atom) { egg_tray_icon_update_manager_window (icon); } else if (xev->xany.window == icon->manager_window) { if (xev->xany.type == PropertyNotify && xev->xproperty.atom == icon->orientation_atom) { egg_tray_icon_get_orientation_property (icon); } if (xev->xany.type == DestroyNotify) { egg_tray_icon_update_manager_window (icon); } } return GDK_FILTER_CONTINUE; } static void egg_tray_icon_unrealize (GtkWidget *widget) { EggTrayIcon *icon = EGG_TRAY_ICON (widget); GdkWindow *root_window; if (icon->manager_window != None) { GdkWindow *gdkwin; gdkwin = gdk_window_lookup_for_display (gtk_widget_get_display (widget), icon->manager_window); gdk_window_remove_filter (gdkwin, egg_tray_icon_manager_filter, icon); } root_window = gdk_screen_get_root_window (gtk_widget_get_screen (widget)); gdk_window_remove_filter (root_window, egg_tray_icon_manager_filter, icon); if (GTK_WIDGET_CLASS (parent_class)->unrealize) (* GTK_WIDGET_CLASS (parent_class)->unrealize) (widget); } static void egg_tray_icon_send_manager_message (EggTrayIcon *icon, long message, Window window, long data1, long data2, long data3) { XClientMessageEvent ev; Display *display; ev.type = ClientMessage; ev.window = window; ev.message_type = icon->system_tray_opcode_atom; ev.format = 32; ev.data.l[0] = gdk_x11_get_server_time (GTK_WIDGET (icon)->window); ev.data.l[1] = message; ev.data.l[2] = data1; ev.data.l[3] = data2; ev.data.l[4] = data3; display = GDK_DISPLAY_XDISPLAY (gtk_widget_get_display (GTK_WIDGET (icon))); gdk_error_trap_push (); XSendEvent (display, icon->manager_window, False, NoEventMask, (XEvent *)&ev); XSync (display, False); gdk_error_trap_pop (); } static void egg_tray_icon_send_dock_request (EggTrayIcon *icon) { egg_tray_icon_send_manager_message (icon, SYSTEM_TRAY_REQUEST_DOCK, icon->manager_window, gtk_plug_get_id (GTK_PLUG (icon)), 0, 0); } static void egg_tray_icon_update_manager_window (EggTrayIcon *icon) { Display *xdisplay; /* #300760 참조 */ if (!GTK_IS_WIDGET(icon)) return; xdisplay = GDK_DISPLAY_XDISPLAY (gtk_widget_get_display (GTK_WIDGET (icon))); if (icon->manager_window != None) { GdkWindow *gdkwin; gdkwin = gdk_window_lookup_for_display (gtk_widget_get_display (GTK_WIDGET (icon)), icon->manager_window); gdk_window_remove_filter (gdkwin, egg_tray_icon_manager_filter, icon); } XGrabServer (xdisplay); icon->manager_window = XGetSelectionOwner (xdisplay, icon->selection_atom); if (icon->manager_window != None) XSelectInput (xdisplay, icon->manager_window, StructureNotifyMask|PropertyChangeMask); XUngrabServer (xdisplay); XFlush (xdisplay); if (icon->manager_window != None) { GdkWindow *gdkwin; gdkwin = gdk_window_lookup_for_display (gtk_widget_get_display (GTK_WIDGET (icon)), icon->manager_window); gdk_window_add_filter (gdkwin, egg_tray_icon_manager_filter, icon); /* Send a request that we'd like to dock */ egg_tray_icon_send_dock_request (icon); egg_tray_icon_get_orientation_property (icon); } } static void egg_tray_icon_realize (GtkWidget *widget) { EggTrayIcon *icon = EGG_TRAY_ICON (widget); GdkScreen *screen; GdkDisplay *display; Display *xdisplay; char buffer[256]; GdkWindow *root_window; if (GTK_WIDGET_CLASS (parent_class)->realize) GTK_WIDGET_CLASS (parent_class)->realize (widget); screen = gtk_widget_get_screen (widget); display = gdk_screen_get_display (screen); xdisplay = gdk_x11_display_get_xdisplay (display); /* Now see if there's a manager window around */ g_snprintf (buffer, sizeof (buffer), "_NET_SYSTEM_TRAY_S%d", gdk_screen_get_number (screen)); icon->selection_atom = XInternAtom (xdisplay, buffer, False); icon->manager_atom = XInternAtom (xdisplay, "MANAGER", False); icon->system_tray_opcode_atom = XInternAtom (xdisplay, "_NET_SYSTEM_TRAY_OPCODE", False); icon->orientation_atom = XInternAtom (xdisplay, "_NET_SYSTEM_TRAY_ORIENTATION", False); egg_tray_icon_update_manager_window (icon); root_window = gdk_screen_get_root_window (screen); /* Add a root window filter so that we get changes on MANAGER */ gdk_window_add_filter (root_window, egg_tray_icon_manager_filter, icon); } EggTrayIcon * egg_tray_icon_new_for_xscreen (Screen *xscreen, const char *name) { GdkDisplay *display; GdkScreen *screen; display = gdk_x11_lookup_xdisplay (DisplayOfScreen (xscreen)); screen = gdk_display_get_screen (display, XScreenNumberOfScreen (xscreen)); return egg_tray_icon_new_for_screen (screen, name); } EggTrayIcon * egg_tray_icon_new_for_screen (GdkScreen *screen, const char *name) { g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL); return g_object_new (EGG_TYPE_TRAY_ICON, "screen", screen, "title", name, NULL); } EggTrayIcon* egg_tray_icon_new (const gchar *name) { return g_object_new (EGG_TYPE_TRAY_ICON, "title", name, NULL); } guint egg_tray_icon_send_message (EggTrayIcon *icon, gint timeout, const gchar *message, gint len) { guint stamp; g_return_val_if_fail (EGG_IS_TRAY_ICON (icon), 0); g_return_val_if_fail (timeout >= 0, 0); g_return_val_if_fail (message != NULL, 0); if (icon->manager_window == None) return 0; if (len < 0) len = strlen (message); stamp = icon->stamp++; /* Get ready to send the message */ egg_tray_icon_send_manager_message (icon, SYSTEM_TRAY_BEGIN_MESSAGE, (Window)gtk_plug_get_id (GTK_PLUG (icon)), timeout, len, stamp); /* Now to send the actual message */ gdk_error_trap_push (); while (len > 0) { XClientMessageEvent ev; Display *xdisplay; xdisplay = GDK_DISPLAY_XDISPLAY (gtk_widget_get_display (GTK_WIDGET (icon))); ev.type = ClientMessage; ev.window = (Window)gtk_plug_get_id (GTK_PLUG (icon)); ev.format = 8; ev.message_type = XInternAtom (xdisplay, "_NET_SYSTEM_TRAY_MESSAGE_DATA", False); if (len > 20) { memcpy (&ev.data, message, 20); len -= 20; message += 20; } else { memcpy (&ev.data, message, len); len = 0; } XSendEvent (xdisplay, icon->manager_window, False, StructureNotifyMask, (XEvent *)&ev); XSync (xdisplay, False); } gdk_error_trap_pop (); return stamp; } void egg_tray_icon_cancel_message (EggTrayIcon *icon, guint id) { g_return_if_fail (EGG_IS_TRAY_ICON (icon)); g_return_if_fail (id > 0); egg_tray_icon_send_manager_message (icon, SYSTEM_TRAY_CANCEL_MESSAGE, (Window)gtk_plug_get_id (GTK_PLUG (icon)), id, 0, 0); } GtkOrientation egg_tray_icon_get_orientation (EggTrayIcon *icon) { g_return_val_if_fail (EGG_IS_TRAY_ICON (icon), GTK_ORIENTATION_HORIZONTAL); return icon->orientation; } nabi-1.0.0/src/session.h0000644000175000017500000000167411655153252012002 00000000000000/* Nabi - X Input Method server for hangul * Copyright (C) 2003-2008 Choe Hwanjin * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #ifndef _NABI_SESSION_H #define _NABI_SESSION_H void nabi_session_open(char *previos_id); void nabi_session_close(void); #endif /* _NABI_SESSION_H */ nabi-1.0.0/src/session.c0000644000175000017500000001475311655153252011777 00000000000000/* Nabi - X Input Method server for hangul * Copyright (C) 2003-2008 Choe Hwanjin * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #ifdef HAVE_CONFIG_H #include #endif #ifdef HAVE_LIBSM #include #include #include #include #include #include "debug.h" #include "server.h" #include "session.h" #include "nabi.h" static SmcConn session_connection; static gboolean process_ice_messages(GIOChannel *channel, GIOCondition condition, gpointer client_data) { IceConn ice_conn = (IceConn)client_data; IceProcessMessagesStatus status; status = IceProcessMessages(ice_conn, NULL, NULL); if (status == IceProcessMessagesIOError) { nabi_log(1, "ice message process error\n"); IceSetShutdownNegotiation(ice_conn, False); IceCloseConnection(ice_conn); } return TRUE; } static void ice_watch_proc(IceConn ice_conn, IcePointer client_data, Bool opening, IcePointer *watch_data) { guint input_id; if (opening) { GIOChannel *channel; channel = g_io_channel_unix_new(IceConnectionNumber(ice_conn)); input_id = g_io_add_watch(channel, G_IO_IN | G_IO_HUP | G_IO_ERR | G_IO_PRI, process_ice_messages, ice_conn); g_io_channel_unref(channel); *watch_data = (IcePointer)GUINT_TO_POINTER(input_id); } else { input_id = GPOINTER_TO_UINT((gpointer) *watch_data); g_source_remove(input_id); } } static void save_yourself_proc(SmcConn smc_conn, SmPointer client_data, int save_type, Bool shutdown, int interact_style, Bool fast) { nabi_app_save_config(); SmcSaveYourselfDone(smc_conn, True); } static void die_proc(SmcConn smc_conn, SmPointer client_data) { nabi_app_quit(); } static void save_complete_proc(SmcConn smc_conn, SmPointer client_data) { } static void shutdown_cancelled_proc(SmcConn smc_conn, SmPointer client_data) { SmcSaveYourselfDone(smc_conn, True); } static SmProp * property_new(const char *name, const char *type, ...) { SmProp *prop; SmPropValue *val_list; va_list args; const char *str; int n, i; prop = g_malloc(sizeof(SmProp)); prop->name = g_strdup(name); prop->type = g_strdup(type); va_start(args, type); str = va_arg(args, const char*); for (n = 0; str != NULL; n++, str = va_arg(args, const char*)) continue; va_end(args); prop->num_vals = n; val_list = g_malloc(sizeof(SmPropValue) * n); va_start(args, type); for (i = 0; i < n; i++) { str = va_arg(args, const char*); val_list[i].length = strlen(str); val_list[i].value = g_strdup(str); } va_end(args); prop->vals = val_list; return prop; } static void property_free(SmProp *prop) { int i; g_free(prop->name); g_free(prop->type); for (i = 0; i < prop->num_vals; i++) g_free(prop->vals[i].value); g_free(prop->vals); g_free(prop); } static void setup_properties(const char *client_id) { gchar *process_id; gchar *restart_style_hint; const gchar *program; const gchar *user_id; SmProp *prop_list[6]; if (session_connection == NULL) return; process_id = g_strdup_printf("%d", (int) getpid()); program = g_get_prgname(); user_id = g_get_user_name(); prop_list[0] = property_new(SmCloneCommand, SmLISTofARRAY8, program, NULL); prop_list[1] = property_new(SmProcessID, SmARRAY8, process_id, NULL); prop_list[2] = property_new(SmProgram, SmARRAY8, program, NULL); if (nabi->status_only) prop_list[3] = property_new(SmRestartCommand, SmLISTofARRAY8, program, "--status-only", "--sm-client-id", client_id, NULL); else prop_list[3] = property_new(SmRestartCommand, SmLISTofARRAY8, program, "--sm-client-id", client_id, NULL); prop_list[4] = property_new(SmUserID, SmARRAY8, user_id, NULL); restart_style_hint = g_strdup_printf("%c", (char)SmRestartImmediately); prop_list[5] = property_new(SmRestartStyleHint, SmCARD8, restart_style_hint, NULL); g_free(restart_style_hint); SmcSetProperties(session_connection, 6, prop_list); property_free(prop_list[0]); property_free(prop_list[1]); property_free(prop_list[2]); property_free(prop_list[3]); property_free(prop_list[4]); property_free(prop_list[5]); g_free(process_id); } void nabi_session_open(char *previos_id) { char buf[256]; SmcCallbacks callbacks; char *client_id = NULL; IceAddConnectionWatch(ice_watch_proc, NULL); callbacks.save_yourself.callback = save_yourself_proc; callbacks.save_yourself.client_data = NULL; callbacks.die.callback = die_proc; callbacks.die.client_data = NULL; callbacks.save_complete.callback = save_complete_proc; callbacks.save_complete.client_data = NULL; callbacks.shutdown_cancelled.callback = shutdown_cancelled_proc; callbacks.shutdown_cancelled.client_data = NULL; session_connection = SmcOpenConnection(NULL, NULL, SmProtoMajor, SmProtoMinor, SmcSaveYourselfProcMask | SmcDieProcMask | SmcSaveCompleteProcMask | SmcShutdownCancelledProcMask, &callbacks, previos_id, &client_id, sizeof(buf), buf); if (session_connection == NULL) { nabi_log(1, "session: %s\n", buf); return; } if (client_id == NULL) return; setup_properties(client_id); gdk_set_sm_client_id(client_id); g_free(nabi->session_id); nabi->session_id = client_id; return; } void nabi_session_close(void) { char *prop_names[] = { SmRestartStyleHint, 0 }; if (session_connection == NULL) return; SmcDeleteProperties(session_connection, 1, prop_names); SmcCloseConnection(session_connection, 0, NULL); gdk_set_sm_client_id(NULL); g_free(nabi->session_id); nabi->session_id = NULL; } #else /* HAVE_LIBSM */ void nabi_session_open(char *previos_id) { } void nabi_session_close(void) { } #endif /* HAVE_LIBSM */ nabi-1.0.0/src/candidate.h0000644000175000017500000000472511655153252012233 00000000000000/* Nabi - X Input Method server for hangul * Copyright (C) 2003-2009 Choe Hwanjin * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #ifndef _NABICANDIDATE_H_ #define _NABICANDIDATE_H_ #include #include #include typedef struct _NabiCandidate NabiCandidate; typedef void (*NabiCandidateCommitFunc)(NabiCandidate*, const Hanja*, gpointer); struct _NabiCandidate { GtkWidget *window; Window parent; GtkLabel *label; GtkListStore *store; GtkWidget *treeview; const Hanja **data; NabiCandidateCommitFunc commit; gpointer commit_data; int first; int n; int n_per_page; int current; HanjaList *hanja_list; }; NabiCandidate* nabi_candidate_new(const char *label_str, int n_per_page, HanjaList* list, const Hanja** valid_list, int valid_list_length, Window parent, NabiCandidateCommitFunc commit, gpointer commit_data); void nabi_candidate_prev(NabiCandidate *candidate); void nabi_candidate_next(NabiCandidate *candidate); void nabi_candidate_prev_row(NabiCandidate *candidate); void nabi_candidate_next_row(NabiCandidate *candidate); void nabi_candidate_prev_page(NabiCandidate *candidate); void nabi_candidate_next_page(NabiCandidate *candidate); const Hanja* nabi_candidate_get_current(NabiCandidate *candidate); const Hanja* nabi_candidate_get_nth(NabiCandidate *candidate, int n); void nabi_candidate_delete(NabiCandidate *candidate); void nabi_candidate_set_hanja_list(NabiCandidate *candidate, HanjaList* list, const Hanja** valid_list, int valid_list_length); #endif /* _NABICANDIDATE_H_ */ nabi-1.0.0/src/candidate.c0000644000175000017500000004240712066350444012224 00000000000000/* Nabi - X Input Method server for hangul * Copyright (C) 2003-2009 Choe Hwanjin * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include #include "debug.h" #include "server.h" #include "candidate.h" #include "gettext.h" #include "util.h" #include "nabi.h" enum { COLUMN_INDEX, COLUMN_CHARACTER, COLUMN_COMMENT, NO_OF_COLUMNS }; static void nabi_candidate_on_format(GtkWidget* widget, gpointer data) { if (data != NULL && gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))) { if (strcmp(nabi->config->candidate_format->str, (const char*)data) != 0) { g_string_assign(nabi->config->candidate_format, (const char*)data); nabi_log(4, "candidate_format_changed: %s\n", nabi->config->candidate_format->str); } } } static void nabi_candidate_on_row_activated(GtkWidget *widget, GtkTreePath *path, GtkTreeViewColumn *column, NabiCandidate *candidate) { const Hanja* hanja; if (path != NULL) { int *indices; indices = gtk_tree_path_get_indices(path); candidate->current = candidate->first + indices[0]; } hanja = nabi_candidate_get_current(candidate); if (hanja != NULL && candidate->commit != NULL && candidate->commit_data != NULL) candidate->commit(candidate, hanja, candidate->commit_data); } static void nabi_candidate_on_cursor_changed(GtkWidget *widget, NabiCandidate *candidate) { GtkTreePath *path; gtk_tree_view_get_cursor(GTK_TREE_VIEW(widget), &path, NULL); if (path != NULL) { int *indices; indices = gtk_tree_path_get_indices(path); candidate->current = candidate->first + indices[0]; gtk_tree_path_free(path); } } static void nabi_candidate_on_expose(GtkWidget *widget, GdkEventExpose *event, gpointer data) { GtkStyle *style; GtkAllocation alloc; style = gtk_widget_get_style(widget); alloc = GTK_WIDGET(widget)->allocation; gdk_draw_rectangle(widget->window, style->black_gc, FALSE, 0, 0, alloc.width - 1, alloc.height - 1); } static gboolean nabi_candidate_on_key_press(GtkWidget *widget, GdkEventKey *event, NabiCandidate *candidate) { const Hanja* hanja = NULL; if (candidate == NULL) return FALSE; switch (event->keyval) { case GDK_Up: case GDK_k: nabi_candidate_prev(candidate); break; case GDK_Down: case GDK_j: nabi_candidate_next(candidate); break; case GDK_Left: case GDK_h: case GDK_Page_Up: case GDK_BackSpace: case GDK_KP_Subtract: nabi_candidate_prev_page(candidate); break; case GDK_Right: case GDK_l: case GDK_space: case GDK_Page_Down: case GDK_KP_Add: case GDK_Tab: nabi_candidate_next_page(candidate); break; case GDK_Escape: nabi_candidate_delete(candidate); candidate = NULL; break; case GDK_Return: case GDK_KP_Enter: hanja = nabi_candidate_get_current(candidate); break; case GDK_0: hanja = nabi_candidate_get_nth(candidate, 9); break; case GDK_1: case GDK_2: case GDK_3: case GDK_4: case GDK_5: case GDK_6: case GDK_7: case GDK_8: case GDK_9: hanja = nabi_candidate_get_nth(candidate, event->keyval - GDK_1); break; case GDK_KP_0: hanja = nabi_candidate_get_nth(candidate, 9); break; case GDK_KP_1: case GDK_KP_2: case GDK_KP_3: case GDK_KP_4: case GDK_KP_5: case GDK_KP_6: case GDK_KP_7: case GDK_KP_8: case GDK_KP_9: hanja = nabi_candidate_get_nth(candidate, event->keyval - GDK_KP_1); break; case GDK_KP_End: hanja = nabi_candidate_get_nth(candidate, 0); break; case GDK_KP_Down: hanja = nabi_candidate_get_nth(candidate, 1); break; case GDK_KP_Next: hanja = nabi_candidate_get_nth(candidate, 2); break; case GDK_KP_Left: hanja = nabi_candidate_get_nth(candidate, 3); break; case GDK_KP_Begin: hanja = nabi_candidate_get_nth(candidate, 4); break; case GDK_KP_Right: hanja = nabi_candidate_get_nth(candidate, 5); break; case GDK_KP_Home: hanja = nabi_candidate_get_nth(candidate, 6); break; case GDK_KP_Up: hanja = nabi_candidate_get_nth(candidate, 7); break; case GDK_KP_Prior: hanja = nabi_candidate_get_nth(candidate, 8); break; case GDK_KP_Insert: hanja = nabi_candidate_get_nth(candidate, 9); break; default: return FALSE; } if (hanja != NULL) { if (candidate->commit != NULL) candidate->commit(candidate, hanja, candidate->commit_data); } return TRUE; } static gboolean nabi_candidate_on_scroll(GtkWidget *widget, GdkEventScroll *event, NabiCandidate *candidate) { if (candidate == NULL) return FALSE; switch (event->direction) { case GDK_SCROLL_UP: nabi_candidate_prev_page(candidate); break; case GDK_SCROLL_DOWN: nabi_candidate_next_page(candidate); break; default: return FALSE; } return TRUE; } static void nabi_candidate_update_cursor(NabiCandidate *candidate) { GtkTreePath *path; if (candidate->treeview == NULL) return; path = gtk_tree_path_new_from_indices(candidate->current - candidate->first, -1); gtk_tree_view_set_cursor(GTK_TREE_VIEW(candidate->treeview), path, NULL, FALSE); gtk_tree_path_free(path); } /* keep the whole window on screen */ static void nabi_candidate_set_window_position(NabiCandidate *candidate) { Window root; Window child; int x = 0, y = 0; unsigned int width = 0, height = 0, border = 0, depth = 0; int absx = 0; int absy = 0; int root_w, root_h, cand_w, cand_h; GtkRequisition requisition; if (candidate == NULL || candidate->parent == 0 || candidate->window == NULL) return; /* move candidate window to focus window below */ XGetGeometry(nabi_server->display, candidate->parent, &root, &x, &y, &width, &height, &border, &depth); XTranslateCoordinates(nabi_server->display, candidate->parent, root, 0, 0, &absx, &absy, &child); root_w = gdk_screen_width(); root_h = gdk_screen_height(); gtk_widget_size_request(GTK_WIDGET(candidate->window), &requisition); cand_w = requisition.width; cand_h = requisition.height; absx += width; /* absy += height; */ if (absy + cand_h > root_h) absy = root_h - cand_h; if (absx + cand_w > root_w) absx = root_w - cand_w; gtk_window_move(GTK_WINDOW(candidate->window), absx, absy); } static void nabi_candidate_update_list(NabiCandidate *candidate) { int i; GtkTreeIter iter; gtk_list_store_clear(candidate->store); for (i = 0; i < candidate->n_per_page && candidate->first + i < candidate->n; i++) { const Hanja* hanja = candidate->data[candidate->first + i]; const char* value = hanja_get_value(hanja); const char* comment = hanja_get_comment(hanja); char* candidate_str; if (nabi_server->use_simplified_chinese) { candidate_str = nabi_traditional_to_simplified(value); } else { candidate_str = g_strdup(value); } gtk_list_store_append(candidate->store, &iter); gtk_list_store_set(candidate->store, &iter, COLUMN_INDEX, (i + 1) % 10, COLUMN_CHARACTER, candidate_str, COLUMN_COMMENT, comment, -1); g_free(candidate_str); } nabi_candidate_set_window_position(candidate); } static void nabi_candidate_on_treeview_realize(GtkWidget* widget, gpointer data) { gtk_widget_modify_fg (widget, GTK_STATE_ACTIVE, &widget->style->fg[GTK_STATE_SELECTED]); gtk_widget_modify_bg (widget, GTK_STATE_ACTIVE, &widget->style->bg[GTK_STATE_SELECTED]); gtk_widget_modify_text(widget, GTK_STATE_ACTIVE, &widget->style->text[GTK_STATE_SELECTED]); gtk_widget_modify_base(widget, GTK_STATE_ACTIVE, &widget->style->base[GTK_STATE_SELECTED]); } static void nabi_candidate_create_window(NabiCandidate *candidate) { GtkWidget *frame; GtkWidget *vbox; GtkWidget *hbox; GtkWidget *label; GtkWidget *button; GtkWidget *treeview; GtkTreeViewColumn *column; GtkCellRenderer *renderer; candidate->window = gtk_window_new(GTK_WINDOW_POPUP); nabi_candidate_update_list(candidate); frame = gtk_frame_new(NULL); gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_OUT); gtk_container_add(GTK_CONTAINER(candidate->window), frame); vbox = gtk_vbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER(frame), vbox); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, TRUE, 0); label = GTK_WIDGET(candidate->label); gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 6); button = gtk_radio_button_new_with_label(NULL, _("hanja")); gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, TRUE, 6); if (strcmp(nabi->config->candidate_format->str, "hanja") == 0) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE); g_signal_connect(G_OBJECT(button), "toggled", G_CALLBACK(nabi_candidate_on_format), "hanja"); button = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(button), _("hanja(hangul)")); gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, TRUE, 6); if (strcmp(nabi->config->candidate_format->str, "hanja(hangul)") == 0) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE); g_signal_connect(G_OBJECT(button), "toggled", G_CALLBACK(nabi_candidate_on_format), "hanja(hangul)"); button = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(button), _("hangul(hanja)")); gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, TRUE, 6); if (strcmp(nabi->config->candidate_format->str, "hangul(hanja)") == 0) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE); g_signal_connect(G_OBJECT(button), "toggled", G_CALLBACK(nabi_candidate_on_format), "hangul(hanja)"); treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(candidate->store)); gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treeview), FALSE); gtk_box_pack_start(GTK_BOX(vbox), treeview, TRUE, TRUE, 0); candidate->treeview = treeview; g_object_unref(candidate->store); /* number column */ renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new_with_attributes("No", renderer, "text", COLUMN_INDEX, NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); /* character column */ renderer = gtk_cell_renderer_text_new(); if (nabi_server->candidate_font != NULL) g_object_set(renderer, "font-desc", nabi_server->candidate_font, NULL); column = gtk_tree_view_column_new_with_attributes("Character", renderer, "text", COLUMN_CHARACTER, NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); /* comment column */ renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new_with_attributes("Comment", renderer, "text", COLUMN_COMMENT, NULL); if (gtk_major_version > 2 || (gtk_major_version == 2 && gtk_minor_version >= 8)) { gint wrap_width = 250; g_object_set(G_OBJECT(renderer), "wrap-mode", PANGO_WRAP_WORD_CHAR, "wrap-width", wrap_width, NULL); } gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); nabi_candidate_update_cursor(candidate); g_signal_connect(G_OBJECT(treeview), "row-activated", G_CALLBACK(nabi_candidate_on_row_activated), candidate); g_signal_connect(G_OBJECT(treeview), "cursor-changed", G_CALLBACK(nabi_candidate_on_cursor_changed), candidate); // candidate window는 포커스가 없는 윈도우이므로 treeview에는 // focus가 없는 상태가 되어서 select가 되지 않는다. // 그런데 테마에 따라서 active 색상이 normal 색상과 같은 것들이 있다. // 그런 경우에는 active 상태인 row가 normal과 같이 그려지므로 // 구분이 되지 않는다. 즉 선택된 candidate가 구분이 안되는 경우가 // 있다는 것이다. // 그런 경우를 피하기 위해서 realize된 후(style이 attach된 후) // style을 modify해서 active인 것이 select 된 것과 동일하게 그려지도록 // 처리한다. g_signal_connect_after(G_OBJECT(treeview), "realize", G_CALLBACK(nabi_candidate_on_treeview_realize), NULL); g_signal_connect(G_OBJECT(candidate->window), "key-press-event", G_CALLBACK(nabi_candidate_on_key_press), candidate); g_signal_connect(G_OBJECT(candidate->window), "scroll-event", G_CALLBACK(nabi_candidate_on_scroll), candidate); g_signal_connect_after(G_OBJECT(candidate->window), "expose-event", G_CALLBACK(nabi_candidate_on_expose), candidate); g_signal_connect_swapped(G_OBJECT(candidate->window), "realize", G_CALLBACK(nabi_candidate_set_window_position), candidate); gtk_widget_show_all(candidate->window); gtk_grab_add(candidate->window); } NabiCandidate* nabi_candidate_new(const char *label_str, int n_per_page, HanjaList *list, const Hanja **valid_list, int valid_list_length, Window parent, NabiCandidateCommitFunc commit, gpointer commit_data) { NabiCandidate *candidate; candidate = (NabiCandidate*)g_malloc(sizeof(NabiCandidate)); candidate->first = 0; candidate->current = 0; candidate->n_per_page = n_per_page; candidate->n = 0; candidate->data = NULL; candidate->parent = parent; candidate->label = GTK_LABEL(gtk_label_new(label_str)); candidate->store = NULL; candidate->treeview = NULL; candidate->commit = commit; candidate->commit_data = commit_data; candidate->hanja_list = list; candidate->data = valid_list; candidate->n = valid_list_length; candidate->store = gtk_list_store_new(NO_OF_COLUMNS, G_TYPE_INT, G_TYPE_STRING, G_TYPE_STRING); if (n_per_page == 0) candidate->n_per_page = candidate->n; nabi_candidate_create_window(candidate); nabi_candidate_update_cursor(candidate); return candidate; } void nabi_candidate_prev(NabiCandidate *candidate) { if (candidate == NULL) return; if (candidate->current > 0) candidate->current--; if (candidate->current < candidate->first) { candidate->first -= candidate->n_per_page; nabi_candidate_update_list(candidate); } nabi_candidate_update_cursor(candidate); } void nabi_candidate_next(NabiCandidate *candidate) { if (candidate == NULL) return; if (candidate->current < candidate->n - 1) candidate->current++; if (candidate->current >= candidate->first + candidate->n_per_page) { candidate->first += candidate->n_per_page; nabi_candidate_update_list(candidate); } nabi_candidate_update_cursor(candidate); } void nabi_candidate_prev_page(NabiCandidate *candidate) { if (candidate == NULL) return; if (candidate->first - candidate->n_per_page >= 0) { candidate->current -= candidate->n_per_page; if (candidate->current < 0) candidate->current = 0; candidate->first -= candidate->n_per_page; nabi_candidate_update_list(candidate); } nabi_candidate_update_cursor(candidate); } void nabi_candidate_next_page(NabiCandidate *candidate) { if (candidate == NULL) return; if (candidate->first + candidate->n_per_page < candidate->n) { candidate->current += candidate->n_per_page; if (candidate->current > candidate->n - 1) candidate->current = candidate->n - 1; candidate->first += candidate->n_per_page; nabi_candidate_update_list(candidate); } nabi_candidate_update_cursor(candidate); } const Hanja* nabi_candidate_get_current(NabiCandidate *candidate) { if (candidate == NULL) return 0; return candidate->data[candidate->current]; } const Hanja* nabi_candidate_get_nth(NabiCandidate *candidate, int n) { if (candidate == NULL) return 0; n += candidate->first; if (n < 0 && n >= candidate->n) return 0; candidate->current = n; return candidate->data[n]; } void nabi_candidate_delete(NabiCandidate *candidate) { if (candidate == NULL) return; hanja_list_delete(candidate->hanja_list); gtk_grab_remove(candidate->window); gtk_widget_destroy(candidate->window); g_free(candidate->data); g_free(candidate); } void nabi_candidate_set_hanja_list(NabiCandidate *candidate, HanjaList* list, const Hanja** valid_list, int valid_list_length) { const char* label; if (candidate == NULL) return; if (list == NULL) return; hanja_list_delete(candidate->hanja_list); g_free(candidate->data); candidate->hanja_list = list; candidate->data = valid_list; candidate->n = valid_list_length; candidate->current = 0; label = hanja_list_get_key(list); gtk_label_set_label(candidate->label, label); nabi_candidate_update_list(candidate); nabi_candidate_update_cursor(candidate); } nabi-1.0.0/src/keycapturedialog.h0000644000175000017500000000221111655153252013637 00000000000000/* Nabi - X Input Method server for hangul * Copyright (C) 2003-2008 Choe Hwanjin * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #ifndef __KEYCAPTUREDIALOG_H_ #define __KEYCAPTUREDIALOG_H_ #include GtkWidget* key_capture_dialog_new(const gchar *title, GtkWindow *parent, const gchar *key_text, const gchar *message_format, ...); G_CONST_RETURN gchar * key_capture_dialog_get_key_text(GtkWidget *dialog); #endif /* __KEYCAPTUREDIALOG_H_ */ nabi-1.0.0/src/keycapturedialog.c0000644000175000017500000001101011655153252013627 00000000000000/* Nabi - X Input Method server for hangul * Copyright (C) 2003-2008 Choe Hwanjin * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #ifdef HAVE_CONFIG_H #include #endif #include "keycapturedialog.h" static char key_label_text[256] = { '\0', }; static gboolean on_key_press(GtkWidget *widget, GdkEventKey *event, gpointer data) { gchar *keys; GString *str; GtkWidget *label; gchar markup_str[256]; gtk_dialog_set_response_sensitive(GTK_DIALOG(widget), GTK_RESPONSE_OK, TRUE); label = g_object_get_data(G_OBJECT(widget), "key-text-label"); str = g_string_new(""); if (event->state & GDK_CONTROL_MASK) { g_string_append(str, "Control+"); } if (event->state & GDK_SHIFT_MASK) { g_string_append(str, "Shift+"); } if (event->state & GDK_MOD1_MASK) { g_string_append(str, "Alt+"); } if (event->state & GDK_MOD4_MASK) { g_string_append(str, "Super+"); } keys = gdk_keyval_name(event->keyval); if (keys == NULL) keys = ""; str = g_string_append(str, keys); g_strlcpy(key_label_text, str->str, sizeof(key_label_text)); g_snprintf(markup_str, sizeof(markup_str), "%s", str->str); gtk_label_set_markup(GTK_LABEL(label), markup_str); gtk_window_present(GTK_WINDOW(widget)); return TRUE; } GtkWidget* key_capture_dialog_new(const gchar *title, GtkWindow *parent, const gchar *key_text, const gchar *message_format, ...) { GtkWidget *dialog; GtkWidget *image; GtkWidget *message_label; GtkWidget *key_label; GtkWidget *hbox; GtkWidget *vbox; gchar markup_str[256]; dialog = gtk_dialog_new_with_buttons(title, parent, GTK_DIALOG_MODAL | GTK_DIALOG_NO_SEPARATOR, GTK_STOCK_OK, GTK_RESPONSE_OK, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, NULL); gtk_window_set_resizable (GTK_WINDOW(dialog), FALSE); gtk_container_set_border_width(GTK_CONTAINER(dialog), 6); vbox = gtk_vbox_new(FALSE, 0); message_label = gtk_label_new (NULL); gtk_label_set_line_wrap (GTK_LABEL(message_label), TRUE); gtk_box_pack_start(GTK_BOX(vbox), message_label, FALSE, FALSE, 0); g_object_set_data(G_OBJECT(dialog), "message-label", message_label); if (message_format != NULL) { gchar *msg; va_list args; va_start(args, message_format); msg = g_strdup_vprintf(message_format, args); va_end(args); gtk_label_set_markup(GTK_LABEL(message_label), msg); g_free(msg); } key_label = gtk_label_new(""); gtk_label_set_line_wrap (GTK_LABEL(key_label), FALSE); gtk_label_set_use_markup(GTK_LABEL(key_label), TRUE); g_snprintf(markup_str, sizeof(markup_str), "%s", key_text); g_strlcpy(key_label_text, key_text, sizeof(key_label_text)); gtk_label_set_markup(GTK_LABEL(key_label), markup_str); gtk_widget_show(key_label); g_object_set_data(G_OBJECT(dialog), "key-text-label", key_label); image = gtk_image_new_from_stock(GTK_STOCK_DIALOG_INFO, GTK_ICON_SIZE_DIALOG); gtk_misc_set_alignment (GTK_MISC(image), 0.5, 0.0); hbox = gtk_hbox_new (FALSE, 6); gtk_box_pack_start(GTK_BOX(hbox), image, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 6); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), hbox, FALSE, FALSE, 6); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), key_label, FALSE, FALSE, 0); gtk_dialog_set_response_sensitive(GTK_DIALOG(dialog), GTK_RESPONSE_OK, FALSE); gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_CANCEL); gtk_widget_show_all (hbox); g_signal_connect(G_OBJECT(dialog), "key-press-event", G_CALLBACK(on_key_press), dialog); return dialog; } G_CONST_RETURN gchar * key_capture_dialog_get_key_text(GtkWidget *dialog) { return key_label_text; } nabi-1.0.0/src/conf.h0000644000175000017500000000427011655153252011237 00000000000000/* Nabi - X Input Method server for hangul * Copyright (C) 2007-2009 Choe Hwanjin * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #ifndef nabi_conf_h #define nabi_conf_h #include typedef struct _NabiConfig NabiConfig; struct _NabiConfig { gint x; gint y; GString* theme; gint palette_height; gboolean show_palette; gboolean use_tray_icon; GString* trigger_keys; GString* off_keys; GString* candidate_keys; /* keyboard option */ GString* hangul_keyboard; GString* latin_keyboard; GString* keyboard_layouts_file; /* xim server option */ GString* xim_name; GString* output_mode; GString* default_input_mode; GString* input_mode_scope; gboolean use_dynamic_event_flow; gboolean commit_by_word; gboolean auto_reorder; gboolean use_simplified_chinese; gboolean hanja_mode; gboolean ignore_app_fontset; gboolean use_system_keymap; /* candidate options */ GString* candidate_font; GString* candidate_format; /* preedit attribute */ GString* preedit_font; GString* preedit_fg; GString* preedit_bg; }; NabiConfig* nabi_config_new(); void nabi_config_delete(NabiConfig* config); void nabi_config_load(NabiConfig* config); void nabi_config_save(NabiConfig* config); #endif /* nabi_config_h */ nabi-1.0.0/src/conf.c0000644000175000017500000002367411655153252011243 00000000000000/* Nabi - X Input Method server for hangul * Copyright (C) 2007-2009 Choe Hwanjin * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include #include #include "debug.h" #include "gettext.h" #include "conf.h" enum { CONFIG_BOOL, CONFIG_INT, CONFIG_STR }; struct config_item { gchar* key; gint type; guint offset; }; #define OFFSET(member) offsetof(NabiConfig, member) const static struct config_item config_items[] = { { "xim_name", CONFIG_STR, OFFSET(xim_name) }, { "x", CONFIG_INT, OFFSET(x) }, { "y", CONFIG_INT, OFFSET(y) }, { "show_palette", CONFIG_BOOL, OFFSET(show_palette) }, { "palette_height", CONFIG_INT, OFFSET(palette_height) }, { "use_tray_icon", CONFIG_BOOL, OFFSET(use_tray_icon) }, { "theme", CONFIG_STR, OFFSET(theme) }, { "hangul_keyboard", CONFIG_STR, OFFSET(hangul_keyboard) }, { "latin_keyboard", CONFIG_STR, OFFSET(latin_keyboard) }, { "keyboard_layouts", CONFIG_STR, OFFSET(keyboard_layouts_file) }, { "triggerkeys", CONFIG_STR, OFFSET(trigger_keys) }, { "offkeys", CONFIG_STR, OFFSET(off_keys) }, { "candidatekeys", CONFIG_STR, OFFSET(candidate_keys) }, { "output_mode", CONFIG_STR, OFFSET(output_mode) }, { "default_input_mode", CONFIG_STR, OFFSET(default_input_mode) }, { "input_mode_scope", CONFIG_STR, OFFSET(input_mode_scope) }, { "preedit_font", CONFIG_STR, OFFSET(preedit_font) }, { "preedit_foreground", CONFIG_STR, OFFSET(preedit_fg) }, { "preedit_background", CONFIG_STR, OFFSET(preedit_bg) }, { "candidate_font", CONFIG_STR, OFFSET(candidate_font) }, { "candidate_format", CONFIG_STR, OFFSET(candidate_format) }, { "dynamic_event_flow", CONFIG_BOOL, OFFSET(use_dynamic_event_flow) }, { "commit_by_word", CONFIG_BOOL, OFFSET(commit_by_word) }, { "auto_reorder", CONFIG_BOOL, OFFSET(auto_reorder) }, { "use_simplified_chinese", CONFIG_BOOL, OFFSET(use_simplified_chinese) }, { "hanja_mode", CONFIG_BOOL, OFFSET(hanja_mode) }, { "ignore_app_fontset", CONFIG_BOOL, OFFSET(ignore_app_fontset) }, { "use_system_keymap", CONFIG_BOOL, OFFSET(use_system_keymap) }, { NULL, 0, 0 } }; static inline gboolean* nabi_config_get_bool(NabiConfig* config, size_t offset) { return (gboolean*)((char*)(config) + offset); } static inline int* nabi_config_get_int(NabiConfig* config, size_t offset) { return (int*)((char*)(config) + offset); } static inline GString** nabi_config_get_str(NabiConfig* config, size_t offset) { return (GString**)((char*)(config) + offset); } static void nabi_config_set_bool(NabiConfig* config, guint offset, gchar* value) { if (value != NULL) { gboolean *member = nabi_config_get_bool(config, offset); if (g_ascii_strcasecmp(value, "true") == 0) { *member = TRUE; } else { *member = FALSE; } } } static void nabi_config_set_int(NabiConfig* config, guint offset, gchar* value) { if (value != NULL) { int *member = nabi_config_get_int(config, offset); *member = strtol(value, NULL, 10); } } static void nabi_config_set_str(NabiConfig* config, guint offset, gchar* value) { GString **member = nabi_config_get_str(config, offset); if (value == NULL) g_string_assign(*member, ""); else g_string_assign(*member, value); } static void nabi_config_write_bool(NabiConfig* config, FILE* file, gchar* key, guint offset) { gboolean *member = nabi_config_get_bool(config, offset); if (*member) fprintf(file, "%s=%s\n", key, "true"); else fprintf(file, "%s=%s\n", key, "false"); } static void nabi_config_write_int(NabiConfig* config, FILE* file, gchar* key, guint offset) { int *member = nabi_config_get_int(config, offset); fprintf(file, "%s=%d\n", key, *member); } static void nabi_config_write_str(NabiConfig* config, FILE* file, gchar* key, guint offset) { GString **member = nabi_config_get_str(config, offset); if (*member != NULL) fprintf(file, "%s=%s\n", key, (*member)->str); } static void nabi_config_load_item(NabiConfig* config, gchar* key, gchar* value) { gint i; for (i = 0; config_items[i].key != NULL; i++) { if (strcmp(key, config_items[i].key) == 0) { switch (config_items[i].type) { case CONFIG_BOOL: nabi_config_set_bool(config, config_items[i].offset, value); break; case CONFIG_INT: nabi_config_set_int(config, config_items[i].offset, value); break; case CONFIG_STR: nabi_config_set_str(config, config_items[i].offset, value); break; default: break; } } } } NabiConfig* nabi_config_new() { NabiConfig* config = g_new(NabiConfig, 1); /* set default values */ config->x = 0; config->y = 0; config->show_palette = FALSE; config->palette_height = 24; config->use_tray_icon = TRUE; config->xim_name = g_string_new(PACKAGE); config->theme = g_string_new(DEFAULT_THEME); config->hangul_keyboard = g_string_new(DEFAULT_KEYBOARD); config->latin_keyboard = g_string_new("none"); config->keyboard_layouts_file = g_string_new("keyboard_layouts"); config->trigger_keys = g_string_new("Hangul,Shift+space"); config->off_keys = g_string_new("Escape"); config->candidate_keys = g_string_new("Hangul_Hanja,F9"); config->candidate_font = g_string_new("Sans 14"); config->candidate_format = g_string_new("hanja"); config->output_mode = g_string_new("syllable"); config->default_input_mode = g_string_new("direct"); config->input_mode_scope = g_string_new("per_toplevel"); config->preedit_font = g_string_new("Sans 9"); config->preedit_fg = g_string_new("#000000"); config->preedit_bg = g_string_new("#FFFFFF"); config->use_dynamic_event_flow = TRUE; config->commit_by_word = FALSE; config->auto_reorder = TRUE; config->hanja_mode = FALSE; config->use_simplified_chinese = FALSE; config->ignore_app_fontset = FALSE; config->use_system_keymap = FALSE; return config; } void nabi_config_delete(NabiConfig* config) { g_string_free(config->xim_name, TRUE); g_string_free(config->theme, TRUE); g_string_free(config->hangul_keyboard, TRUE); g_string_free(config->latin_keyboard, TRUE); g_string_free(config->keyboard_layouts_file, TRUE); g_string_free(config->trigger_keys, TRUE); g_string_free(config->off_keys, TRUE); g_string_free(config->candidate_keys, TRUE); g_string_free(config->output_mode, TRUE); g_string_free(config->default_input_mode, TRUE); g_string_free(config->input_mode_scope, TRUE); g_string_free(config->preedit_font, TRUE); g_string_free(config->preedit_fg, TRUE); g_string_free(config->preedit_bg, TRUE); g_string_free(config->candidate_font, TRUE); g_string_free(config->candidate_format, TRUE); g_free(config); } void nabi_config_load(NabiConfig* config) { gchar *line, *saved_position; gchar *key, *value; const gchar* homedir; gchar* config_filename; gchar buf[256]; FILE *file; /* load conf file */ homedir = g_get_home_dir(); config_filename = g_build_filename(homedir, ".nabi", "config", NULL); file = fopen(config_filename, "r"); if (file == NULL) { nabi_log(1, "Can't open config file: %s\n", config_filename); return; } for (line = fgets(buf, sizeof(buf), file); line != NULL; line = fgets(buf, sizeof(buf), file)) { key = strtok_r(line, " =\t\n", &saved_position); value = strtok_r(NULL, "\r\n", &saved_position); if (key == NULL) continue; nabi_config_load_item(config, key, value); } fclose(file); g_free(config_filename); } void nabi_config_save(NabiConfig* config) { gint i; const gchar* homedir; gchar* config_dir; gchar* config_filename; FILE *file; homedir = g_get_home_dir(); config_dir = g_build_filename(homedir, ".nabi", NULL); /* chech for nabi conf dir */ if (!g_file_test(config_dir, G_FILE_TEST_EXISTS)) { int ret; /* we make conf dir */ ret = mkdir(config_dir, S_IRUSR | S_IWUSR | S_IXUSR); if (ret != 0) { perror("nabi"); } } config_filename = g_build_filename(config_dir, "config", NULL); file = fopen(config_filename, "w"); if (file == NULL) { nabi_log(1, "Can't write config file: %s\n", config_filename); return; } for (i = 0; config_items[i].key != NULL; i++) { switch (config_items[i].type) { case CONFIG_BOOL: nabi_config_write_bool(config, file, config_items[i].key, config_items[i].offset); break; case CONFIG_INT: nabi_config_write_int(config, file, config_items[i].key, config_items[i].offset); break; case CONFIG_STR: nabi_config_write_str(config, file, config_items[i].key, config_items[i].offset); break; default: break; } } fclose(file); g_free(config_dir); g_free(config_filename); } nabi-1.0.0/src/handler.c0000644000175000017500000002224411655153252011723 00000000000000/* Nabi - X Input Method server for hangul * Copyright (C) 2003-2008 Choe Hwanjin * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include #include #include #include "../IMdkit/IMdkit.h" #include "../IMdkit/Xi18n.h" #include "ic.h" #include "server.h" #include "candidate.h" #include "debug.h" #include "xim_protocol.h" static const char* get_xim_protocol_name(int code) { if (code > 0 && code < G_N_ELEMENTS(xim_protocol_name)) return xim_protocol_name[code]; return "XIM_UNKNOWN"; } static Bool nabi_handler_open(XIMS ims, IMOpenStruct *data) { nabi_server_create_connection(nabi_server, data->connect_id, data->lang.name); nabi_log(1, "open connection: id = %d, lang = %s\n", (int)data->connect_id, data->lang.name); return True; } static Bool nabi_handler_close(XIMS ims, IMCloseStruct *data) { nabi_server_destroy_connection(nabi_server, data->connect_id); nabi_log(1, "close connection: id = %d\n", (int)data->connect_id); return True; } static Bool nabi_handler_create_ic(XIMS ims, IMChangeICStruct *data) { NabiConnection* conn; conn = nabi_server_get_connection(nabi_server, data->connect_id); if (conn != NULL) { NabiIC *ic = nabi_connection_create_ic(conn, data); data->icid = nabi_ic_get_id(ic); nabi_log(1, "create ic: id = %d-%d, style = 0x%x\n", (int)data->connect_id, (int)data->icid, ic->input_style); } return True; } static Bool nabi_handler_destroy_ic(XIMS ims, IMChangeICStruct *data) { NabiConnection* conn; conn = nabi_server_get_connection(nabi_server, data->connect_id); if (conn != NULL) { NabiIC *ic = nabi_connection_get_ic(conn, data->icid); if (ic != NULL) { nabi_log(1, "destroy ic: id = %d-%d\n", (int)data->connect_id, (int)data->icid); nabi_connection_destroy_ic(conn, ic); } } return True; } static Bool nabi_handler_set_ic_values(XIMS ims, IMChangeICStruct *data) { NabiIC *ic = nabi_server_get_ic(nabi_server, data->connect_id, data->icid); nabi_log(1, "set values: id = %d-%d\n", (int)data->connect_id, (int)data->icid); if (ic != NULL) nabi_ic_set_values(ic, data); return True; } static Bool nabi_handler_get_ic_values(XIMS ims, IMChangeICStruct *data) { NabiIC *ic = nabi_server_get_ic(nabi_server, data->connect_id, data->icid); nabi_log(1, "get values: id = %d-%d\n", (int)data->connect_id, (int)data->icid); if (ic != NULL) nabi_ic_get_values(ic, data); return True; } static Bool nabi_handler_forward_event(XIMS ims, IMForwardEventStruct *data) { NabiIC* ic; KeySym keysym; XKeyEvent *kevent; if (data->event.type != KeyPress) { nabi_log(4, "process event: id = %d-%d, key release\n", (int)data->connect_id, (int)data->icid); IMForwardEvent(ims, (XPointer)data); return True; } ic = nabi_server_get_ic(nabi_server, data->connect_id, data->icid); if (ic == NULL) return True; kevent = (XKeyEvent*)&data->event; keysym = nabi_ic_lookup_keysym(ic, kevent); nabi_log(3, "process event: id = %d-%d, keysym = 0x%x('%c')\n", (int)data->connect_id, (int)data->icid, keysym, (keysym < 0x80) ? keysym : ' '); if (ic->mode == NABI_INPUT_MODE_DIRECT) { /* direct mode */ if (ic->preedit.start) { nabi_ic_preedit_done(ic); nabi_ic_status_done(ic); } if (nabi_server_is_trigger_key(nabi_server, keysym, kevent->state)) { /* change input mode to compose mode */ nabi_ic_set_mode(ic, NABI_INPUT_MODE_COMPOSE); return True; } IMForwardEvent(ims, (XPointer)data); } else { if (nabi_server_is_trigger_key(nabi_server, keysym, kevent->state)) { /* change input mode to direct mode */ nabi_ic_set_mode(ic, NABI_INPUT_MODE_DIRECT); return True; } /* compose mode */ if (!ic->preedit.start) { nabi_ic_status_start(ic); } if (!nabi_ic_process_keyevent(ic, keysym, kevent->state)) IMForwardEvent(ims, (XPointer)data); } return True; } static Bool nabi_handler_set_ic_focus(XIMS ims, IMChangeFocusStruct *data) { NabiIC* ic = nabi_server_get_ic(nabi_server, data->connect_id, data->icid); nabi_log(1, "set focus: id = %d-%d\n", (int)data->connect_id, (int)data->icid); if (ic == NULL) return True; nabi_ic_set_focus(ic); return True; } static Bool nabi_handler_unset_ic_focus(XIMS ims, IMChangeFocusStruct *data) { NabiIC* ic = nabi_server_get_ic(nabi_server, data->connect_id, data->icid); nabi_log(1, "unset focus: id = %d-%d\n", (int)data->connect_id, (int)data->icid); if (ic == NULL) return True; nabi_server_set_mode_info(nabi_server, NABI_MODE_INFO_NONE); if (ic->candidate) { nabi_candidate_delete(ic->candidate); ic->candidate = NULL; } return True; } static Bool nabi_handler_reset_ic(XIMS ims, IMResetICStruct *data) { NabiIC* ic = nabi_server_get_ic(nabi_server, data->connect_id, data->icid); nabi_log(1, "reset: id = %d-%d\n", (int)data->connect_id, (int)data->icid); if (ic == NULL) return True; nabi_ic_reset(ic, data); return True; } static Bool nabi_handler_trigger_notify(XIMS ims, IMTriggerNotifyStruct *data) { NabiIC* ic = nabi_server_get_ic(nabi_server, data->connect_id, data->icid); nabi_log(1, "trigger notify: id = %d-%d\n", (int)data->connect_id, (int)data->icid); if (ic == NULL) return True; if (data->flag == 0) nabi_ic_set_mode(ic, NABI_INPUT_MODE_COMPOSE); return True; } static Bool nabi_handler_preedit_start_reply(XIMS ims, IMPreeditCBStruct *data) { NabiIC* ic = nabi_server_get_ic(nabi_server, data->connect_id, data->icid); nabi_log(1, "preedit start reply: id = %d-%d\n", (int)data->connect_id, (int)data->icid); if (ic != NULL) return True; return False; } static Bool nabi_handler_preedit_caret_reply(XIMS ims, IMPreeditCBStruct *data) { NabiIC* ic = nabi_server_get_ic(nabi_server, data->connect_id, data->icid); nabi_log(1, "preedit caret replay: id = %d-%d\n", (int)data->connect_id, (int)data->icid); if (ic != NULL) return True; return False; } static Bool nabi_handler_str_conversion_reply(XIMS ims, IMStrConvCBStruct *data) { XIMStringConversionText *text; NabiIC* ic = nabi_server_get_ic(nabi_server, data->connect_id, data->icid); nabi_log(1, "string conversion reply: id = %d-%d\n", (int)data->connect_id, (int)data->icid); if (ic == NULL) return True; text = data->strconv.text; if (text != NULL && text->length > 0 && text->string.mbs != NULL) { char* utf8 = NULL; if (text->encoding_is_wchar) { char* mbs = g_new0(char, text->length * 6); wcstombs(mbs, text->string.wcs, text->length * 6); utf8 = g_locale_to_utf8(mbs, -1, NULL, NULL, NULL); g_free(mbs); } else { utf8 = g_locale_to_utf8(text->string.mbs, -1, NULL, NULL, NULL); } if (utf8 != NULL) { nabi_log(2, "string conversion: retrieved string: %s\n", utf8); nabi_ic_process_string_conversion_reply(ic, utf8); g_free(utf8); } } return True; } Bool nabi_handler(XIMS ims, IMProtocol *data) { switch (data->major_code) { case XIM_OPEN: return nabi_handler_open(ims, &data->imopen); case XIM_CLOSE: return nabi_handler_close(ims, &data->imclose); case XIM_CREATE_IC: return nabi_handler_create_ic(ims, &data->changeic); case XIM_DESTROY_IC: return nabi_handler_destroy_ic(ims, &data->changeic); case XIM_SET_IC_VALUES: return nabi_handler_set_ic_values(ims, &data->changeic); case XIM_GET_IC_VALUES: return nabi_handler_get_ic_values(ims, &data->changeic); case XIM_FORWARD_EVENT: return nabi_handler_forward_event(ims, &data->forwardevent); case XIM_SET_IC_FOCUS: return nabi_handler_set_ic_focus(ims, &data->changefocus); case XIM_UNSET_IC_FOCUS: return nabi_handler_unset_ic_focus(ims, &data->changefocus); case XIM_RESET_IC: return nabi_handler_reset_ic(ims, &data->resetic); case XIM_TRIGGER_NOTIFY: return nabi_handler_trigger_notify(ims, &data->triggernotify); case XIM_PREEDIT_START_REPLY: return nabi_handler_preedit_start_reply(ims, &data->preedit_callback); case XIM_PREEDIT_CARET_REPLY: return nabi_handler_preedit_caret_reply(ims, &data->preedit_callback); case XIM_STR_CONVERSION_REPLY: return nabi_handler_str_conversion_reply(ims, &data->strconv_callback); default: nabi_log(1, "Unhandled XIM Protocol: %s\n", get_xim_protocol_name(data->major_code)); break; } return True; } /* vim: set ts=8 sw=4 sts=4 : */ nabi-1.0.0/src/ui.c0000644000175000017500000013551011767102121010715 00000000000000/* Nabi - X Input Method server for hangul * Copyright (C) 2003-2010 Choe Hwanjin * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #if GTK_CHECK_VERSION(2, 16, 0) #define HAVE_GTK_STATUS_ICON 1 #endif #if !HAVE_GTK_STATUS_ICON #include "eggtrayicon.h" #endif #include "debug.h" #include "gettext.h" #include "nabi.h" #include "ic.h" #include "server.h" #include "conf.h" #include "handlebox.h" #include "preference.h" #include "default-icons.h" enum { THEMES_LIST_PATH = 0, THEMES_LIST_NONE, THEMES_LIST_HANGUL, THEMES_LIST_ENGLISH, THEMES_LIST_NAME, N_COLS }; typedef struct _NabiStateIcon { GtkWidget* widget; GtkWidget* none; GtkWidget* english; GtkWidget* hangul; } NabiStateIcon; typedef struct _NabiPalette { GtkWidget* widget; NabiStateIcon* state; GtkToggleButton* hanja_mode_button; guint source_id; } NabiPalette; #if HAVE_GTK_STATUS_ICON typedef struct _NabiTrayIcon { GtkStatusIcon* icon; } NabiTrayIcon; #else typedef struct _NabiTrayIcon { EggTrayIcon* widget; NabiStateIcon* state; GtkTooltips* tooltips; } NabiTrayIcon; #endif static GtkWidget *about_dialog = NULL; static GtkWidget *preference_dialog = NULL; static GtkWidget *hide_palette_menuitem = NULL; static void nabi_app_load_base_icons(); static void nabi_state_icon_load(NabiStateIcon* state, int w, int h); static void nabi_palette_update_state(NabiPalette* palette, int state); static void nabi_palette_show(NabiPalette* palette); static void nabi_palette_hide(NabiPalette* palette); static void nabi_palette_destroy(NabiPalette* palette); static void nabi_palette_update_hanja_mode(NabiPalette* palette, gboolean state); static gboolean nabi_tray_icon_create(gpointer data); #if !HAVE_GTK_STATUS_ICON static void nabi_tray_load_icons(NabiTrayIcon* tray, gint default_size); #endif static void nabi_tray_icon_update_tooltips(); static void nabi_tray_icon_destroy(NabiTrayIcon* tray); static void remove_event_filter(); static GtkWidget* create_tray_icon_menu(void); static GdkPixbuf *none_pixbuf = NULL; static GdkPixbuf *hangul_pixbuf = NULL; static GdkPixbuf *english_pixbuf = NULL; static NabiPalette* nabi_palette = NULL; static NabiTrayIcon* nabi_tray = NULL; static void load_colors(void) { gboolean ret; GdkColor color; GdkColormap *colormap; colormap = gdk_colormap_get_system(); /* preedit foreground */ gdk_color_parse(nabi->config->preedit_fg->str, &color); ret = gdk_colormap_alloc_color(colormap, &color, FALSE, TRUE); if (ret) nabi_server->preedit_fg = color; else { color.pixel = 1; color.red = 0xffff; color.green = 0xffff; color.blue = 0xffff; ret = gdk_colormap_alloc_color(colormap, &color, FALSE, TRUE); nabi_server->preedit_fg = color; } /* preedit background */ gdk_color_parse(nabi->config->preedit_bg->str, &color); ret = gdk_colormap_alloc_color(colormap, &color, FALSE, TRUE); if (ret) nabi_server->preedit_bg = color; else { color.pixel = 0; color.red = 0; color.green = 0; color.blue = 0; ret = gdk_colormap_alloc_color(colormap, &color, FALSE, TRUE); nabi_server->preedit_fg = color; } } static void set_up_keyboard(void) { /* keyboard layout */ if (g_path_is_absolute(nabi->config->keyboard_layouts_file->str)) { nabi_server_load_keyboard_layout(nabi_server, nabi->config->keyboard_layouts_file->str); } else { char* filename = g_build_filename(NABI_DATA_DIR, nabi->config->keyboard_layouts_file->str, NULL); nabi_server_load_keyboard_layout(nabi_server, filename); g_free(filename); } nabi_server_set_keyboard_layout(nabi_server, nabi->config->latin_keyboard->str); /* set keyboard */ nabi_server_set_hangul_keyboard(nabi_server, nabi->config->hangul_keyboard->str); } void nabi_app_new(void) { nabi = g_new(NabiApplication, 1); nabi->xim_name = NULL; nabi->palette = NULL; nabi->status_only = FALSE; nabi->session_id = NULL; nabi->icon_size = 0; nabi->root_window = NULL; nabi->mode_info_atom = 0; nabi->mode_info_type = 0; nabi->mode_info_xatom = 0; nabi->config = NULL; } void nabi_app_init(int *argc, char ***argv) { gchar *icon_filename; GdkPixbuf *default_icon = NULL; /* set XMODIFIERS env var to none before creating any widget * If this is not set, xim server will try to connect herself. * So It would be blocked */ putenv("XMODIFIERS=\"@im=none\""); putenv("GTK_IM_MODULE=gtk-im-context-simple"); /* process command line options */ if (argc != NULL && argv != NULL) { int i, j, k; for (i = 1; i < *argc;) { if (strcmp("-s", (*argv)[i]) == 0 || strcmp("--status-only", (*argv)[i]) == 0) { nabi->status_only = TRUE; (*argv)[i] = NULL; } else if (strcmp("--sm-client-id", (*argv)[i]) == 0 || strncmp("--sm-client-id=", (*argv)[i], 15) == 0) { gchar *session_id = (*argv)[i] + 14; if (*session_id == '=') { session_id++; } else { (*argv)[i] = NULL; i++; session_id = (*argv)[i]; } (*argv)[i] = NULL; nabi->session_id = g_strdup(session_id); } else if (strcmp("--xim-name", (*argv)[i]) == 0 || strncmp("--xim-name=", (*argv)[i], 11) == 0) { gchar *xim_name = (*argv)[i] + 10; if (*xim_name == '=') { xim_name++; } else { (*argv)[i] = NULL; i++; xim_name = (*argv)[i]; } (*argv)[i] = NULL; nabi->xim_name = g_strdup(xim_name); } else if (strcmp("-d", (*argv)[i]) == 0) { gchar* log_level = "0"; (*argv)[i] = NULL; i++; log_level = (*argv)[i]; nabi_log_set_level(strtol(log_level, NULL, 10)); } i++; } /* if we accept any command line options, compress rest of argc, argv */ for (i = 1; i < *argc; i++) { for (k = i; k < *argc; k++) if ((*argv)[k] == NULL) break; if (k > i) { k -= i; for (j = i + k; j < *argc; j++) (*argv)[j - k] = (*argv)[j]; *argc -= k; } } } nabi->config = nabi_config_new(); nabi_config_load(nabi->config); /* set atoms for hangul status */ nabi->mode_info_atom = gdk_atom_intern("_HANGUL_INPUT_MODE", TRUE); nabi->mode_info_type = gdk_atom_intern("INTEGER", TRUE); nabi->mode_info_xatom = gdk_x11_atom_to_xatom(nabi->mode_info_atom); /* default icon */ nabi->icon_size = 24; icon_filename = g_build_filename(NABI_DATA_DIR, "nabi.svg", NULL); default_icon = gdk_pixbuf_new_from_file(icon_filename, NULL); if (default_icon == NULL) { g_free(icon_filename); icon_filename = g_build_filename(NABI_DATA_DIR, "nabi.png", NULL); default_icon = gdk_pixbuf_new_from_file(icon_filename, NULL); } g_free(icon_filename); if (default_icon != NULL) { gtk_window_set_default_icon(default_icon); g_object_unref(default_icon); } /* status icons */ nabi_app_load_base_icons(); } static void set_up_output_mode(void) { NabiOutputMode mode; mode = NABI_OUTPUT_SYLLABLE; if (nabi->config->output_mode != NULL) { if (g_ascii_strcasecmp(nabi->config->output_mode->str, "jamo") == 0) { mode = NABI_OUTPUT_JAMO; } else if (g_ascii_strcasecmp(nabi->config->output_mode->str, "manual") == 0) { mode = NABI_OUTPUT_MANUAL; } } nabi_server_set_output_mode(nabi_server, mode); } void nabi_app_setup_server(void) { const char *locale; char **keys; const char* option; if (nabi->status_only) return; locale = setlocale(LC_CTYPE, NULL); if (locale == NULL || !nabi_server_is_locale_supported(nabi_server, locale)) { GtkWidget *message; const gchar *encoding = ""; g_get_charset(&encoding); message = gtk_message_dialog_new(NULL, GTK_DIALOG_MODAL, GTK_MESSAGE_WARNING, GTK_BUTTONS_CLOSE, "" "한글 입력기 나비에서 알림\n\n" "현재 로캘이 나비에서 지원하는 것이 아닙니다. " "이렇게 되어 있으면 한글 입력에 문제가 있을수 있습니다. " "설정을 확인해보십시오.\n\n" "현재 로캘 설정: %s (%s)", locale, encoding); gtk_label_set_use_markup(GTK_LABEL(GTK_MESSAGE_DIALOG(message)->label), TRUE); gtk_widget_show(message); gtk_dialog_run(GTK_DIALOG(message)); gtk_widget_destroy(message); } set_up_keyboard(); load_colors(); set_up_output_mode(); keys = g_strsplit(nabi->config->trigger_keys->str, ",", 0); nabi_server_set_trigger_keys(nabi_server, keys); g_strfreev(keys); keys = g_strsplit(nabi->config->candidate_keys->str, ",", 0); nabi_server_set_candidate_keys(nabi_server, keys); g_strfreev(keys); nabi_server_set_candidate_font(nabi_server, nabi->config->candidate_font->str); nabi_server_set_dynamic_event_flow(nabi_server, nabi->config->use_dynamic_event_flow); nabi_server_set_commit_by_word(nabi_server, nabi->config->commit_by_word); nabi_server_set_auto_reorder(nabi_server, nabi->config->auto_reorder); nabi_server_set_simplified_chinese(nabi_server, nabi->config->use_simplified_chinese); option = nabi->config->default_input_mode->str; if (strcmp(option, "compose") == 0) { nabi_server_set_default_input_mode(nabi_server, NABI_INPUT_MODE_COMPOSE); } else { nabi_server_set_default_input_mode(nabi_server, NABI_INPUT_MODE_DIRECT); } option = nabi->config->input_mode_scope->str; if (strcmp(option, "per_desktop") == 0) { nabi_server_set_input_mode_scope(nabi_server, NABI_INPUT_MODE_PER_DESKTOP); } else if (strcmp(option, "per_application") == 0) { nabi_server_set_input_mode_scope(nabi_server, NABI_INPUT_MODE_PER_APPLICATION); } else if (strcmp(option, "per_ic") == 0) { nabi_server_set_input_mode_scope(nabi_server, NABI_INPUT_MODE_PER_IC); } else { nabi_server_set_input_mode_scope(nabi_server, NABI_INPUT_MODE_PER_TOPLEVEL); } nabi_server_set_preedit_font(nabi_server, nabi->config->preedit_font->str); nabi_server_set_ignore_app_fontset(nabi_server, nabi->config->ignore_app_fontset); nabi_server_set_use_system_keymap(nabi_server, nabi->config->use_system_keymap); } void nabi_app_quit(void) { if (about_dialog != NULL) { gtk_dialog_response(GTK_DIALOG(about_dialog), GTK_RESPONSE_CANCEL); } if (preference_dialog != NULL) { gtk_dialog_response(GTK_DIALOG(preference_dialog), GTK_RESPONSE_CANCEL); } nabi_palette_destroy(nabi_palette); nabi_palette = NULL; } void nabi_app_free(void) { if (nabi == NULL) return; nabi_app_save_config(); nabi_config_delete(nabi->config); nabi->config = NULL; if (nabi_palette != NULL) { nabi_palette_destroy(nabi_palette); nabi_palette = NULL; } g_free(nabi->xim_name); g_free(nabi); nabi = NULL; } static NabiStateIcon* nabi_state_icon_new(int w, int h) { NabiStateIcon* state; state = g_new(NabiStateIcon, 1); state->widget = gtk_notebook_new(); gtk_notebook_set_show_tabs(GTK_NOTEBOOK(state->widget), FALSE); gtk_notebook_set_show_border(GTK_NOTEBOOK(state->widget), FALSE); state->none = gtk_image_new(); state->english = gtk_image_new(); state->hangul = gtk_image_new(); gtk_notebook_append_page(GTK_NOTEBOOK(state->widget), state->none, NULL); gtk_notebook_append_page(GTK_NOTEBOOK(state->widget), state->english, NULL); gtk_notebook_append_page(GTK_NOTEBOOK(state->widget), state->hangul, NULL); gtk_notebook_set_current_page(GTK_NOTEBOOK(state->widget), 0); gtk_widget_show_all(state->widget); nabi_state_icon_load(state, w, h); return state; } static void nabi_state_icon_load_scaled(GtkWidget* image, const GdkPixbuf* pixbuf, int w, int h) { int orig_width; int orig_height; int new_width; int new_height; double factor; GdkPixbuf* scaled; orig_width = gdk_pixbuf_get_width(pixbuf); orig_height = gdk_pixbuf_get_height(pixbuf); if (w < 0 && h < 0) { factor = 1.0; new_width = orig_width; new_height = orig_height; } else if (w < 0 && h > 0) { factor = (double)h / (double)orig_height; new_width = orig_width * factor + 0.5; // 반올림 new_height = h; } else if (w > 0 && h < 0) { factor = (double)w / (double)orig_width; new_width = w; new_height = orig_height * factor + 0.5; // 반올림 } else { factor = MIN((double)w / (double)orig_width, (double)h / (double)orig_height); new_width = w; new_height = h; } scaled = gdk_pixbuf_scale_simple(pixbuf, new_width, new_height, GDK_INTERP_TILES); gtk_image_set_from_pixbuf(GTK_IMAGE(image), scaled); g_object_unref(G_OBJECT(scaled)); nabi_log(3, "icon resize: %dx%d -> %dx%d\n", orig_width, orig_height, new_width, new_height); } static void nabi_state_icon_load(NabiStateIcon* state, int w, int h) { if (state == NULL) return; nabi_state_icon_load_scaled(state->none, none_pixbuf, w, h); nabi_state_icon_load_scaled(state->hangul, hangul_pixbuf, w, h); nabi_state_icon_load_scaled(state->english, english_pixbuf, w, h); } static void nabi_state_icon_update(NabiStateIcon* state, int flag) { if (state == NULL) return; gtk_notebook_set_current_page(GTK_NOTEBOOK(state->widget), flag); } static void nabi_state_icon_destroy(NabiStateIcon* state) { g_free(state); } static void on_tray_icon_embedded(GtkWidget *widget, gpointer data) { nabi_log(1, "tray icon is embedded\n"); if (!nabi->config->show_palette) { nabi_palette_hide(nabi_palette); } gtk_widget_set_sensitive(hide_palette_menuitem, TRUE); } #if HAVE_GTK_STATUS_ICON static void on_status_icon_embedded(GObject* gobject, GParamSpec* paramspec, gpointer data) { on_tray_icon_embedded(NULL, data); } #endif static void on_tray_icon_destroyed(GtkWidget *widget, gpointer data) { #if !HAVE_GTK_STATUS_ICON nabi_state_icon_destroy(nabi_tray->state); #endif g_free(nabi_tray); nabi_tray = NULL; nabi_log(1, "tray icon is destroyed\n"); if (nabi->config->use_tray_icon) nabi_palette->source_id = g_idle_add(nabi_tray_icon_create, NULL); nabi_palette_show(nabi_palette); gtk_widget_set_sensitive(hide_palette_menuitem, FALSE); } static void on_palette_destroyed(GtkWidget *widget, gpointer data) { gtk_main_quit(); if (nabi_tray != NULL) { nabi_tray_icon_destroy(nabi_tray); } remove_event_filter(); nabi_log(1, "palette destroyed\n"); } static void nabi_menu_position_func(GtkMenu *menu, gint *x, gint *y, gboolean *push_in, gpointer data) { GtkWidget *widget; GdkWindow *window; GdkScreen *screen; gint width, height, menu_width, menu_height; gint screen_width, screen_height; widget = GTK_WIDGET(data); window = GDK_WINDOW(widget->window); screen = gdk_drawable_get_screen(GDK_DRAWABLE(window)); screen_width = gdk_screen_get_width(screen); screen_height = gdk_screen_get_height(screen); gdk_window_get_origin(window, x, y); gdk_drawable_get_size(window, &width, &height); if (!GTK_WIDGET_REALIZED(menu)) gtk_widget_realize(GTK_WIDGET(menu)); gdk_drawable_get_size(GDK_WINDOW(GTK_WIDGET(menu)->window), &menu_width, &menu_height); if (*y + height < screen_height / 2) *y += widget->allocation.height; else *y -= menu_height; *x += widget->allocation.x; *y += widget->allocation.y; if (*x + menu_width > screen_width) *x = screen_width - menu_width; } #if HAVE_GTK_STATUS_ICON static void on_tray_icon_popup_menu(GtkStatusIcon *status_icon, guint button, guint activate_time, gpointer data) { static GtkWidget *menu = NULL; if (preference_dialog != NULL) { gtk_window_present(GTK_WINDOW(preference_dialog)); return; } if (menu != NULL) gtk_widget_destroy(menu); menu = create_tray_icon_menu(); gtk_menu_popup(GTK_MENU(menu), NULL, NULL, gtk_status_icon_position_menu, status_icon, button, activate_time); } #else static gboolean on_tray_icon_button_press(GtkWidget *widget, GdkEventButton *event, gpointer data) { static GtkWidget *menu = NULL; if (event->type == GDK_BUTTON_PRESS) { if (preference_dialog != NULL) { gtk_window_present(GTK_WINDOW(preference_dialog)); return TRUE; } if (menu != NULL) gtk_widget_destroy(menu); menu = create_tray_icon_menu(); gtk_menu_popup(GTK_MENU(menu), NULL, NULL, nabi_menu_position_func, widget, event->button, event->time); return TRUE; } return FALSE; } #endif #if !HAVE_GTK_STATUS_ICON static void on_tray_icon_size_allocate (GtkWidget *widget, GtkAllocation *allocation, gpointer data) { NabiTrayIcon* tray; GtkOrientation orientation; int size; tray = (NabiTrayIcon*)data; if (tray == NULL) return; orientation = egg_tray_icon_get_orientation (tray->widget); if (orientation == GTK_ORIENTATION_HORIZONTAL) size = allocation->height; else size = allocation->width; /* We set minimum icon size */ if (size <= 18) { size = 16; } else if (size <= 24) { size = 24; } if (size != nabi->icon_size) { nabi->icon_size = size; nabi_tray_load_icons(nabi_tray, size); } } #endif /* !HAVE_GTK_STATUS_ICON */ static void get_statistic_string(GString *str) { if (nabi_server == NULL) { g_string_assign(str, _("XIM Server is not running")); } else { int i; int sum; g_string_append_printf(str, "%s: %3d\n" "%s: %3d\n" "%s: %3d\n" "%s: %3d\n" "\n", _("Total"), nabi_server->statistics.total, _("Space"), nabi_server->statistics.space, _("BackSpace"), nabi_server->statistics.backspace, _("Shift"), nabi_server->statistics.shift); /* choseong */ g_string_append(str, _("Choseong")); g_string_append_c(str, '\n'); for (i = 0x00; i <= 0x12; i++) { char label[8] = { '\0', }; int len = g_unichar_to_utf8(0x1100 + i, label); label[len] = '\0'; g_string_append_printf(str, "%s: %-3d ", label, nabi_server->statistics.jamo[i]); if ((i + 1) % 10 == 0) g_string_append_c(str, '\n'); } g_string_append(str, "\n\n"); /* jungseong */ g_string_append(str, _("Jungseong")); g_string_append_c(str, '\n'); for (i = 0x61; i <= 0x75; i++) { char label[8] = { '\0', }; int len = g_unichar_to_utf8(0x1100 + i, label); label[len] = '\0'; g_string_append_printf(str, "%s: %-3d ", label, nabi_server->statistics.jamo[i]); if ((i - 0x60) % 10 == 0) g_string_append_c(str, '\n'); } g_string_append(str, "\n\n"); /* print only when a user have pressed any jonseong keys */ sum = 0; for (i = 0xa8; i <= 0xc2; i++) { sum += nabi_server->statistics.jamo[i]; } if (sum > 0) { /* jongseong */ g_string_append(str, _("Jongseong")); g_string_append_c(str, '\n'); for (i = 0xa8; i <= 0xc2; i++) { char label[8] = { '\0', }; int len = g_unichar_to_utf8(0x1100 + i, label); label[len] = '\0'; g_string_append_printf(str, "%s: %-3d ", label, nabi_server->statistics.jamo[i]); if ((i - 0xa7) % 10 == 0) g_string_append_c(str, '\n'); } g_string_append(str, "\n"); } } } static void on_about_statistics_clicked(GtkWidget *widget, gpointer parent) { GString *str; GtkWidget *hbox; GtkWidget *stat_label = NULL; GtkWidget *dialog = NULL; dialog = gtk_dialog_new_with_buttons(_("Nabi keypress statistics"), GTK_WINDOW(parent), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, NULL); hbox = gtk_hbox_new(FALSE, 10); gtk_container_set_border_width(GTK_CONTAINER(hbox), 6); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), hbox, TRUE, TRUE, 0); str = g_string_new(NULL); get_statistic_string(str); stat_label = gtk_label_new(str->str); gtk_label_set_selectable(GTK_LABEL(stat_label), TRUE); gtk_box_pack_start(GTK_BOX(hbox), stat_label, TRUE, TRUE, 6); gtk_widget_show_all(dialog); gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy(dialog); g_string_free(str, TRUE); } static const char* get_project_url() { if (gtk_major_version > 2 || (gtk_major_version == 2 && gtk_minor_version >= 18)) { return "" PACKAGE_BUGREPORT ""; } else { return PACKAGE_BUGREPORT; } } static void on_menu_about(GtkWidget *widget) { GtkWidget *dialog = NULL; GtkWidget *vbox; GtkWidget *comment; GtkWidget *server_info; GtkWidget *image; GtkWidget *label; GList *list; gchar *image_filename; gchar *comment_str; gchar buf[256]; const char *encoding = ""; const char *project_url; if (about_dialog != NULL) { gtk_window_present(GTK_WINDOW(about_dialog)); return; } dialog = gtk_dialog_new_with_buttons(_("About Nabi"), NULL, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, NULL); about_dialog = dialog; vbox = GTK_DIALOG(dialog)->vbox; image_filename = g_build_filename(NABI_DATA_DIR, "nabi-about.png", NULL); image = gtk_image_new_from_file(image_filename); gtk_misc_set_padding(GTK_MISC(image), 0, 6); gtk_box_pack_start(GTK_BOX(vbox), image, FALSE, TRUE, 0); gtk_widget_show(image); g_free(image_filename); project_url = get_project_url(); comment = gtk_label_new(NULL); comment_str = g_strdup_printf( _("An Easy Hangul XIM\n" "version %s\n\n" "Copyright (C) 2003-2011 Choe Hwanjin\n" "%s"), VERSION, project_url); gtk_label_set_markup(GTK_LABEL(comment), comment_str); gtk_label_set_justify(GTK_LABEL(comment), GTK_JUSTIFY_CENTER); gtk_box_pack_start(GTK_BOX(vbox), comment, FALSE, TRUE, 0); gtk_widget_show(comment); g_free(comment_str); if (nabi_server != NULL) { GtkWidget *hbox; GtkWidget *button; server_info = gtk_table_new(4, 2, TRUE); label = gtk_label_new(""); gtk_label_set_markup(GTK_LABEL(label), _("XIM name: ")); gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5); gtk_table_attach_defaults(GTK_TABLE(server_info), label, 0, 1, 0, 1); label = gtk_label_new(""); gtk_label_set_markup(GTK_LABEL(label), _("Locale: ")); gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5); gtk_table_attach_defaults(GTK_TABLE(server_info), label, 0, 1, 1, 2); label = gtk_label_new(""); gtk_label_set_markup(GTK_LABEL(label), _("Encoding: ")); gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5); gtk_table_attach_defaults(GTK_TABLE(server_info), label, 0, 1, 2, 3); label = gtk_label_new(""); gtk_label_set_markup(GTK_LABEL(label), _("Connected: ")); gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5); gtk_table_attach_defaults(GTK_TABLE(server_info), label, 0, 1, 3, 4); label = gtk_label_new(nabi_server->name); gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); gtk_table_attach_defaults(GTK_TABLE(server_info), label, 1, 2, 0, 1); label = gtk_label_new(setlocale(LC_CTYPE, NULL)); gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); gtk_table_attach_defaults(GTK_TABLE(server_info), label, 1, 2, 1, 2); g_get_charset(&encoding); label = gtk_label_new(encoding); gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); gtk_table_attach_defaults(GTK_TABLE(server_info), label, 1, 2, 2, 3); snprintf(buf, sizeof(buf), "%d", g_slist_length(nabi_server->connections)); label = gtk_label_new(buf); gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); gtk_table_attach_defaults(GTK_TABLE(server_info), label, 1, 2, 3, 4); gtk_box_pack_start(GTK_BOX(vbox), server_info, FALSE, TRUE, 5); gtk_widget_show_all(server_info); hbox = gtk_hbox_new(TRUE, 10); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), hbox, FALSE, TRUE, 0); gtk_widget_show(hbox); button = gtk_button_new_with_label(_("Keypress Statistics")); gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE); gtk_widget_show(button); gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 5); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(on_about_statistics_clicked), dialog); } gtk_window_set_default_size(GTK_WINDOW(dialog), 300, 200); gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_CENTER); gtk_widget_show(dialog); list = gtk_container_get_children(GTK_CONTAINER(GTK_DIALOG(dialog)->action_area)); if (list != NULL) { GList *child = g_list_last(list); if (child != NULL && child->data != NULL) gtk_widget_grab_focus(GTK_WIDGET(child->data)); g_list_free(list); } gtk_dialog_run(GTK_DIALOG(about_dialog)); gtk_widget_destroy(about_dialog); about_dialog = NULL; } static void on_menu_preference(GtkWidget *widget) { if (preference_dialog != NULL) { gtk_window_present(GTK_WINDOW(preference_dialog)); return; } preference_dialog = preference_window_create(); gtk_dialog_run(GTK_DIALOG(preference_dialog)); gtk_widget_destroy(preference_dialog); preference_dialog = NULL; } static void on_menu_show_palette(GtkWidget *widget, gpointer data) { gboolean state; state = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget)); nabi_app_show_palette(state); } static void on_menu_hanja_mode(GtkWidget *widget, gpointer data) { gboolean state; state = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget)); nabi_app_set_hanja_mode(state); nabi_palette_update_hanja_mode(nabi_palette, state); } static void on_menu_hide_palette(GtkWidget *widget, gpointer data) { // tray icon을 사용하지 않는 상태에서는 palette를 hide하면 모든 ui가 // 화면에서 사라져 nabi를 컨트롤할 수 없게 된다. // 그래서 tray icon을 사용하는 경우가 아니면 아래 함수가 작동하지 // 않도록 한다. // 또한 tray icon 사용 설정과 관계없이 tray에 embed 되지 않은 상황 // 이라면 palette가 hide되면 안된다. if (nabi->config->use_tray_icon && nabi_tray != NULL) { nabi_app_show_palette(FALSE); } } static void on_menu_keyboard(GtkWidget *widget, gpointer data) { const char* id = (const char*)data; nabi_app_set_hangul_keyboard(id); nabi_app_save_config(); } static void on_menu_quit(GtkWidget *widget) { nabi_app_quit(); } static GtkWidget* create_tray_icon_menu(void) { GtkWidget* menu; GtkWidget* menuitem; GSList *radio_group = NULL; menu = gtk_menu_new(); /* about menu */ menuitem = gtk_image_menu_item_new_from_stock(GTK_STOCK_DIALOG_INFO, NULL); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); g_signal_connect_swapped(G_OBJECT(menuitem), "activate", G_CALLBACK(on_menu_about), menuitem); /* separator */ menuitem = gtk_separator_menu_item_new(); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); /* preferences menu */ menuitem = gtk_image_menu_item_new_from_stock(GTK_STOCK_PREFERENCES, NULL); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); g_signal_connect_swapped(G_OBJECT(menuitem), "activate", G_CALLBACK(on_menu_preference), menuitem); /* palette menu */ menuitem = gtk_check_menu_item_new_with_mnemonic(_("_Show palette")); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem), nabi->config->show_palette); g_signal_connect_swapped(G_OBJECT(menuitem), "toggled", G_CALLBACK(on_menu_show_palette), menuitem); /* hanja mode */ menuitem = gtk_check_menu_item_new_with_mnemonic(_("_Hanja Lock")); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem), nabi->config->hanja_mode); g_signal_connect_swapped(G_OBJECT(menuitem), "toggled", G_CALLBACK(on_menu_hanja_mode), menuitem); /* separator */ menuitem = gtk_separator_menu_item_new(); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); /* keyboard list */ if (nabi_server != NULL) { int i = 0; const NabiHangulKeyboard* keyboards; keyboards = nabi_server_get_hangul_keyboard_list(nabi_server); while (keyboards[i].id != NULL) { const char* id = keyboards[i].id; const char* name = keyboards[i].name; menuitem = gtk_radio_menu_item_new_with_label(radio_group, _(name)); radio_group = gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(menuitem)); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); g_signal_connect(G_OBJECT(menuitem), "activate", G_CALLBACK(on_menu_keyboard), (gpointer)id); if (strcmp(id, nabi->config->hangul_keyboard->str) == 0) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem), TRUE); i++; } /* separator */ menuitem = gtk_separator_menu_item_new(); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); } /* menu quit */ menuitem = gtk_image_menu_item_new_from_stock(GTK_STOCK_QUIT, NULL); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); g_signal_connect_swapped(G_OBJECT(menuitem), "activate", G_CALLBACK(on_menu_quit), menuitem); gtk_widget_show_all(menu); return menu; } #if !HAVE_GTK_STATUS_ICON static void nabi_tray_load_icons(NabiTrayIcon* tray, gint default_size) { int w, h; GtkOrientation orientation; orientation = egg_tray_icon_get_orientation(tray->widget); if (orientation == GTK_ORIENTATION_VERTICAL) { w = default_size; h = -1; } else { w = -1; h = default_size; } nabi_state_icon_load(tray->state, w, h); } #endif static void nabi_tray_update_state(NabiTrayIcon* tray, int state) { #if HAVE_GTK_STATUS_ICON if (tray != NULL) { switch (state) { case 1: gtk_status_icon_set_from_pixbuf(nabi_tray->icon, english_pixbuf); break; case 2: gtk_status_icon_set_from_pixbuf(nabi_tray->icon, hangul_pixbuf); break; default: gtk_status_icon_set_from_pixbuf(nabi_tray->icon, none_pixbuf); break; } } #else if (tray != NULL) nabi_state_icon_update(tray->state, state); #endif } static GdkFilterReturn root_window_event_filter (GdkXEvent *gxevent, GdkEvent *event, gpointer data) { XEvent *xevent; XPropertyEvent *pevent; xevent = (XEvent*)gxevent; switch (xevent->type) { case PropertyNotify: pevent = (XPropertyEvent*)xevent; if (pevent->atom == nabi->mode_info_xatom) { int state; guchar *buf; gboolean ret; ret = gdk_property_get (nabi->root_window, nabi->mode_info_atom, nabi->mode_info_type, 0, 32, 0, NULL, NULL, NULL, &buf); if (ret) { memcpy(&state, buf, sizeof(state)); nabi_tray_update_state(nabi_tray, state); nabi_palette_update_state(nabi_palette, state); g_free(buf); } else { nabi_log(4, "Fail on getting property: gdk_property_get\n"); } } break; default: break; } return GDK_FILTER_CONTINUE; } static void install_event_filter(GtkWidget *widget) { GdkScreen *screen; GdkEventMask mask; screen = gdk_drawable_get_screen(GDK_DRAWABLE(widget->window)); nabi->root_window = gdk_screen_get_root_window(screen); mask = gdk_window_get_events(nabi->root_window); gdk_window_set_events(nabi->root_window, mask | GDK_PROPERTY_CHANGE_MASK); gdk_window_add_filter(nabi->root_window, root_window_event_filter, NULL); } static void remove_event_filter() { gdk_window_remove_filter(nabi->root_window, root_window_event_filter, NULL); } static void on_palette_realized(GtkWidget *widget, gpointer data) { install_event_filter(widget); } static GdkPixbuf* load_icon(const char* theme, const char* name, const char** default_xpm, gboolean* error_on_load) { char* path; char* filename; GError *error = NULL; GdkPixbuf *pixbuf; filename = g_strconcat(name, ".svg", NULL); path = g_build_filename(NABI_THEMES_DIR, theme, filename, NULL); pixbuf = gdk_pixbuf_new_from_file(path, &error); if (pixbuf != NULL) goto done; g_free(filename); g_free(path); if (error != NULL) { g_error_free(error); error = NULL; } filename = g_strconcat(name, ".png", NULL); path = g_build_filename(NABI_THEMES_DIR, theme, filename, NULL); pixbuf = gdk_pixbuf_new_from_file(path, &error); if (pixbuf == NULL) { if (error != NULL) { nabi_log(1, "Error on reading image file: %s\n", error->message); g_error_free(error); error = NULL; } pixbuf = gdk_pixbuf_new_from_xpm_data(default_xpm); *error_on_load = TRUE; } done: g_free(filename); g_free(path); if (error != NULL) g_error_free(error); return pixbuf; } static void nabi_app_load_base_icons() { gboolean error = FALSE; const char* theme = nabi->config->theme->str; if (none_pixbuf != NULL) g_object_unref(G_OBJECT(none_pixbuf)); none_pixbuf = load_icon(theme, "none", none_default_xpm, &error); if (english_pixbuf != NULL) g_object_unref(G_OBJECT(english_pixbuf)); english_pixbuf = load_icon(theme, "english", english_default_xpm, &error); if (hangul_pixbuf != NULL) g_object_unref(G_OBJECT(hangul_pixbuf)); hangul_pixbuf = load_icon(theme, "hangul", hangul_default_xpm, &error); if (error) { GtkWidget *message; message = gtk_message_dialog_new(NULL, GTK_DIALOG_MODAL, GTK_MESSAGE_WARNING, GTK_BUTTONS_CLOSE, _("" "Can't load tray icons\n\n" "There are some errors on loading tray icons.\n" "Nabi will use default builtin icons and the theme will be changed to default value.\n" "Please change the theme settings.")); gtk_label_set_use_markup(GTK_LABEL(GTK_MESSAGE_DIALOG(message)->label), TRUE); gtk_window_set_title(GTK_WINDOW(message), _("Nabi: error message")); gtk_widget_show(message); gtk_dialog_run(GTK_DIALOG(message)); gtk_widget_destroy(message); g_string_assign(nabi->config->theme, DEFAULT_THEME); } } static gboolean nabi_tray_icon_create(gpointer data) { #if HAVE_GTK_STATUS_ICON NabiTrayIcon* tray; if (nabi_tray != NULL) return FALSE; tray = g_new(NabiTrayIcon, 1); nabi_tray = tray; tray->icon = gtk_status_icon_new(); g_signal_connect(G_OBJECT(tray->icon), "popup-menu", G_CALLBACK(on_tray_icon_popup_menu), NULL); gtk_status_icon_set_from_pixbuf(tray->icon, none_pixbuf); nabi_tray_icon_update_tooltips(); g_signal_connect(G_OBJECT(tray->icon), "notify::embedded", G_CALLBACK(on_status_icon_embedded), tray); #else NabiTrayIcon* tray; GtkWidget *eventbox; GtkTooltips *tooltips; GtkOrientation orientation; int w, h; if (nabi_tray != NULL) return FALSE; tray = g_new(NabiTrayIcon, 1); tray->widget = NULL; tray->state = NULL; nabi_tray = tray; tray->widget = egg_tray_icon_new("Tray icon"); eventbox = gtk_event_box_new(); gtk_container_add(GTK_CONTAINER(tray->widget), eventbox); g_signal_connect(G_OBJECT(eventbox), "button-press-event", G_CALLBACK(on_tray_icon_button_press), NULL); gtk_widget_show(eventbox); nabi->tray_icon = eventbox; tooltips = gtk_tooltips_new(); tray->tooltips = tooltips; nabi_tray_icon_update_tooltips(); orientation = egg_tray_icon_get_orientation(tray->widget); if (orientation == GTK_ORIENTATION_VERTICAL) { w = nabi->icon_size; h = -1; } else { w = -1; h = nabi->icon_size; } tray->state = nabi_state_icon_new(w, h); gtk_container_add(GTK_CONTAINER(eventbox), tray->state->widget); gtk_widget_show(tray->state->widget); g_signal_connect(G_OBJECT(tray->widget), "size-allocate", G_CALLBACK(on_tray_icon_size_allocate), tray); g_signal_connect(G_OBJECT(tray->widget), "embedded", G_CALLBACK(on_tray_icon_embedded), tray); g_signal_connect(G_OBJECT(tray->widget), "destroy", G_CALLBACK(on_tray_icon_destroyed), tray); gtk_widget_show(GTK_WIDGET(tray->widget)); #endif // HAVE_GTK_STATUS_ICON return FALSE; } static void nabi_tray_icon_destroy(NabiTrayIcon* tray) { #if HAVE_GTK_STATUS_ICON if (tray->icon != NULL) { g_object_unref(tray->icon); on_tray_icon_destroyed(NULL, NULL); } #else // widget만 destroy하면 destroy signal에서 나머지 delete 처리를 한다. if (tray->widget != NULL) gtk_widget_destroy(GTK_WIDGET(tray->widget)); #endif } static void on_palette_item_pressed(GtkWidget* widget, gpointer data) { gtk_menu_popup(GTK_MENU(data), NULL, NULL, nabi_menu_position_func, widget, 0, gtk_get_current_event_time()); } static void on_palette_hanja_mode_toggled(GtkToggleButton* button, gpointer data) { gboolean state; state = gtk_toggle_button_get_active(button); nabi_app_set_hanja_mode(state); } GtkWidget* nabi_app_create_palette(void) { GtkWidget* handlebox; GtkWidget* hbox; GtkWidget* eventbox; GtkWidget* menu; GtkWidget* menuitem; GtkWidget* image; GtkWidget* button; const char* current_keyboard_name = NULL; nabi_palette = g_new(NabiPalette, 1); nabi_palette->widget = NULL; nabi_palette->state = NULL; nabi_palette->hanja_mode_button = NULL; nabi_palette->source_id = 0; handlebox = nabi_handle_box_new(); nabi_palette->widget = handlebox; gtk_window_move(GTK_WINDOW(handlebox), nabi->config->x, nabi->config->y); gtk_window_set_keep_above(GTK_WINDOW(handlebox), TRUE); gtk_window_stick(GTK_WINDOW(handlebox)); gtk_window_set_accept_focus(GTK_WINDOW(handlebox), FALSE); g_signal_connect_after(G_OBJECT(handlebox), "realize", G_CALLBACK(on_palette_realized), NULL); g_signal_connect(G_OBJECT(handlebox), "destroy", G_CALLBACK(on_palette_destroyed), NULL); hbox = gtk_hbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER(handlebox), hbox); gtk_widget_show(hbox); eventbox = gtk_event_box_new(); gtk_box_pack_start(GTK_BOX(hbox), eventbox, FALSE, FALSE, 0); gtk_widget_show(eventbox); nabi_palette->state = nabi_state_icon_new(-1, nabi->config->palette_height); gtk_container_add(GTK_CONTAINER(eventbox), nabi_palette->state->widget); gtk_widget_show(nabi_palette->state->widget); current_keyboard_name = nabi_server_get_keyboard_name_by_id(nabi_server, nabi->config->hangul_keyboard->str); if (current_keyboard_name != NULL) { const NabiHangulKeyboard* keyboards; button = gtk_button_new_with_label(_(current_keyboard_name)); gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE); gtk_button_set_focus_on_click(GTK_BUTTON(button), FALSE); GTK_WIDGET_UNSET_FLAGS(button, GTK_CAN_FOCUS); gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); gtk_widget_show(button); nabi->keyboard_button = button; keyboards = nabi_server_get_hangul_keyboard_list(nabi_server); if (keyboards != NULL) { int i; menu = gtk_menu_new(); for (i = 0; keyboards[i].id != NULL; i++) { menuitem = gtk_menu_item_new_with_label(_(keyboards[i].name)); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); gtk_widget_show(menuitem); g_signal_connect(G_OBJECT(menuitem), "activate", G_CALLBACK(on_menu_keyboard), (gpointer)keyboards[i].id); } g_signal_connect(G_OBJECT(button), "pressed", G_CALLBACK(on_palette_item_pressed), menu); } } button = gtk_toggle_button_new_with_label(_("Hanja Lock")); gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), nabi->config->hanja_mode); gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(button), "toggled", G_CALLBACK(on_palette_hanja_mode_toggled), NULL); gtk_widget_show(button); nabi_palette->hanja_mode_button = GTK_TOGGLE_BUTTON(button); image = gtk_image_new_from_stock(GTK_STOCK_PROPERTIES, GTK_ICON_SIZE_MENU); button = gtk_button_new(); gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE); gtk_button_set_focus_on_click(GTK_BUTTON(button), FALSE); GTK_WIDGET_UNSET_FLAGS(button, GTK_CAN_FOCUS); gtk_button_set_image(GTK_BUTTON(button), image); gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); gtk_widget_show(button); menu = gtk_menu_new(); menuitem = gtk_image_menu_item_new_from_stock(GTK_STOCK_DIALOG_INFO, NULL); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); g_signal_connect_swapped(G_OBJECT(menuitem), "activate", G_CALLBACK(on_menu_about), menuitem); menuitem = gtk_separator_menu_item_new(); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); menuitem = gtk_image_menu_item_new_from_stock(GTK_STOCK_PREFERENCES, NULL); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); g_signal_connect_swapped(G_OBJECT(menuitem), "activate", G_CALLBACK(on_menu_preference), menuitem); menuitem = gtk_menu_item_new_with_mnemonic(_("_Hide palette")); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); g_signal_connect_swapped(G_OBJECT(menuitem), "activate", G_CALLBACK(on_menu_hide_palette), menuitem); // tray에 embed되기 전까지는 무조건 hide 메뉴는 비활성화 해야 // 실수로라도 palette가 사라지는 것을 막을 수 있다. gtk_widget_set_sensitive(menuitem, FALSE); hide_palette_menuitem = menuitem; menuitem = gtk_separator_menu_item_new(); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); menuitem = gtk_image_menu_item_new_from_stock(GTK_STOCK_QUIT, NULL); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); g_signal_connect_swapped(G_OBJECT(menuitem), "activate", G_CALLBACK(on_menu_quit), menuitem); gtk_widget_show_all(menu); g_signal_connect(G_OBJECT(button), "pressed", G_CALLBACK(on_palette_item_pressed), menu); if (nabi->config->use_tray_icon) g_idle_add(nabi_tray_icon_create, NULL); return handlebox; } static void nabi_palette_show(NabiPalette* palette) { if (palette != NULL && palette->widget != NULL && !GTK_WIDGET_VISIBLE(palette->widget)) { gtk_window_move(GTK_WINDOW(palette->widget), nabi->config->x, nabi->config->y); gtk_widget_show(GTK_WIDGET(palette->widget)); } } static void nabi_palette_hide(NabiPalette* palette) { if (palette != NULL && GTK_WIDGET_VISIBLE(palette->widget)) { gtk_window_get_position(GTK_WINDOW(palette->widget), &nabi->config->x, &nabi->config->y); gtk_widget_hide(GTK_WIDGET(palette->widget)); } } static void nabi_palette_update_state(NabiPalette* palette, int state) { if (palette != NULL) nabi_state_icon_update(palette->state, state); } static void nabi_palette_update_hanja_mode(NabiPalette* palette, gboolean state) { if (palette != NULL) gtk_toggle_button_set_active(palette->hanja_mode_button, state); } static void nabi_palette_destroy(NabiPalette* palette) { if (palette != NULL) { GtkWidget* widget = palette->widget; /* palette의 widget을 destroy할때 "on_destroy" 시그널에 * tray icon을 정리하면서 palette widget을 다시 show()하는 * 경우가 발생할 수 있다. 이런 문제를 피하기 위해서 * 여기서 palette->widget을 먼저 NULL로 세팅하고 destroy()를 * 호출하도록 한다. */ palette->widget = NULL; gtk_window_get_position(GTK_WINDOW(widget), &nabi->config->x, &nabi->config->y); gtk_widget_destroy(widget); nabi_state_icon_destroy(palette->state); if (palette->source_id > 0) g_source_remove(palette->source_id); g_free(palette); } } void nabi_app_set_theme(const gchar *name) { g_string_assign(nabi->config->theme, name); nabi_app_load_base_icons(); #if HAVE_GTK_STATUS_ICON // 아이콘을 바꾸려면 현재 state를 알아야 한다. // 그런데 state를 알아오려면 애매하고, 사실 테마가 바뀌는 순간에는 // text entry에 focus가 없을 것이므로 기본 상태 값으로 줘도 // 별 문제가 없을 것이다. if (nabi_tray != NULL) nabi_tray_update_state(nabi_tray, 0); #else if (nabi_tray != NULL) nabi_tray_load_icons(nabi_tray, nabi->icon_size); #endif } void nabi_app_use_tray_icon(gboolean use) { nabi->config->use_tray_icon = use; // tray icon이 없는 상태에서 hide palette 메뉴를 작동시키면 tray icon도 // 없고 palette도 없게 되므로 nabi를 컨트롤 할수 없게 된다. 따라서 // tray icon이 있는 상태에서만 hide palette 메뉴를 사용할수 있게 한다. gtk_widget_set_sensitive(hide_palette_menuitem, use); if (use) { if (nabi_tray == NULL) { nabi_tray_icon_create(NULL); } } else { if (nabi_tray != NULL) { nabi_tray_icon_destroy(nabi_tray); } } } void nabi_app_show_palette(gboolean state) { nabi->config->show_palette = state; if (state) nabi_palette_show(nabi_palette); else nabi_palette_hide(nabi_palette); } void nabi_app_set_hanja_mode(gboolean state) { nabi->config->hanja_mode = state; nabi_server_set_hanja_mode(nabi_server, state); } void nabi_app_set_hangul_keyboard(const char *id) { if (id == NULL) g_string_assign(nabi->config->hangul_keyboard, DEFAULT_KEYBOARD); else g_string_assign(nabi->config->hangul_keyboard, id); nabi_server_set_hangul_keyboard(nabi_server, id); // palette의 메뉴 버튼 업데이트 if (nabi->keyboard_button != NULL) { const char* name; name = nabi_server_get_current_keyboard_name(nabi_server); gtk_button_set_label(GTK_BUTTON(nabi->keyboard_button), _(name)); } nabi_tray_icon_update_tooltips(); } void nabi_app_save_config() { if (nabi != NULL && nabi->config != NULL) nabi_config_save(nabi->config); } static void nabi_tray_icon_update_tooltips() { #if HAVE_GTK_STATUS_ICON if (nabi_tray != NULL && nabi_tray->icon != NULL) { const char* keyboard_name; char tip_text[256]; keyboard_name = nabi_server_get_keyboard_name_by_id(nabi_server, nabi->config->hangul_keyboard->str); snprintf(tip_text, sizeof(tip_text), _("Nabi: %s"), _(keyboard_name)); gtk_status_icon_set_tooltip_text(nabi_tray->icon, tip_text); } #else /* HAVE_GTK_STATUS_ICON */ if (nabi_tray != NULL && nabi_tray->tooltips != NULL) { const char* keyboard_name; char tip_text[256]; keyboard_name = nabi_server_get_keyboard_name_by_id(nabi_server, nabi->config->hangul_keyboard->str); snprintf(tip_text, sizeof(tip_text), _("Nabi: %s"), _(keyboard_name)); gtk_tooltips_set_tip(GTK_TOOLTIPS(nabi_tray->tooltips), nabi->tray_icon, tip_text, _("Hangul input method: Nabi" " - You can input hangul using this program")); } #endif /* HAVE_GTK_STATUS_ICON */ } /* vim: set ts=8 sts=4 sw=4 : */ nabi-1.0.0/src/preference.h0000644000175000017500000000163411655153252012431 00000000000000/* Nabi - X Input Method server for hangul * Copyright (C) 2008 Choe Hwanjin * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #ifndef nabi_preference_h #define nabi_preference_h GtkWidget* preference_window_create(void); #endif // nabi_preference_h nabi-1.0.0/src/preference.c0000644000175000017500000014133711662176145012435 00000000000000/* Nabi - X Input Method server for hangul * Copyright (C) 2003-2009 Choe Hwanjin * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include #include #include "nabi.h" #include "server.h" #include "preference.h" #include "keycapturedialog.h" #include "debug.h" enum { THEMES_LIST_PATH = 0, THEMES_LIST_NONE, THEMES_LIST_HANGUL, THEMES_LIST_ENGLISH, THEMES_LIST_NAME, N_COLS }; static NabiConfig* config = NULL; static GtkTreeModel* trigger_key_model = NULL; static GtkTreeModel* off_key_model = NULL; static GtkTreeModel* candidate_key_model = NULL; static GdkPixbuf * load_resized_icons_from_file(const gchar *base_filename, int size) { char* filename; GdkPixbuf *pixbuf; GdkPixbuf *pixbuf_resized; gdouble factor; gint orig_width, orig_height; gint new_width, new_height; GdkInterpType scale_method = GDK_INTERP_NEAREST; filename = g_strconcat(base_filename, ".svg", NULL); pixbuf = gdk_pixbuf_new_from_file(filename, NULL); g_free(filename); if (pixbuf == NULL) { filename = g_strconcat(base_filename, ".png", NULL); pixbuf = gdk_pixbuf_new_from_file(filename, NULL); g_free(filename); } if (pixbuf == NULL) return NULL; orig_width = gdk_pixbuf_get_width(pixbuf); orig_height = gdk_pixbuf_get_height(pixbuf); if (orig_width > orig_height) { factor = (double)size / (double)orig_width; new_width = size; new_height = (int)(orig_height * factor); } else { factor = (double)size / (double)orig_height; new_width = (int)(orig_width * factor); new_height = size; } if (factor < 1) scale_method = GDK_INTERP_BILINEAR; pixbuf_resized = gdk_pixbuf_scale_simple(pixbuf, new_width, new_height, scale_method); g_object_unref(pixbuf); return pixbuf_resized; } static GtkWidget* create_pref_item(const char* title, GtkWidget* child, gboolean expand, gboolean fill) { GtkWidget* vbox; GtkWidget* hbox; GtkWidget* label; char markup[256]; snprintf(markup, sizeof(markup), "%s", title); vbox = gtk_vbox_new(FALSE, 0); label = gtk_label_new(""); gtk_label_set_use_markup(GTK_LABEL(label), TRUE); gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); gtk_label_set_markup(GTK_LABEL(label), markup); gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, TRUE, 0); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 6); label = gtk_label_new(" "); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, TRUE, 0); gtk_box_pack_start(GTK_BOX(hbox), child, expand, fill, 0); return vbox; } static GtkTreeModel * get_themes_list(int size) { const gchar *path; gchar *theme_dir; gchar *file_none; gchar *file_hangul; gchar *file_english; GdkPixbuf *pixbuf_none; GdkPixbuf *pixbuf_hangul; GdkPixbuf *pixbuf_english; GtkListStore *store; GtkTreeIter iter; DIR *dir; struct dirent *dent; store = gtk_list_store_new(N_COLS, G_TYPE_STRING, GDK_TYPE_PIXBUF, GDK_TYPE_PIXBUF, GDK_TYPE_PIXBUF, G_TYPE_STRING); path = NABI_THEMES_DIR; dir = opendir(path); if (dir == NULL) return NULL; for (dent = readdir(dir); dent != NULL; dent = readdir(dir)) { if (dent->d_name[0] == '.') continue; theme_dir = g_build_filename(path, dent->d_name, NULL); file_none = g_build_filename(theme_dir, "none", NULL); file_hangul = g_build_filename(theme_dir, "hangul", NULL); file_english = g_build_filename(theme_dir, "english", NULL); pixbuf_none = load_resized_icons_from_file(file_none, size); pixbuf_hangul = load_resized_icons_from_file(file_hangul, size); pixbuf_english = load_resized_icons_from_file(file_english, size); if (pixbuf_none != NULL && pixbuf_hangul != NULL && pixbuf_english != NULL) { gtk_list_store_append(store, &iter); gtk_list_store_set (store, &iter, THEMES_LIST_PATH, theme_dir, THEMES_LIST_NONE, pixbuf_none, THEMES_LIST_HANGUL, pixbuf_hangul, THEMES_LIST_ENGLISH, pixbuf_english, THEMES_LIST_NAME, dent->d_name, -1); g_object_unref(pixbuf_none); g_object_unref(pixbuf_hangul); g_object_unref(pixbuf_english); } g_free(theme_dir); g_free(file_none); g_free(file_hangul); g_free(file_english); } closedir(dir); return GTK_TREE_MODEL(store); } static GtkTreePath * search_text_in_model (GtkTreeModel *model, int column, const char *target_text) { gchar *text = NULL; GtkTreeIter iter; GtkTreePath *path; gboolean ret; ret = gtk_tree_model_get_iter_first(model, &iter); while (ret) { gtk_tree_model_get(model, &iter, column, &text, -1); if (text != NULL && strcmp(target_text, text) == 0) { path = gtk_tree_model_get_path(model, &iter); g_free(text); return path; } g_free(text); ret = gtk_tree_model_iter_next(model, &iter); } return NULL; } static void on_icon_list_selection_changed(GtkTreeSelection *selection, gpointer data) { GtkTreeModel *model; GtkTreeIter iter; gchar *theme; if (gtk_tree_selection_get_selected(selection, &model, &iter)) { gtk_tree_model_get(model, &iter, THEMES_LIST_NAME, &theme, -1); nabi_app_set_theme(theme); g_free(theme); nabi_log(4, "preference: set theme: %s\n", config->theme->str); } } static void on_use_tray_icon_button_toggled(GtkToggleButton* button, gpointer data) { gboolean flag = gtk_toggle_button_get_active(button); nabi_app_use_tray_icon(flag); nabi_log(4, "preference: set use tray icon: %d\n", flag); } static GtkWidget* create_theme_page(GtkWidget* dialog) { GtkWidget *page; GtkWidget *item; GtkWidget *scrolledwindow; GtkWidget *treeview; GtkWidget *vbox; GtkWidget *button; GtkTreeModel *model; GtkTreeViewColumn *column; GtkCellRenderer *renderer; GtkTreeSelection *selection; GtkTreePath *path; page = gtk_vbox_new(FALSE, 6); gtk_container_set_border_width(GTK_CONTAINER(page), 12); scrolledwindow = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwindow), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_container_set_border_width(GTK_CONTAINER(scrolledwindow), 0); gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolledwindow), GTK_SHADOW_IN); vbox = gtk_vbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), scrolledwindow, TRUE, TRUE, 0); item = create_pref_item(_("Tray icons"), vbox, TRUE, TRUE); gtk_box_pack_start(GTK_BOX(page), item, TRUE, TRUE, 0); /* loading themes list */ model = get_themes_list(nabi->icon_size); treeview = gtk_tree_view_new_with_model(model); g_object_unref(G_OBJECT(model)); gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treeview), FALSE); gtk_container_add(GTK_CONTAINER(scrolledwindow), treeview); g_object_set_data(G_OBJECT(dialog), "nabi-pref-theme", treeview); /* theme icons */ /* state None */ column = gtk_tree_view_column_new(); gtk_tree_view_column_set_title(column, "None"); renderer = gtk_cell_renderer_pixbuf_new(); gtk_tree_view_column_pack_start(column, renderer, FALSE); gtk_tree_view_column_add_attribute(column, renderer, "pixbuf", THEMES_LIST_NONE); gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); /* state Hangul */ column = gtk_tree_view_column_new(); gtk_tree_view_column_set_title(column, "Hangul"); renderer = gtk_cell_renderer_pixbuf_new(); gtk_tree_view_column_pack_start(column, renderer, FALSE); gtk_tree_view_column_add_attribute(column, renderer, "pixbuf", THEMES_LIST_HANGUL); gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); /* state English */ column = gtk_tree_view_column_new(); gtk_tree_view_column_set_title(column, "English"); renderer = gtk_cell_renderer_pixbuf_new(); gtk_tree_view_column_pack_start(column, renderer, FALSE); gtk_tree_view_column_add_attribute(column, renderer, "pixbuf", THEMES_LIST_ENGLISH); gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new_with_attributes("Theme Name", renderer, "text", THEMES_LIST_NAME, NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)); gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE); path = search_text_in_model(model, THEMES_LIST_NAME, config->theme->str); if (path) { gtk_tree_view_set_cursor (GTK_TREE_VIEW(treeview), path, NULL, FALSE); gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(treeview), path, NULL, TRUE, 0.5, 0.0); gtk_tree_path_free(path); } // 현재 theme를 선택한후 signal을 연결한다. // 그렇지 않으면 UI를 초기화하는 과정에서 아래 콜백이 불리게 된다. g_signal_connect(G_OBJECT(selection), "changed", G_CALLBACK(on_icon_list_selection_changed), NULL); button = gtk_check_button_new_with_label(_("Use tray icon")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), config->use_tray_icon); gtk_box_pack_start(GTK_BOX(vbox), button, FALSE, FALSE, 6); g_object_set_data(G_OBJECT(dialog), "nabi-pref-use-tray-icon", button); g_signal_connect(G_OBJECT(button), "toggled", G_CALLBACK(on_use_tray_icon_button_toggled), NULL); return page; } static void on_hangul_keyboard_changed(GtkComboBox *widget, gpointer data) { int i; const NabiHangulKeyboard* keyboards; i = gtk_combo_box_get_active(widget); keyboards = nabi_server_get_hangul_keyboard_list(nabi_server); if (keyboards[i].id != NULL) { nabi_app_set_hangul_keyboard(keyboards[i].id); nabi_log(4, "preference: set hagul keyboard: %s\n", config->hangul_keyboard->str); } } static void on_latin_keyboard_changed(GtkComboBox *widget, gpointer data) { int i = gtk_combo_box_get_active(widget); NabiKeyboardLayout* item = g_list_nth_data(nabi_server->layouts, i); if (item != NULL) { g_string_assign(config->latin_keyboard, item->name); nabi_server_set_keyboard_layout(nabi_server, item->name); nabi_log(4, "preference: set latin keyboard: %s\n", config->latin_keyboard->str); } } static void on_use_system_keymap_button_toggled(GtkToggleButton *button, gpointer data) { gboolean flag = gtk_toggle_button_get_active(button); config->use_system_keymap = flag; nabi_server_set_use_system_keymap(nabi_server, flag); gtk_widget_set_sensitive(GTK_WIDGET(data), config->use_system_keymap); nabi_log(4, "preference: set use system keymap: %d\n", flag); } static GtkWidget* create_keyboard_page(GtkWidget* dialog) { GtkWidget *page; GtkWidget *item; GtkWidget *vbox; GtkWidget *hbox; GtkWidget *button; GtkWidget *combo_box; GtkSizeGroup* size_group; GList* list; int i; const NabiHangulKeyboard* keyboards; page = gtk_vbox_new(FALSE, 6); gtk_container_set_border_width(GTK_CONTAINER(page), 12); /* hangul keyboard */ size_group = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); combo_box = gtk_combo_box_new_text(); keyboards = nabi_server_get_hangul_keyboard_list(nabi_server); for (i = 0; keyboards[i].name != NULL; i++) { gtk_combo_box_append_text(GTK_COMBO_BOX(combo_box), _(keyboards[i].name)); if (strcmp(config->hangul_keyboard->str, keyboards[i].id) == 0) { gtk_combo_box_set_active(GTK_COMBO_BOX(combo_box), i); } } gtk_size_group_add_widget(size_group, combo_box); g_object_set_data(G_OBJECT(dialog), "nabi-pref-hangul-keyboard", combo_box); g_signal_connect(G_OBJECT(combo_box), "changed", G_CALLBACK(on_hangul_keyboard_changed), NULL); item = create_pref_item(_("Hangul keyboard"), combo_box, FALSE, FALSE); gtk_box_pack_start(GTK_BOX(page), item, FALSE, TRUE, 0); /* latin keyboard */ vbox = gtk_vbox_new(FALSE, 0); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); button = gtk_check_button_new_with_label(_("Use system keymap")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), config->use_system_keymap); gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); g_object_set_data(G_OBJECT(dialog), "nabi-pref-use-system-keymap", button); combo_box = gtk_combo_box_new_text(); i = 0; list = nabi_server->layouts; while (list != NULL) { NabiKeyboardLayout* layout = list->data; if (layout != NULL) { gtk_combo_box_append_text(GTK_COMBO_BOX(combo_box), layout->name); if (strcmp(config->latin_keyboard->str, layout->name) == 0) { gtk_combo_box_set_active(GTK_COMBO_BOX(combo_box), i); } } list = g_list_next(list); i++; } gtk_size_group_add_widget(size_group, combo_box); gtk_box_pack_start(GTK_BOX(vbox), combo_box, FALSE, FALSE, 0); g_object_set_data(G_OBJECT(dialog), "nabi-pref-latin-keyboard", combo_box); g_signal_connect(G_OBJECT(combo_box), "changed", G_CALLBACK(on_latin_keyboard_changed), NULL); gtk_widget_set_sensitive(GTK_WIDGET(combo_box), config->use_system_keymap); g_signal_connect(G_OBJECT(button), "toggled", G_CALLBACK(on_use_system_keymap_button_toggled), combo_box); item = create_pref_item(_("English keyboard"), vbox, FALSE, FALSE); gtk_box_pack_start(GTK_BOX(page), item, FALSE, TRUE, 0); g_object_unref(G_OBJECT(size_group)); return page; } static GtkTreeModel* create_key_list_store(const char *key_list) { int i; GtkListStore *store; GtkTreeIter iter; gchar **keys; store = gtk_list_store_new(1, G_TYPE_STRING); keys = g_strsplit(key_list, ",", 0); for (i = 0; keys[i] != NULL; i++) { gtk_list_store_append(store, &iter); gtk_list_store_set (store, &iter, 0, keys[i], -1); } g_strfreev(keys); return GTK_TREE_MODEL(store); } static GtkWidget* create_key_list_widget(const char* key_list) { GtkWidget *scrolledwindow; GtkWidget *treeview; GtkTreeViewColumn *column; GtkTreeSelection *selection; GtkCellRenderer *renderer; GtkTreeModel *model; scrolledwindow = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwindow), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolledwindow), GTK_SHADOW_IN); gtk_container_set_border_width(GTK_CONTAINER(scrolledwindow), 0); model = create_key_list_store(key_list); treeview = gtk_tree_view_new_with_model(model); g_object_unref(G_OBJECT(model)); gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treeview), FALSE); gtk_container_add(GTK_CONTAINER(scrolledwindow), treeview); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_title(column, "key"); renderer = gtk_cell_renderer_text_new(); gtk_tree_view_column_pack_start(column, renderer, FALSE); gtk_tree_view_column_add_attribute(column, renderer, "text", 0); gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)); gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE); gtk_tree_selection_unselect_all(selection); g_object_set_data(G_OBJECT(scrolledwindow), "treeview", treeview); return scrolledwindow; } static char** create_key_list_string_array(GtkTreeModel* model) { GtkTreeIter iter; gboolean ret; int n; char **keys; n = gtk_tree_model_iter_n_children(model, NULL); keys = g_new(char*, n + 1); n = 0; ret = gtk_tree_model_get_iter_first(model, &iter); while (ret) { char *key = NULL; gtk_tree_model_get(model, &iter, 0, &key, -1); if (key != NULL) keys[n++] = key; ret = gtk_tree_model_iter_next(model, &iter); } keys[n] = NULL; return keys; } static void update_trigger_keys_setting(GtkTreeModel *model) { char *joined; char **keys = create_key_list_string_array(model); joined = g_strjoinv(",", keys); g_string_assign(config->trigger_keys, joined); nabi_server_set_trigger_keys(nabi_server, keys); g_free(joined); g_strfreev(keys); nabi_log(4, "preference: set trigger keys: %s\n", config->trigger_keys->str); } static void update_off_keys_setting(GtkTreeModel *model) { char *joined; char **keys = create_key_list_string_array(model); joined = g_strjoinv(",", keys); g_string_assign(config->off_keys, joined); nabi_server_set_off_keys(nabi_server, keys); g_free(joined); g_strfreev(keys); nabi_log(4, "preference: set off keys: %s\n", config->off_keys->str); } static void on_key_list_add_button_clicked(GtkWidget *widget, gpointer data) { GtkWidget *toplevel; GtkWindow *parent = NULL; GtkWidget *dialog; gchar* title; gchar* message; gint result; title = g_object_get_data(G_OBJECT(widget), "dialog-title"); message = g_object_get_data(G_OBJECT(widget), "dialog-message"); toplevel = gtk_widget_get_toplevel(GTK_WIDGET(widget)); if (GTK_WIDGET_TOPLEVEL(toplevel)) parent = GTK_WINDOW(toplevel); dialog = key_capture_dialog_new(title, parent, "", message); run: result = gtk_dialog_run(GTK_DIALOG(dialog)); if (result == GTK_RESPONSE_OK) { const gchar *key = key_capture_dialog_get_key_text(dialog); if (strlen(key) > 0) { GtkWidget* message_dialog; GtkTreePath *path; path = search_text_in_model(trigger_key_model, 0, key); if (path != NULL) { message_dialog = gtk_message_dialog_new_with_markup(GTK_WINDOW(dialog), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_WARNING, GTK_BUTTONS_CLOSE, _("This key is already registered for trigger key\n" "Please select another key")); gtk_dialog_run(GTK_DIALOG(message_dialog)); gtk_widget_destroy(message_dialog); gtk_tree_path_free(path); goto run; } path = search_text_in_model(off_key_model, 0, key); if (path != NULL) { message_dialog = gtk_message_dialog_new_with_markup(GTK_WINDOW(dialog), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_WARNING, GTK_BUTTONS_CLOSE, _("This key is already registered for off key\n" "Please select another key")); gtk_dialog_run(GTK_DIALOG(message_dialog)); gtk_widget_destroy(message_dialog); gtk_tree_path_free(path); goto run; } path = search_text_in_model(candidate_key_model, 0, key); if (path != NULL) { message_dialog = gtk_message_dialog_new_with_markup(GTK_WINDOW(dialog), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_WARNING, GTK_BUTTONS_CLOSE, _("This key is already registered for candidate key\n" "Please select another key")); gtk_dialog_run(GTK_DIALOG(message_dialog)); gtk_widget_destroy(message_dialog); gtk_tree_path_free(path); goto run; } else { GtkTreeModel *model; GtkTreeIter iter; GtkWidget* remove_button; model = gtk_tree_view_get_model(GTK_TREE_VIEW(data)); gtk_list_store_append(GTK_LIST_STORE(model), &iter); gtk_list_store_set (GTK_LIST_STORE(model), &iter, 0, key, -1); /* treeview가 remove button을 가지고 있으면 sensitive 플래그를 * 켠다. item이 하나 추가 되었으므로 remove button이 활성화 * 되어도 된다. */ remove_button = g_object_get_data(G_OBJECT(data), "remove-button"); if (remove_button != NULL) gtk_widget_set_sensitive(remove_button, TRUE); } } } gtk_widget_destroy(dialog); } static void on_key_list_remove_button_clicked(GtkWidget *widget, gpointer data) { GtkTreeSelection *selection; GtkTreeModel *model; GtkTreeIter iter; selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(data)); if (gtk_tree_selection_get_selected(selection, &model, &iter)) { GtkWidget *remove_button; gtk_list_store_remove(GTK_LIST_STORE(model), &iter); /* treeview 가 "remove-button"을 가지고 있을 경우에는 * item이 1개만 남았을때 부터 remove button을 insensitive하게 만들어 * 더이상 아이템을 지울수 없게 한다. * trigger키의 경우에는 최소한 1개의 아이템이 있어야 한다. */ remove_button = g_object_get_data(G_OBJECT(data), "remove-button"); if (remove_button) { int n = gtk_tree_model_iter_n_children(model, NULL); if (n <= 1) { gtk_widget_set_sensitive(remove_button, FALSE); } } } } static void update_candidate_keys_setting(GtkTreeModel *model) { char *joined; char **keys = create_key_list_string_array(model); joined = g_strjoinv(",", keys); g_string_assign(config->candidate_keys, joined); nabi_server_set_candidate_keys(nabi_server, keys); g_free(joined); g_strfreev(keys); nabi_log(4, "preference: set candidate keys: %s\n", config->candidate_keys->str); } static GtkWidget* create_hangul_page(GtkWidget* dialog) { GtkWidget *page; GtkWidget *item; GtkWidget *hbox; GtkWidget *vbox1; GtkWidget *vbox2; GtkWidget *label; GtkWidget *button; GtkWidget *widget; GtkWidget *treeview; GtkTreeModel *model; const char *title; const char *message; int n; page = gtk_vbox_new(FALSE, 6); gtk_container_set_border_width(GTK_CONTAINER(page), 12); /* options for trigger key */ vbox1 = gtk_vbox_new(FALSE, 0); item = create_pref_item(_("Trigger keys"), vbox1, TRUE, TRUE); gtk_box_pack_start(GTK_BOX(page), item, TRUE, TRUE, 0); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox1), hbox, TRUE, TRUE, 0); vbox2 = gtk_vbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), vbox2, TRUE, TRUE, 0); widget = create_key_list_widget(config->trigger_keys->str); treeview = g_object_get_data(G_OBJECT(widget), "treeview"); gtk_box_pack_start(GTK_BOX(vbox2), widget, TRUE, TRUE, 0); model = gtk_tree_view_get_model(GTK_TREE_VIEW(treeview)); g_object_set_data(G_OBJECT(dialog), "nabi-pref-trigger-keys", model); g_signal_connect_after(G_OBJECT(model), "row-changed", G_CALLBACK(update_trigger_keys_setting), NULL); g_signal_connect_after(G_OBJECT(model), "row-deleted", G_CALLBACK(update_trigger_keys_setting), NULL); vbox2 = gtk_vbox_new(FALSE, 6); gtk_box_pack_start(GTK_BOX(hbox), vbox2, FALSE, TRUE, 6); title = _("Select trigger key"); message = _("Press any key which you want to use as trigger key. " "The key you pressed is displayed below.\n" "If you want to use it, click \"Ok\" or click \"Cancel\""); button = gtk_button_new_from_stock(GTK_STOCK_ADD); gtk_box_pack_start(GTK_BOX(vbox2), button, FALSE, TRUE, 0); g_object_set_data(G_OBJECT(button), "dialog-title", (gpointer)title); g_object_set_data(G_OBJECT(button), "dialog-message", (gpointer)message); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(on_key_list_add_button_clicked), treeview); button = gtk_button_new_from_stock(GTK_STOCK_REMOVE); gtk_box_pack_start(GTK_BOX(vbox2), button, FALSE, TRUE, 0); g_object_set_data(G_OBJECT(treeview), "remove-button", button); model = gtk_tree_view_get_model(GTK_TREE_VIEW(treeview)); trigger_key_model = model; n = gtk_tree_model_iter_n_children(model, NULL); if (n <= 1) { /* there is only one entry in trigger key list. * nabi need at least on trigger key. * So we disable remove the button, here */ gtk_widget_set_sensitive(button, FALSE); } g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(on_key_list_remove_button_clicked), treeview); label = gtk_label_new(_("* You should restart nabi to apply above option")); gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); gtk_box_pack_start(GTK_BOX(vbox1), label, FALSE, FALSE, 6); /* options for off keys */ hbox = gtk_hbox_new(FALSE, 0); item = create_pref_item(_("Off keys"), hbox, TRUE, TRUE); gtk_box_pack_start(GTK_BOX(page), item, TRUE, TRUE, 0); vbox2 = gtk_vbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), vbox2, TRUE, TRUE, 0); widget = create_key_list_widget(config->off_keys->str); treeview = g_object_get_data(G_OBJECT(widget), "treeview"); model = gtk_tree_view_get_model(GTK_TREE_VIEW(treeview)); off_key_model = model; g_object_set_data(G_OBJECT(dialog), "nabi-pref-off-keys", model); gtk_box_pack_start(GTK_BOX(vbox2), widget, TRUE, TRUE, 0); g_signal_connect_after(G_OBJECT(model), "row-changed", G_CALLBACK(update_off_keys_setting), NULL); g_signal_connect_after(G_OBJECT(model), "row-deleted", G_CALLBACK(update_off_keys_setting), NULL); vbox2 = gtk_vbox_new(FALSE, 6); gtk_box_pack_start(GTK_BOX(hbox), vbox2, FALSE, TRUE, 6); title = _("Select off key"); message = _("Press any key which you want to use as off key. " "The key you pressed is displayed below.\n" "If you want to use it, click \"Ok\" or click \"Cancel\""); button = gtk_button_new_from_stock(GTK_STOCK_ADD); gtk_box_pack_start(GTK_BOX(vbox2), button, FALSE, TRUE, 0); g_object_set_data(G_OBJECT(button), "dialog-title", (gpointer)title); g_object_set_data(G_OBJECT(button), "dialog-message", (gpointer)message); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(on_key_list_add_button_clicked), treeview); button = gtk_button_new_from_stock(GTK_STOCK_REMOVE); gtk_box_pack_start(GTK_BOX(vbox2), button, FALSE, TRUE, 0); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(on_key_list_remove_button_clicked), treeview); return page; } static void candidate_font_button_set_labels(GtkWidget* button, const char* font_name) { GtkWidget* face_label = g_object_get_data(G_OBJECT(button), "face_label"); GtkWidget* size_label = g_object_get_data(G_OBJECT(button), "size_label"); const char* sep = strrchr(font_name, ' '); if (sep != NULL) { gchar* face_str = g_strndup(font_name, sep - font_name); const gchar* size_str = sep + 1; gtk_label_set_text(GTK_LABEL(face_label), face_str); gtk_label_set_text(GTK_LABEL(size_label), size_str); g_free(face_str); } else { gtk_label_set_text(GTK_LABEL(face_label), font_name); } } static void on_candidate_font_button_clicked(GtkWidget *button, gpointer data) { gint result; GtkWidget *dialog; dialog = gtk_font_selection_dialog_new(_("Select hanja font")); gtk_font_selection_dialog_set_font_name(GTK_FONT_SELECTION_DIALOG(dialog), config->candidate_font->str); gtk_font_selection_dialog_set_preview_text(GTK_FONT_SELECTION_DIALOG(dialog), "訓民正音 훈민정음"); gtk_widget_show_all(dialog); gtk_widget_hide(GTK_FONT_SELECTION_DIALOG(dialog)->apply_button); result = gtk_dialog_run(GTK_DIALOG(dialog)); if (result == GTK_RESPONSE_OK) { char *font = gtk_font_selection_dialog_get_font_name(GTK_FONT_SELECTION_DIALOG(dialog)); g_string_assign(config->candidate_font, font); nabi_server_set_candidate_font(nabi_server, font); candidate_font_button_set_labels(button, font); nabi_log(4, "preference: set candidate font: %s\n", config->candidate_font->str); } gtk_widget_destroy(dialog); } static void on_simplified_chinese_toggled(GtkToggleButton* button, gpointer data) { gboolean flag = gtk_toggle_button_get_active(button); config->use_simplified_chinese = flag; nabi_server_set_simplified_chinese(nabi_server, flag); nabi_log(4, "preference: set use simplified chinese: %d\n", flag); } static GtkWidget* create_candidate_page(GtkWidget* dialog) { GtkWidget *page; GtkWidget *item; GtkWidget *vbox; GtkWidget *hbox; GtkWidget *button; GtkWidget *widget; GtkWidget *treeview; GtkWidget *label; GtkTreeModel *model; const char *title; const char *message; page = gtk_vbox_new(FALSE, 6); gtk_container_set_border_width(GTK_CONTAINER(page), 12); /* options for candidate font */ button = gtk_button_new(); hbox = gtk_hbox_new(FALSE, 0); label = gtk_label_new(""); g_object_set_data(G_OBJECT(button), "face_label", label); gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 5); gtk_box_pack_start(GTK_BOX(hbox), gtk_vseparator_new(), FALSE, FALSE, 0); label = gtk_label_new(""); g_object_set_data(G_OBJECT(button), "size_label", label); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 5); gtk_container_add(GTK_CONTAINER(button), hbox); candidate_font_button_set_labels(button, config->candidate_font->str); g_object_set_data(G_OBJECT(dialog), "nabi-pref-candidate-font", button); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(on_candidate_font_button_clicked), NULL); item = create_pref_item(_("Hanja Font"), button, FALSE, FALSE); gtk_box_pack_start(GTK_BOX(page), item, FALSE, TRUE, 0); /* options for candidate key */ hbox = gtk_hbox_new(FALSE, 0); item = create_pref_item(_("Hanja keys"), hbox, TRUE, TRUE); gtk_box_pack_start(GTK_BOX(page), item, TRUE, TRUE, 0); vbox = gtk_vbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 0); widget = create_key_list_widget(config->candidate_keys->str); treeview = g_object_get_data(G_OBJECT(widget), "treeview"); model = gtk_tree_view_get_model(GTK_TREE_VIEW(treeview)); candidate_key_model = model; gtk_box_pack_start(GTK_BOX(vbox), widget, TRUE, TRUE, 0); g_object_set_data(G_OBJECT(dialog), "nabi-pref-candidate-keys", model); g_signal_connect_after(G_OBJECT(model), "row-changed", G_CALLBACK(update_candidate_keys_setting), NULL); g_signal_connect_after(G_OBJECT(model), "row-deleted", G_CALLBACK(update_candidate_keys_setting), NULL); vbox = gtk_vbox_new(FALSE, 6); gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, TRUE, 6); title = _("Select candidate key"); message = _("Press any key which you want to use as candidate key. " "The key you pressed is displayed below.\n" "If you want to use it, click \"Ok\", or click \"Cancel\""); button = gtk_button_new_from_stock(GTK_STOCK_ADD); gtk_box_pack_start(GTK_BOX(vbox), button, FALSE, TRUE, 0); g_object_set_data(G_OBJECT(button), "dialog-title", (gpointer)title); g_object_set_data(G_OBJECT(button), "dialog-message", (gpointer)message); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(on_key_list_add_button_clicked), treeview); button = gtk_button_new_from_stock(GTK_STOCK_REMOVE); gtk_box_pack_start(GTK_BOX(vbox), button, FALSE, TRUE, 0); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(on_key_list_remove_button_clicked), treeview); /* options for candidate option */ button = gtk_check_button_new_with_label(_("Use simplified chinese")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), config->use_simplified_chinese); g_object_set_data(G_OBJECT(dialog), "nabi-pref-simplified-chinese", button); g_signal_connect(G_OBJECT(button), "toggled", G_CALLBACK(on_simplified_chinese_toggled), NULL); item = create_pref_item(_("Hanja Options"), button, FALSE, FALSE); gtk_box_pack_start(GTK_BOX(page), item, FALSE, FALSE, 0); return page; } static void on_xim_name_changed(GtkEntry* entry, gpointer data) { const char* name = gtk_entry_get_text(GTK_ENTRY(entry)); g_string_assign(config->xim_name, name); nabi_server_set_xim_name(nabi_server, name); nabi_log(4, "preference: set xim name: %s\n", name); } static void on_event_flow_button_toggled(GtkToggleButton *button, gpointer data) { gboolean flag = gtk_toggle_button_get_active(button); config->use_dynamic_event_flow = flag; nabi_server_set_dynamic_event_flow(nabi_server, flag); nabi_log(4, "preference: set use dynamic event flow: %d\n", flag); } static void on_commit_by_word_button_toggled(GtkToggleButton *button, gpointer data) { gboolean flag = gtk_toggle_button_get_active(button); config->commit_by_word = flag; nabi_server_set_commit_by_word(nabi_server, flag); nabi_log(4, "preference: set commit by word: %d\n", flag); } static void on_auto_reorder_button_toggled(GtkToggleButton *button, gpointer data) { gboolean flag = gtk_toggle_button_get_active(button); config->auto_reorder = flag; nabi_server_set_auto_reorder(nabi_server, flag); nabi_log(4, "preference: set auto reorder: %d\n", flag); } static void on_ignore_app_fontset_button_toggled(GtkToggleButton *button, gpointer data) { gboolean flag = gtk_toggle_button_get_active(button); config->ignore_app_fontset = flag; nabi_server_set_ignore_app_fontset(nabi_server, flag); nabi_log(4, "preference: set ignore app fontset: %d\n", flag); } static void on_default_input_mode_button_toggled(GtkToggleButton *button, gpointer data) { gboolean flag = gtk_toggle_button_get_active(button); if (flag) { g_string_assign(config->default_input_mode, "compose"); nabi_server_set_default_input_mode(nabi_server, NABI_INPUT_MODE_COMPOSE); } else { g_string_assign(config->default_input_mode, "direct"); nabi_server_set_default_input_mode(nabi_server, NABI_INPUT_MODE_DIRECT); } nabi_log(4, "preference: set default input mode: %s\n", config->default_input_mode->str); } static void on_input_mode_scope_changed(GtkComboBox* combo_box, gpointer data) { NabiInputModeScope input_mode_scope; char* input_mode_scope_str = NULL; input_mode_scope = (NabiInputModeScope)gtk_combo_box_get_active(combo_box); switch (input_mode_scope) { case NABI_INPUT_MODE_PER_DESKTOP: input_mode_scope_str = g_strdup("per_desktop"); break; case NABI_INPUT_MODE_PER_APPLICATION: input_mode_scope_str = g_strdup("per_application"); break; case NABI_INPUT_MODE_PER_IC: input_mode_scope_str = g_strdup("per_ic"); break; case NABI_INPUT_MODE_PER_TOPLEVEL: default: input_mode_scope_str = g_strdup("per_toplevel"); break; } g_string_assign(config->input_mode_scope, input_mode_scope_str); nabi_server_set_input_mode_scope(nabi_server, input_mode_scope); nabi_log(4, "preference: set input mode scope: %s\n", config->input_mode_scope->str); } static void on_preedit_font_changed(GtkFontButton* widget, gpointer data) { const char* font_desc; font_desc = gtk_font_button_get_font_name(widget); g_string_assign(config->preedit_font, font_desc); nabi_server_set_preedit_font(nabi_server, font_desc); nabi_log(4, "preference: set preedit font: %s\n", config->preedit_font->str); } static GtkWidget* create_advanced_page(GtkWidget* dialog) { GtkWidget *page; GtkWidget *item; GtkWidget *vbox; GtkWidget *hbox; GtkWidget *label; GtkWidget *button; GtkWidget *entry; GtkWidget *combo_box; page = gtk_vbox_new(FALSE, 6); gtk_container_set_border_width(GTK_CONTAINER(page), 12); vbox = gtk_vbox_new(FALSE, 0); item = create_pref_item(_("Advanced"), vbox, TRUE, TRUE); gtk_box_pack_start(GTK_BOX(page), item, TRUE, TRUE, 0); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); label = gtk_label_new(_("XIM name:")); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); entry = gtk_entry_new(); gtk_entry_set_width_chars(GTK_ENTRY(entry), 16); gtk_entry_set_text(GTK_ENTRY(entry), config->xim_name->str); gtk_box_pack_start(GTK_BOX(hbox), entry, FALSE, FALSE, 6); g_object_set_data(G_OBJECT(dialog), "nabi-pref-xim-name", entry); g_signal_connect(G_OBJECT(entry), "changed", G_CALLBACK(on_xim_name_changed), NULL); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); button = gtk_check_button_new_with_label(_("Use dynamic event flow")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), config->use_dynamic_event_flow); gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); g_object_set_data(G_OBJECT(dialog), "nabi-pref-use-dynamic-event-flow", button); g_signal_connect(G_OBJECT(button), "toggled", G_CALLBACK(on_event_flow_button_toggled), NULL); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); button = gtk_check_button_new_with_label(_("Commit by word")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), config->commit_by_word); gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); g_object_set_data(G_OBJECT(dialog), "nabi-pref-commit-by-word", button); g_signal_connect(G_OBJECT(button), "toggled", G_CALLBACK(on_commit_by_word_button_toggled), NULL); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); button = gtk_check_button_new_with_label(_("Automatic reordering")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), config->auto_reorder); gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); g_object_set_data(G_OBJECT(dialog), "nabi-pref-auto-reorder", button); g_signal_connect(G_OBJECT(button), "toggled", G_CALLBACK(on_auto_reorder_button_toggled), NULL); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); button = gtk_check_button_new_with_label(_("Start in hangul mode")); if (strcmp(config->default_input_mode->str, "compose") == 0) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE); else gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), FALSE); gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); g_object_set_data(G_OBJECT(dialog), "nabi-pref-default-input-mode", button); g_signal_connect(G_OBJECT(button), "toggled", G_CALLBACK(on_default_input_mode_button_toggled), NULL); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); button = gtk_check_button_new_with_label(_("Ignore fontset information from the client")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), config->ignore_app_fontset); gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); g_object_set_data(G_OBJECT(dialog), "nabi-pref-ignore-app-fontset", button); g_signal_connect(G_OBJECT(button), "toggled", G_CALLBACK(on_ignore_app_fontset_button_toggled), NULL); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); label = gtk_label_new(_("Input mode scope: ")); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); combo_box = gtk_combo_box_new_text(); gtk_combo_box_insert_text(GTK_COMBO_BOX(combo_box), NABI_INPUT_MODE_PER_DESKTOP, _("per desktop")); gtk_combo_box_insert_text(GTK_COMBO_BOX(combo_box), NABI_INPUT_MODE_PER_APPLICATION, _("per application")); gtk_combo_box_insert_text(GTK_COMBO_BOX(combo_box), NABI_INPUT_MODE_PER_TOPLEVEL, _("per toplevel")); gtk_combo_box_insert_text(GTK_COMBO_BOX(combo_box), NABI_INPUT_MODE_PER_IC, _("per context")); if (strcmp(config->input_mode_scope->str, "per_desktop") == 0) gtk_combo_box_set_active(GTK_COMBO_BOX(combo_box), NABI_INPUT_MODE_PER_DESKTOP); else if (strcmp(config->input_mode_scope->str, "per_application") == 0) gtk_combo_box_set_active(GTK_COMBO_BOX(combo_box), NABI_INPUT_MODE_PER_APPLICATION); else if (strcmp(config->input_mode_scope->str, "per_ic") == 0) gtk_combo_box_set_active(GTK_COMBO_BOX(combo_box), NABI_INPUT_MODE_PER_IC); else gtk_combo_box_set_active(GTK_COMBO_BOX(combo_box), NABI_INPUT_MODE_PER_TOPLEVEL); gtk_box_pack_start(GTK_BOX(hbox), combo_box, FALSE, FALSE, 0); g_object_set_data(G_OBJECT(dialog), "nabi-pref-input-mode-option", combo_box); g_signal_connect(G_OBJECT(combo_box), "changed", G_CALLBACK(on_input_mode_scope_changed), NULL); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); label = gtk_label_new(_("Preedit string font: ")); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); button = gtk_font_button_new_with_font(config->preedit_font->str); gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); g_object_set_data(G_OBJECT(dialog), "nabi-pref-preedit-font", button); g_signal_connect(G_OBJECT(button), "font-set", G_CALLBACK(on_preedit_font_changed), NULL); return page; } static void on_preference_reset(GtkWidget *button, gpointer data) { GObject *dialog = G_OBJECT(data); gpointer p; GtkTreeModel* model; GtkTreeIter iter; GtkTreePath *path; GList* list; const NabiHangulKeyboard* keyboards; int i; // theme p = g_object_get_data(dialog, "nabi-pref-theme"); if (p != NULL) { model = gtk_tree_view_get_model(GTK_TREE_VIEW(p)); path = search_text_in_model(model, THEMES_LIST_NAME, DEFAULT_THEME); if (path != NULL) { gtk_tree_view_set_cursor (GTK_TREE_VIEW(p), path, NULL, FALSE); gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(p), path, NULL, TRUE, 0.5, 0.0); gtk_tree_path_free(path); } } nabi_app_set_theme(DEFAULT_THEME); p = g_object_get_data(dialog, "nabi-pref-use-tray-icon"); if (p != NULL) { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(p), TRUE); } // keyboard p = g_object_get_data(dialog, "nabi-pref-hangul-keyboard"); if (p != NULL) { keyboards = nabi_server_get_hangul_keyboard_list(nabi_server); for (i = 0; keyboards[i].id != NULL; i++) { if (strcmp(keyboards[i].id, DEFAULT_KEYBOARD) == 0) { gtk_combo_box_set_active(GTK_COMBO_BOX(p), i); break; } } } nabi_app_set_hangul_keyboard(DEFAULT_KEYBOARD); p = g_object_get_data(dialog, "nabi-pref-use-system-keymap"); if (p != NULL) { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(p), FALSE); } p = g_object_get_data(dialog, "nabi-pref-latin-keyboard"); if (p != NULL) { i = 0; list = nabi_server->layouts; while (list != NULL) { NabiKeyboardLayout* layout = list->data; if (layout != NULL) { if (strcmp(layout->name, "none") == 0) { gtk_combo_box_set_active(GTK_COMBO_BOX(p), i); break; } } list = g_list_next(list); i++; } } // hangul p = g_object_get_data(dialog, "nabi-pref-trigger-keys"); if (p != NULL) { gtk_list_store_clear(GTK_LIST_STORE(p)); gtk_list_store_append(GTK_LIST_STORE(p), &iter); gtk_list_store_set(GTK_LIST_STORE(p), &iter, 0, "Hangul", -1); gtk_list_store_append(GTK_LIST_STORE(p), &iter); gtk_list_store_set(GTK_LIST_STORE(p), &iter, 0, "Shift+space", -1); } p = g_object_get_data(dialog, "nabi-pref-off-keys"); if (p != NULL) { gtk_list_store_clear(GTK_LIST_STORE(p)); gtk_list_store_append(GTK_LIST_STORE(p), &iter); gtk_list_store_set(GTK_LIST_STORE(p), &iter, 0, "Escape", -1); } // hanja p = g_object_get_data(dialog, "nabi-pref-candidate-font"); if (p != NULL) { candidate_font_button_set_labels(GTK_WIDGET(p), "Sans 14"); } g_string_assign(config->candidate_font, "Sans 14"); p = g_object_get_data(dialog, "nabi-pref-candidate-keys"); if (p != NULL) { gtk_list_store_clear(GTK_LIST_STORE(p)); gtk_list_store_append(GTK_LIST_STORE(p), &iter); gtk_list_store_set(GTK_LIST_STORE(p), &iter, 0, "Hangul_Hanja", -1); gtk_list_store_append(GTK_LIST_STORE(p), &iter); gtk_list_store_set(GTK_LIST_STORE(p), &iter, 0, "F9", -1); } p = g_object_get_data(dialog, "nabi-pref-simplified-chinese"); if (p != NULL) { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(p), FALSE); } // advanced p = g_object_get_data(dialog, "nabi-pref-xim-name"); if (p != NULL) { gtk_entry_set_text(GTK_ENTRY(p), PACKAGE); } p = g_object_get_data(dialog, "nabi-pref-use-dynamic-event-flow"); if (p != NULL) { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(p), TRUE); } p = g_object_get_data(dialog, "nabi-pref-commit-by-word"); if (p != NULL) { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(p), FALSE); } p = g_object_get_data(dialog, "nabi-pref-auto-reorder"); if (p != NULL) { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(p), TRUE); } p = g_object_get_data(dialog, "nabi-pref-default-input-mode"); if (p != NULL) { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(p), FALSE); } p = g_object_get_data(dialog, "nabi-pref-input-mode-option"); if (p != NULL) { gtk_combo_box_set_active(GTK_COMBO_BOX(p), NABI_INPUT_MODE_PER_TOPLEVEL); } p = g_object_get_data(dialog, "nabi-pref-preedit-font"); if (p != NULL) { gtk_font_button_set_font_name(GTK_FONT_BUTTON(p), "Sans 9"); g_signal_emit_by_name(p, "font-set", NULL); } p = g_object_get_data(dialog, "nabi-pref-ignore-app-fonset"); if (p != NULL) { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(p), FALSE); } } static void on_preference_destroy(GtkWidget *dialog, gpointer data) { nabi_app_save_config(); trigger_key_model = NULL; off_key_model = NULL; candidate_key_model = NULL; } static GtkWidget* reset_button_create(void) { GtkWidget *button; GtkWidget *box; GtkWidget *align; GtkWidget *label; GtkWidget *image; gint image_spacing = 3; button = gtk_button_new(); gtk_widget_style_get(GTK_WIDGET(button), "image-spacing", &image_spacing, NULL); box = gtk_hbox_new(FALSE, image_spacing); image = gtk_image_new_from_stock(GTK_STOCK_REFRESH, GTK_ICON_SIZE_BUTTON); gtk_box_pack_start(GTK_BOX(box), image, FALSE, FALSE, 0); label = gtk_label_new_with_mnemonic(_("_Reset")); gtk_label_set_mnemonic_widget(GTK_LABEL(label), button); gtk_box_pack_start(GTK_BOX(box), label, FALSE, FALSE, 0); align = gtk_alignment_new(0.5, 0.5, 0, 0); gtk_container_add(GTK_CONTAINER(button), align); gtk_container_add(GTK_CONTAINER(align), box); return button; } GtkWidget* preference_window_create(void) { GtkWidget *dialog; GtkWidget *vbox; GtkWidget *notebook; GtkWidget *label; GtkWidget *button; GtkWidget *child; GtkWidget *action_area; GList *list; config = nabi->config; dialog = gtk_dialog_new_with_buttons(_("Nabi Preferences"), GTK_WINDOW(nabi->palette), GTK_DIALOG_MODAL | GTK_DIALOG_NO_SEPARATOR, GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, NULL); gtk_container_set_border_width(GTK_CONTAINER(dialog), 6); notebook = gtk_notebook_new(); gtk_container_set_border_width(GTK_CONTAINER(notebook), 6); /* icons */ label = gtk_label_new(_("Tray")); child = create_theme_page(dialog); gtk_notebook_append_page(GTK_NOTEBOOK(notebook), child, label); if (nabi_server != NULL) { /* keyboard */ label = gtk_label_new(_("Keyboard")); child = create_keyboard_page(dialog); gtk_notebook_append_page(GTK_NOTEBOOK(notebook), child, label); /* key */ label = gtk_label_new(_("Hangul")); child = create_hangul_page(dialog); gtk_notebook_append_page(GTK_NOTEBOOK(notebook), child, label); /* candidate */ label = gtk_label_new(_("Hanja")); child = create_candidate_page(dialog); gtk_notebook_append_page(GTK_NOTEBOOK(notebook), child, label); /* advanced */ label = gtk_label_new(_("Advanced")); child = create_advanced_page(dialog); gtk_notebook_append_page(GTK_NOTEBOOK(notebook), child, label); } vbox = GTK_DIALOG(dialog)->vbox; gtk_box_pack_start(GTK_BOX(vbox), notebook, TRUE, TRUE, 0); g_signal_connect(G_OBJECT(dialog), "destroy", G_CALLBACK(on_preference_destroy), NULL); //gtk_window_set_icon(GTK_WINDOW(dialog), default_icon); gtk_window_set_default_size(GTK_WINDOW(dialog), 300, 300); gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_CLOSE); action_area = GTK_DIALOG(dialog)->action_area; gtk_button_box_set_layout(GTK_BUTTON_BOX(action_area), GTK_BUTTONBOX_END); list = gtk_container_get_children(GTK_CONTAINER(action_area)); if (list != NULL) { GList *child = g_list_last(list); if (child != NULL && child->data != NULL) gtk_widget_grab_focus(GTK_WIDGET(child->data)); g_list_free(list); } button = reset_button_create(); gtk_box_pack_end(GTK_BOX(action_area), button, FALSE, FALSE, 0); gtk_button_box_set_child_secondary(GTK_BUTTON_BOX(action_area), button, TRUE); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(on_preference_reset), dialog); gtk_widget_show_all(dialog); return dialog; } nabi-1.0.0/src/handlebox.h0000644000175000017500000000360411655153252012256 00000000000000/* Nabi - X Input Method server for hangul * Copyright (C) 2003-2008 Choe Hwanjin * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #ifndef __NABI_HANDLE_BOX_H__ #define __NABI_HANDLE_BOX_H__ #include G_BEGIN_DECLS #define NABI_TYPE_HANDLE_BOX (nabi_handle_box_get_type ()) #define NABI_HANDLE_BOX(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NABI_TYPE_HANDLE_BOX, NabiHandleBox)) #define NABI_HANDLE_BOX_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NABI_TYPE_HANDLE_BOX, NabiHandleBoxClass)) #define NABI_IS_HANDLE_BOX(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NABI_TYPE_HANDLE_BOX)) #define NABI_IS_HANDLE_BOX_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NABI_TYPE_HANDLE_BOX)) #define NABI_HANDLE_BOX_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NABI_TYPE_HANDLE_BOX, NabiHandleBoxClass)) typedef struct _NabiHandleBox NabiHandleBox; typedef struct _NabiHandleBoxClass NabiHandleBoxClass; struct _NabiHandleBox { GtkWindow parent; }; struct _NabiHandleBoxClass { GtkWindowClass parent_class; }; GType nabi_handle_box_get_type (void) G_GNUC_CONST; GtkWidget* nabi_handle_box_new (void); G_END_DECLS #endif /* __NABI_HANDLE_BOX_H__ */ nabi-1.0.0/src/handlebox.c0000644000175000017500000001415611666336605012264 00000000000000/* Nabi - X Input Method server for hangul * Copyright (C) 2003-2008 Choe Hwanjin * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #ifdef HAVE_CONFIG_H #include #endif #include #include "handlebox.h" #define HANDLE_SIZE 10 static void nabi_handle_box_class_init (NabiHandleBoxClass *klass); static void nabi_handle_box_init (NabiHandleBox *handle_box); static void nabi_handle_box_size_request (GtkWidget *widget, GtkRequisition *requisition); static void nabi_handle_box_size_allocate (GtkWidget *widget, GtkAllocation *real_allocation); static gint nabi_handle_box_expose (GtkWidget *widget, GdkEventExpose *event); static gboolean nabi_handle_box_button_press(GtkWidget *widget, GdkEventButton *event); static void on_realize(GtkWidget *widget, gpointer data); static GtkWindowClass *parent_class = NULL; GType nabi_handle_box_get_type (void) { static GType handle_box_type = 0; if (!handle_box_type) { static const GTypeInfo handle_box_info = { sizeof (NabiHandleBoxClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) nabi_handle_box_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (NabiHandleBox), 0, /* n_preallocs */ (GInstanceInitFunc) nabi_handle_box_init, }; handle_box_type = g_type_register_static (GTK_TYPE_WINDOW, "NabiHandleBox", &handle_box_info, 0); } return handle_box_type; } static void nabi_handle_box_class_init (NabiHandleBoxClass *klass) { GtkWidgetClass *widget_class; parent_class = g_type_class_peek_parent(klass); widget_class = GTK_WIDGET_CLASS(klass); widget_class->size_request = nabi_handle_box_size_request; widget_class->size_allocate = nabi_handle_box_size_allocate; widget_class->expose_event = nabi_handle_box_expose; widget_class->button_press_event = nabi_handle_box_button_press; } static void on_realize(GtkWidget *widget, gpointer data) { if (widget != NULL && widget->window != NULL) { int event_mask = gdk_window_get_events(widget->window); gdk_window_set_events(widget->window, event_mask | GDK_BUTTON_PRESS_MASK); } } static void nabi_handle_box_init (NabiHandleBox *handle_box) { gtk_window_set_type_hint(GTK_WINDOW(handle_box), GDK_WINDOW_TYPE_HINT_TOOLBAR); gtk_window_set_decorated(GTK_WINDOW(handle_box), FALSE); gtk_window_set_skip_pager_hint(GTK_WINDOW(handle_box), TRUE); gtk_window_set_skip_taskbar_hint(GTK_WINDOW(handle_box), TRUE); gtk_window_set_resizable(GTK_WINDOW(handle_box), FALSE); gtk_container_set_border_width(GTK_CONTAINER(handle_box), 1); g_signal_connect(G_OBJECT(handle_box), "realize", G_CALLBACK(on_realize), NULL); } GtkWidget* nabi_handle_box_new (void) { GtkWidget* widget = g_object_new (NABI_TYPE_HANDLE_BOX, NULL); GTK_WINDOW(widget)->type = GTK_WINDOW_TOPLEVEL; return widget; } static void nabi_handle_box_size_request (GtkWidget *widget, GtkRequisition *requisition) { if (GTK_WIDGET_CLASS (parent_class)->size_request) GTK_WIDGET_CLASS (parent_class)->size_request (widget, requisition); requisition->width += HANDLE_SIZE; } static void nabi_handle_box_size_allocate (GtkWidget *widget, GtkAllocation *allocation) { GtkBin* bin; widget->allocation = *allocation; bin = GTK_BIN (widget); if (bin->child && GTK_WIDGET_VISIBLE (bin->child)) { GtkAllocation child_allocation; guint border_width; border_width = GTK_CONTAINER (widget)->border_width; child_allocation.x = border_width; child_allocation.y = border_width; child_allocation.x += HANDLE_SIZE; child_allocation.width = MAX (1, (gint)allocation->width - 2 * border_width); child_allocation.height = MAX (1, (gint)allocation->height - 2 * border_width); child_allocation.width -= HANDLE_SIZE; gtk_widget_size_allocate (bin->child, &child_allocation); } } static void nabi_handle_box_paint (GtkWidget *widget, GdkRectangle *area) { gint width = 0; gint height = 0; GdkRectangle rect; GdkRectangle dest; width = widget->allocation.width; height = widget->allocation.height; rect.x = 0; rect.y = 0; rect.width = width; rect.height = height; if (gdk_rectangle_intersect (area, &rect, &dest)) { gtk_paint_shadow(widget->style, widget->window, GTK_STATE_NORMAL, GTK_SHADOW_OUT, area, widget, "handlebox", 0, 0, width, height); } rect.x = 0; rect.y = 0; rect.width = HANDLE_SIZE; rect.height = height; if (gdk_rectangle_intersect (area, &rect, &dest)) { gtk_paint_handle (widget->style, widget->window, GTK_STATE_NORMAL, GTK_SHADOW_OUT, area, widget, "handlebox", rect.x, rect.y, rect.width, rect.height, GTK_ORIENTATION_VERTICAL); } } static gint nabi_handle_box_expose (GtkWidget *widget, GdkEventExpose *event) { gint ret = FALSE; if (GTK_WIDGET_CLASS (parent_class)->expose_event) ret = GTK_WIDGET_CLASS (parent_class)->expose_event (widget, event); if (GTK_WIDGET_DRAWABLE (widget)) nabi_handle_box_paint (widget, &event->area); return ret; } static gboolean nabi_handle_box_button_press(GtkWidget *widget, GdkEventButton *event) { if (event->button == 1) { gtk_window_begin_move_drag(GTK_WINDOW(widget), event->button, event->x_root, event->y_root, event->time); return TRUE; } return FALSE; } nabi-1.0.0/src/sctc.h0000644000175000017500000031127711655153252011256 00000000000000/* Nabi - X Input Method server for hangul * Copyright (C) 2007-2008 Choe Hwanjin * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ /* data below is from SCIM project and modified for nabi */ const static NabiUnicharPair nabi_sc_to_tc_table[] = { { 0x00a8, 0x2025 },{ 0x2015, 0x2500 },{ 0x2016, 0x2225 },{ 0x2033, 0x301e }, { 0x220f, 0x03a0 },{ 0x2211, 0x03a3 },{ 0x2227, 0xfe3f },{ 0x2228, 0xfe40 }, { 0x2236, 0xfe30 },{ 0x2248, 0x2252 },{ 0x2264, 0x2266 },{ 0x2265, 0x2267 }, { 0x2501, 0x2500 },{ 0x2503, 0x2502 },{ 0x250f, 0x250c },{ 0x2513, 0x2510 }, { 0x2517, 0x2514 },{ 0x251b, 0x2518 },{ 0x2523, 0x251c },{ 0x252b, 0x2524 }, { 0x2533, 0x252c },{ 0x253b, 0x2534 },{ 0x254b, 0x253c },{ 0x30fb, 0x00b7 }, { 0x4e07, 0x842c },{ 0x4e0e, 0x8207 },{ 0x4e11, 0x919c },{ 0x4e13, 0x5c08 }, { 0x4e1a, 0x696d },{ 0x4e1b, 0x53e2 },{ 0x4e1c, 0x6771 },{ 0x4e1d, 0x7d72 }, { 0x4e22, 0x4e1f },{ 0x4e24, 0x5169 },{ 0x4e25, 0x56b4 },{ 0x4e27, 0x55aa }, { 0x4e2a, 0x500b },{ 0x4e2c, 0x723f },{ 0x4e30, 0x8c50 },{ 0x4e34, 0x81e8 }, { 0x4e3a, 0x70ba },{ 0x4e3d, 0x9e97 },{ 0x4e3e, 0x8209 },{ 0x4e48, 0x9ebc }, { 0x4e49, 0x7fa9 },{ 0x4e4c, 0x70cf },{ 0x4e50, 0x6a02 },{ 0x4e54, 0x55ac }, { 0x4e60, 0x7fd2 },{ 0x4e61, 0x9109 },{ 0x4e66, 0x66f8 },{ 0x4e70, 0x8cb7 }, { 0x4e71, 0x4e82 },{ 0x4e89, 0x722d },{ 0x4e8f, 0x8667 },{ 0x4e91, 0x96f2 }, { 0x4e98, 0x4e99 },{ 0x4e9a, 0x4e9e },{ 0x4ea7, 0x7522 },{ 0x4ea9, 0x755d }, { 0x4eb2, 0x89aa },{ 0x4eb5, 0x893b },{ 0x4ebb, 0x4eba },{ 0x4ebf, 0x5104 }, { 0x4ec5, 0x50c5 },{ 0x4ec6, 0x50d5 },{ 0x4ece, 0x5f9e },{ 0x4ed1, 0x4f96 }, { 0x4ed3, 0x5009 },{ 0x4eea, 0x5100 },{ 0x4eec, 0x5011 },{ 0x4ef7, 0x50f9 }, { 0x4f17, 0x773e },{ 0x4f18, 0x512a },{ 0x4f1a, 0x6703 },{ 0x4f1b, 0x50b4 }, { 0x4f1e, 0x5098 },{ 0x4f1f, 0x5049 },{ 0x4f20, 0x50b3 },{ 0x4f24, 0x50b7 }, { 0x4f25, 0x5000 },{ 0x4f26, 0x502b },{ 0x4f27, 0x5096 },{ 0x4f2a, 0x507d }, { 0x4f2b, 0x4f47 },{ 0x4f32, 0x4f60 },{ 0x4f53, 0x9ad4 },{ 0x4f59, 0x9918 }, { 0x4f63, 0x50ad },{ 0x4f65, 0x50c9 },{ 0x4f84, 0x59ea },{ 0x4fa0, 0x4fe0 }, { 0x4fa3, 0x4fb6 },{ 0x4fa5, 0x50e5 },{ 0x4fa6, 0x5075 },{ 0x4fa7, 0x5074 }, { 0x4fa8, 0x50d1 },{ 0x4fa9, 0x5108 },{ 0x4faa, 0x5115 },{ 0x4fac, 0x5102 }, { 0x4fe3, 0x4fc1 },{ 0x4fe6, 0x5114 },{ 0x4fe8, 0x513c },{ 0x4fe9, 0x5006 }, { 0x4fea, 0x5137 },{ 0x4fed, 0x5109 },{ 0x502e, 0x88f8 },{ 0x503a, 0x50b5 }, { 0x503e, 0x50be },{ 0x506c, 0x50af },{ 0x507b, 0x50c2 },{ 0x507e, 0x50e8 }, { 0x507f, 0x511f },{ 0x50a5, 0x513b },{ 0x50a7, 0x5110 },{ 0x50a8, 0x5132 }, { 0x50a9, 0x513a },{ 0x513f, 0x5152 },{ 0x5151, 0x514c },{ 0x5156, 0x5157 }, { 0x515a, 0x9ee8 },{ 0x5170, 0x862d },{ 0x5173, 0x95dc },{ 0x5174, 0x8208 }, { 0x5179, 0x8332 },{ 0x517b, 0x990a },{ 0x517d, 0x7378 },{ 0x5181, 0x56c5 }, { 0x5185, 0x5167 },{ 0x5188, 0x5ca1 },{ 0x518c, 0x518a },{ 0x5199, 0x5beb }, { 0x519b, 0x8ecd },{ 0x519c, 0x8fb2 },{ 0x51a2, 0x585a },{ 0x51af, 0x99ae }, { 0x51b2, 0x885d },{ 0x51b3, 0x6c7a },{ 0x51b5, 0x6cc1 },{ 0x51bb, 0x51cd }, { 0x51c0, 0x6de8 },{ 0x51c4, 0x6dd2 },{ 0x51c6, 0x6e96 },{ 0x51c7, 0x6dde }, { 0x51c9, 0x6dbc },{ 0x51cf, 0x6e1b },{ 0x51d1, 0x6e4a },{ 0x51db, 0x51dc }, { 0x51e0, 0x5e7e },{ 0x51e4, 0x9cf3 },{ 0x51eb, 0x9ce7 },{ 0x51ed, 0x6191 }, { 0x51ef, 0x51f1 },{ 0x51f6, 0x5147 },{ 0x51fb, 0x64ca },{ 0x51fc, 0x5e7d }, { 0x51ff, 0x947f },{ 0x5202, 0x5200 },{ 0x520d, 0x82bb },{ 0x5212, 0x5283 }, { 0x5218, 0x5289 },{ 0x5219, 0x5247 },{ 0x521a, 0x525b },{ 0x521b, 0x5275 }, { 0x5220, 0x522a },{ 0x522b, 0x5225 },{ 0x522d, 0x5244 },{ 0x5239, 0x524e }, { 0x523d, 0x528a },{ 0x523f, 0x528c },{ 0x5240, 0x5274 },{ 0x5242, 0x5291 }, { 0x5250, 0x526e },{ 0x5251, 0x528d },{ 0x5265, 0x525d },{ 0x5267, 0x5287 }, { 0x527f, 0x52e6 },{ 0x529d, 0x52f8 },{ 0x529e, 0x8fa6 },{ 0x52a1, 0x52d9 }, { 0x52a2, 0x52f1 },{ 0x52a8, 0x52d5 },{ 0x52b1, 0x52f5 },{ 0x52b2, 0x52c1 }, { 0x52b3, 0x52de },{ 0x52bf, 0x52e2 },{ 0x52cb, 0x52f3 },{ 0x52d6, 0x52d7 }, { 0x5300, 0x52fb },{ 0x5326, 0x532d },{ 0x532e, 0x5331 },{ 0x533a, 0x5340 }, { 0x533b, 0x91ab },{ 0x534e, 0x83ef },{ 0x534f, 0x5354 },{ 0x5355, 0x55ae }, { 0x5356, 0x8ce3 },{ 0x5360, 0x4f54 },{ 0x5362, 0x76e7 },{ 0x5364, 0x6ef7 }, { 0x5367, 0x81e5 },{ 0x5369, 0x90e8 },{ 0x536b, 0x885b },{ 0x5374, 0x537b }, { 0x537a, 0x5df9 },{ 0x5382, 0x5ee0 },{ 0x5385, 0x5ef3 },{ 0x5386, 0x6b77 }, { 0x5389, 0x53b2 },{ 0x538b, 0x58d3 },{ 0x538c, 0x53ad },{ 0x538d, 0x5399 }, { 0x5395, 0x5ec1 },{ 0x5398, 0x91d0 },{ 0x53a2, 0x5ec2 },{ 0x53a3, 0x53b4 }, { 0x53a6, 0x5ec8 },{ 0x53a8, 0x5eda },{ 0x53a9, 0x5ec4 },{ 0x53ae, 0x5edd }, { 0x53b6, 0x79c1 },{ 0x53bf, 0x7e23 },{ 0x53c1, 0x53c3 },{ 0x53c2, 0x53c3 }, { 0x53cc, 0x96d9 },{ 0x53d1, 0x767c },{ 0x53d8, 0x8b8a },{ 0x53d9, 0x6558 }, { 0x53e0, 0x758a },{ 0x53f6, 0x8449 },{ 0x53f7, 0x865f },{ 0x53f9, 0x5606 }, { 0x53fd, 0x5630 },{ 0x5401, 0x7c72 },{ 0x540e, 0x5f8c },{ 0x5413, 0x5687 }, { 0x5415, 0x5442 },{ 0x5417, 0x55ce },{ 0x5428, 0x5678 },{ 0x542c, 0x807d }, { 0x542f, 0x555f },{ 0x5434, 0x5433 },{ 0x5450, 0x5436 },{ 0x5452, 0x5638 }, { 0x5453, 0x56c8 },{ 0x5455, 0x5614 },{ 0x5456, 0x56a6 },{ 0x5457, 0x5504 }, { 0x5458, 0x54e1 },{ 0x5459, 0x54bc },{ 0x545b, 0x55c6 },{ 0x545c, 0x55da }, { 0x5468, 0x9031 },{ 0x548f, 0x8a60 },{ 0x5499, 0x56a8 },{ 0x549b, 0x5680 }, { 0x54b8, 0x9e79 },{ 0x54cc, 0x5471 },{ 0x54cd, 0x97ff },{ 0x54d1, 0x555e }, { 0x54d2, 0x5660 },{ 0x54d3, 0x5635 },{ 0x54d4, 0x55f6 },{ 0x54d5, 0x5666 }, { 0x54d7, 0x5629 },{ 0x54d9, 0x5672 },{ 0x54dc, 0x568c },{ 0x54dd, 0x5665 }, { 0x54df, 0x55b2 },{ 0x551b, 0x561c },{ 0x5520, 0x562e },{ 0x5522, 0x55e9 }, { 0x5524, 0x559a },{ 0x5567, 0x5616 },{ 0x556c, 0x55c7 },{ 0x556d, 0x56c0 }, { 0x556e, 0x56d3 },{ 0x5578, 0x562f },{ 0x55b7, 0x5674 },{ 0x55bd, 0x560d }, { 0x55be, 0x56b3 },{ 0x55eb, 0x56c1 },{ 0x55ec, 0x5475 },{ 0x55f3, 0x566f }, { 0x5618, 0x5653 },{ 0x5624, 0x56b6 },{ 0x5631, 0x56d1 },{ 0x565c, 0x5695 }, { 0x56a3, 0x56c2 },{ 0x56e2, 0x5718 },{ 0x56ed, 0x5712 },{ 0x56f1, 0x56ea }, { 0x56f4, 0x570d },{ 0x56f5, 0x5707 },{ 0x56fd, 0x570b },{ 0x56fe, 0x5716 }, { 0x5706, 0x5713 },{ 0x5723, 0x8056 },{ 0x5739, 0x58d9 },{ 0x573a, 0x5834 }, { 0x5742, 0x962a },{ 0x574f, 0x58de },{ 0x5757, 0x584a },{ 0x575a, 0x5805 }, { 0x575b, 0x58c7 },{ 0x575c, 0x58e2 },{ 0x575d, 0x58e9 },{ 0x575e, 0x5862 }, { 0x575f, 0x58b3 },{ 0x5760, 0x589c },{ 0x5784, 0x58df },{ 0x5785, 0x58df }, { 0x5786, 0x58da },{ 0x5792, 0x58d8 },{ 0x57a6, 0x58be },{ 0x57a9, 0x580a }, { 0x57ab, 0x588a },{ 0x57ad, 0x57e1 },{ 0x57b2, 0x584f },{ 0x57d8, 0x5852 }, { 0x57d9, 0x58ce },{ 0x57da, 0x581d },{ 0x5811, 0x5879 },{ 0x5815, 0x58ae }, { 0x5892, 0x5891 },{ 0x5899, 0x7246 },{ 0x58ee, 0x58ef },{ 0x58f0, 0x8072 }, { 0x58f3, 0x6bbc },{ 0x58f6, 0x58fa },{ 0x5904, 0x8655 },{ 0x5907, 0x5099 }, { 0x590d, 0x5fa9 },{ 0x591f, 0x5920 },{ 0x5934, 0x982d },{ 0x5938, 0x8a87 }, { 0x5939, 0x593e },{ 0x593a, 0x596a },{ 0x5941, 0x5969 },{ 0x5942, 0x5950 }, { 0x594b, 0x596e },{ 0x5956, 0x734e },{ 0x5965, 0x5967 },{ 0x5986, 0x599d }, { 0x5987, 0x5a66 },{ 0x5988, 0x5abd },{ 0x59a9, 0x5af5 },{ 0x59aa, 0x5ad7 }, { 0x59ab, 0x5aaf },{ 0x59d7, 0x59cd },{ 0x5a04, 0x5a41 },{ 0x5a05, 0x5a6d }, { 0x5a06, 0x5b08 },{ 0x5a07, 0x5b0c },{ 0x5a08, 0x5b4c },{ 0x5a31, 0x5a1b }, { 0x5a32, 0x5aa7 },{ 0x5a34, 0x5afb },{ 0x5a74, 0x5b30 },{ 0x5a75, 0x5b0b }, { 0x5a76, 0x5b38 },{ 0x5aaa, 0x5abc },{ 0x5ad2, 0x5b21 },{ 0x5ad4, 0x5b2a }, { 0x5af1, 0x5b19 },{ 0x5b37, 0x5b24 },{ 0x5b59, 0x5b6b },{ 0x5b66, 0x5b78 }, { 0x5b6a, 0x5b7f },{ 0x5b81, 0x5be7 },{ 0x5b9d, 0x5bf6 },{ 0x5b9e, 0x5be6 }, { 0x5ba0, 0x5bf5 },{ 0x5ba1, 0x5be9 },{ 0x5baa, 0x61b2 },{ 0x5bab, 0x5bae }, { 0x5bbd, 0x5bec },{ 0x5bbe, 0x8cd3 },{ 0x5bdd, 0x5be2 },{ 0x5bf9, 0x5c0d }, { 0x5bfb, 0x5c0b },{ 0x5bfc, 0x5c0e },{ 0x5bff, 0x58fd },{ 0x5c06, 0x5c07 }, { 0x5c14, 0x723e },{ 0x5c18, 0x5875 },{ 0x5c1c, 0x560e },{ 0x5c1d, 0x5617 }, { 0x5c27, 0x582f },{ 0x5c34, 0x5c37 },{ 0x5c38, 0x5c4d },{ 0x5c3d, 0x76e1 }, { 0x5c42, 0x5c64 },{ 0x5c49, 0x5c5c },{ 0x5c4a, 0x5c46 },{ 0x5c5e, 0x5c6c }, { 0x5c61, 0x5c62 },{ 0x5c66, 0x5c68 },{ 0x5c7f, 0x5dbc },{ 0x5c81, 0x6b72 }, { 0x5c82, 0x8c48 },{ 0x5c96, 0x5d87 },{ 0x5c97, 0x5d17 },{ 0x5c98, 0x5cf4 }, { 0x5c9a, 0x5d50 },{ 0x5c9b, 0x5cf6 },{ 0x5cad, 0x5dba },{ 0x5cbd, 0x5d20 }, { 0x5cbf, 0x5dcb },{ 0x5cc4, 0x5da7 },{ 0x5ce1, 0x5cfd },{ 0x5ce4, 0x5da0 }, { 0x5ce5, 0x5d22 },{ 0x5ce6, 0x5dd2 },{ 0x5d02, 0x5d97 },{ 0x5d03, 0x5d0d }, { 0x5d2d, 0x5d84 },{ 0x5d58, 0x5db8 },{ 0x5d5b, 0x5d33 },{ 0x5d5d, 0x5d81 }, { 0x5dc5, 0x5dd4 },{ 0x5de9, 0x978f },{ 0x5def, 0x5df0 },{ 0x5e01, 0x5e63 }, { 0x5e05, 0x5e25 },{ 0x5e08, 0x5e2b },{ 0x5e0f, 0x5e43 },{ 0x5e10, 0x5e33 }, { 0x5e18, 0x7c3e },{ 0x5e1c, 0x5e5f },{ 0x5e26, 0x5e36 },{ 0x5e27, 0x5e40 }, { 0x5e2e, 0x5e6b },{ 0x5e31, 0x5e6c },{ 0x5e3b, 0x5e58 },{ 0x5e3c, 0x5e57 }, { 0x5e42, 0x51aa },{ 0x5e72, 0x5e79 },{ 0x5e76, 0x4e26 },{ 0x5e7a, 0x4e48 }, { 0x5e7f, 0x5ee3 },{ 0x5e84, 0x838a },{ 0x5e86, 0x6176 },{ 0x5e90, 0x5eec }, { 0x5e91, 0x5ee1 },{ 0x5e93, 0x5eab },{ 0x5e94, 0x61c9 },{ 0x5e99, 0x5edf }, { 0x5e9e, 0x9f90 },{ 0x5e9f, 0x5ee2 },{ 0x5eea, 0x5ee9 },{ 0x5f00, 0x958b }, { 0x5f02, 0x7570 },{ 0x5f03, 0x68c4 },{ 0x5f11, 0x5f12 },{ 0x5f20, 0x5f35 }, { 0x5f25, 0x5f4c },{ 0x5f2a, 0x5f33 },{ 0x5f2f, 0x5f4e },{ 0x5f39, 0x5f48 }, { 0x5f3a, 0x5f37 },{ 0x5f52, 0x6b78 },{ 0x5f53, 0x7576 },{ 0x5f55, 0x9304 }, { 0x5f66, 0x5f65 },{ 0x5f7b, 0x5fb9 },{ 0x5f84, 0x5f91 },{ 0x5f95, 0x5fa0 }, { 0x5fa1, 0x79a6 },{ 0x5fc4, 0x5fc3 },{ 0x5fc6, 0x61b6 },{ 0x5fcf, 0x61fa }, { 0x5fe7, 0x6182 },{ 0x5ffe, 0x613e },{ 0x6000, 0x61f7 },{ 0x6001, 0x614b }, { 0x6002, 0x616b },{ 0x6003, 0x61ae },{ 0x6004, 0x616a },{ 0x6005, 0x60b5 }, { 0x6006, 0x6134 },{ 0x601c, 0x6190 },{ 0x603b, 0x7e3d },{ 0x603c, 0x61df }, { 0x603f, 0x61cc },{ 0x604b, 0x6200 },{ 0x6052, 0x6046 },{ 0x6073, 0x61c7 }, { 0x6076, 0x60e1 },{ 0x6078, 0x615f },{ 0x6079, 0x61e8 },{ 0x607a, 0x6137 }, { 0x607b, 0x60fb },{ 0x607c, 0x60f1 },{ 0x607d, 0x60f2 },{ 0x60a6, 0x6085 }, { 0x60ab, 0x6128 },{ 0x60ac, 0x61f8 },{ 0x60ad, 0x6173 },{ 0x60af, 0x61ab }, { 0x60ca, 0x9a5a },{ 0x60e7, 0x61fc },{ 0x60e8, 0x6158 },{ 0x60e9, 0x61f2 }, { 0x60eb, 0x618a },{ 0x60ec, 0x611c },{ 0x60ed, 0x615a },{ 0x60ee, 0x619a }, { 0x60ef, 0x6163 },{ 0x6120, 0x614d },{ 0x6124, 0x61a4 },{ 0x6126, 0x6192 }, { 0x613f, 0x9858 },{ 0x6151, 0x61fe },{ 0x61d1, 0x61e3 },{ 0x61d2, 0x61f6 }, { 0x61d4, 0x61cd },{ 0x6206, 0x6207 },{ 0x620b, 0x6214 },{ 0x620f, 0x6232 }, { 0x6217, 0x6227 },{ 0x6218, 0x6230 },{ 0x622c, 0x6229 },{ 0x6237, 0x6236 }, { 0x624c, 0x624b },{ 0x6251, 0x64b2 },{ 0x6258, 0x8a17 },{ 0x6267, 0x57f7 }, { 0x6269, 0x64f4 },{ 0x626a, 0x636b },{ 0x626b, 0x6383 },{ 0x626c, 0x63da }, { 0x6270, 0x64fe },{ 0x629a, 0x64ab },{ 0x629b, 0x62cb },{ 0x629f, 0x6476 }, { 0x62a0, 0x6473 },{ 0x62a1, 0x6384 },{ 0x62a2, 0x6436 },{ 0x62a4, 0x8b77 }, { 0x62a5, 0x5831 },{ 0x62c5, 0x64d4 },{ 0x62df, 0x64ec },{ 0x62e2, 0x650f }, { 0x62e3, 0x63c0 },{ 0x62e5, 0x64c1 },{ 0x62e6, 0x6514 },{ 0x62e7, 0x64f0 }, { 0x62e8, 0x64a5 },{ 0x62e9, 0x64c7 },{ 0x6302, 0x639b },{ 0x631a, 0x646f }, { 0x631b, 0x6523 },{ 0x631d, 0x64be },{ 0x631e, 0x64bb },{ 0x631f, 0x633e }, { 0x6320, 0x6493 },{ 0x6321, 0x64cb },{ 0x6322, 0x649f },{ 0x6323, 0x6399 }, { 0x6324, 0x64e0 },{ 0x6325, 0x63ee },{ 0x6342, 0x6440 },{ 0x635e, 0x6488 }, { 0x635f, 0x640d },{ 0x6361, 0x64bf },{ 0x6362, 0x63db },{ 0x6363, 0x6417 }, { 0x636e, 0x64da },{ 0x63b3, 0x64c4 },{ 0x63b4, 0x6451 },{ 0x63b7, 0x64f2 }, { 0x63b8, 0x64a2 },{ 0x63ba, 0x647b },{ 0x63bc, 0x645c },{ 0x63fd, 0x652c }, { 0x63ff, 0x64b3 },{ 0x6400, 0x6519 },{ 0x6401, 0x64f1 },{ 0x6402, 0x645f }, { 0x6405, 0x652a },{ 0x643a, 0x651c },{ 0x6444, 0x651d },{ 0x6445, 0x6504 }, { 0x6446, 0x64fa },{ 0x6447, 0x6416 },{ 0x6448, 0x64ef },{ 0x644a, 0x6524 }, { 0x6484, 0x6516 },{ 0x6491, 0x6490 },{ 0x64b5, 0x6506 },{ 0x64b7, 0x64f7 }, { 0x64b8, 0x64fc },{ 0x64ba, 0x651b },{ 0x64c0, 0x641f },{ 0x64de, 0x64fb }, { 0x6512, 0x6522 },{ 0x6534, 0x64b2 },{ 0x654c, 0x6575 },{ 0x655b, 0x6582 }, { 0x6570, 0x6578 },{ 0x658b, 0x9f4b },{ 0x6593, 0x6595 },{ 0x6597, 0x9b25 }, { 0x65a9, 0x65ac },{ 0x65ad, 0x65b7 },{ 0x65e0, 0x7121 },{ 0x65e7, 0x820a }, { 0x65f6, 0x6642 },{ 0x65f7, 0x66e0 },{ 0x6619, 0x66c7 },{ 0x6635, 0x66b1 }, { 0x663c, 0x665d },{ 0x663e, 0x986f },{ 0x664b, 0x6649 },{ 0x6652, 0x66ec }, { 0x6653, 0x66c9 },{ 0x6654, 0x66c4 },{ 0x6655, 0x6688 },{ 0x6656, 0x6689 }, { 0x6682, 0x66ab },{ 0x66a7, 0x66d6 },{ 0x6710, 0x80ca },{ 0x672f, 0x8853 }, { 0x6734, 0x6a38 },{ 0x673a, 0x6a5f },{ 0x6740, 0x6bba },{ 0x6742, 0x96dc }, { 0x6743, 0x6b0a },{ 0x6746, 0x687f },{ 0x6760, 0x69d3 },{ 0x6761, 0x689d }, { 0x6765, 0x4f86 },{ 0x6768, 0x694a },{ 0x6769, 0x69aa },{ 0x6770, 0x5091 }, { 0x677e, 0x9b06 },{ 0x6781, 0x6975 },{ 0x6784, 0x69cb },{ 0x679e, 0x6a05 }, { 0x67a2, 0x6a1e },{ 0x67a3, 0x68d7 },{ 0x67a5, 0x6aea },{ 0x67a8, 0x68d6 }, { 0x67aa, 0x69cd },{ 0x67ab, 0x6953 },{ 0x67ad, 0x689f },{ 0x67dc, 0x6ac3 }, { 0x67e0, 0x6ab8 },{ 0x67fd, 0x6a89 },{ 0x6800, 0x6894 },{ 0x6805, 0x67f5 }, { 0x6807, 0x6a19 },{ 0x6808, 0x68e7 },{ 0x6809, 0x6adb },{ 0x680a, 0x6af3 }, { 0x680b, 0x68df },{ 0x680c, 0x6ae8 },{ 0x680e, 0x6adf },{ 0x680f, 0x6b04 }, { 0x6811, 0x6a39 },{ 0x6816, 0x68f2 },{ 0x6837, 0x6a23 },{ 0x683e, 0x6b12 }, { 0x6860, 0x690f },{ 0x6861, 0x6a48 },{ 0x6862, 0x6968 },{ 0x6863, 0x6a94 }, { 0x6864, 0x69bf },{ 0x6865, 0x6a4b },{ 0x6866, 0x6a3a },{ 0x6867, 0x6a9c }, { 0x6868, 0x69f3 },{ 0x6869, 0x6a01 },{ 0x68a6, 0x5922 },{ 0x68c0, 0x6aa2 }, { 0x68c2, 0x6afa },{ 0x68f0, 0x7ba0 },{ 0x68f1, 0x7a1c },{ 0x6901, 0x69e8 }, { 0x691f, 0x6add },{ 0x6920, 0x69e7 },{ 0x6924, 0x6b0f },{ 0x692d, 0x6a62 }, { 0x697c, 0x6a13 },{ 0x6984, 0x6b16 },{ 0x6987, 0x6aec },{ 0x6988, 0x6ada }, { 0x6989, 0x6af8 },{ 0x6998, 0x77e9 },{ 0x69db, 0x6abb },{ 0x69df, 0x6ab3 }, { 0x69e0, 0x6ae7 },{ 0x6a2a, 0x6a6b },{ 0x6a2f, 0x6aa3 },{ 0x6a31, 0x6afb }, { 0x6a65, 0x6aeb },{ 0x6a71, 0x6ae5 },{ 0x6a79, 0x6ad3 },{ 0x6a7c, 0x6ade }, { 0x6a90, 0x7c37 },{ 0x6aa9, 0x6a81 },{ 0x6b22, 0x6b61 },{ 0x6b24, 0x6b5f }, { 0x6b27, 0x6b50 },{ 0x6b7c, 0x6bb2 },{ 0x6b81, 0x6b7f },{ 0x6b87, 0x6ba4 }, { 0x6b8b, 0x6b98 },{ 0x6b92, 0x6b9e },{ 0x6b93, 0x6bae },{ 0x6b9a, 0x6bab }, { 0x6ba1, 0x6baf },{ 0x6bb4, 0x6bc6 },{ 0x6bc1, 0x6bc0 },{ 0x6bc2, 0x8f42 }, { 0x6bd5, 0x7562 },{ 0x6bd9, 0x6583 },{ 0x6be1, 0x6c08 },{ 0x6bf5, 0x6bff }, { 0x6c07, 0x6c0c },{ 0x6c14, 0x6c23 },{ 0x6c22, 0x6c2b },{ 0x6c29, 0x6c2c }, { 0x6c32, 0x6c33 },{ 0x6c35, 0x6c34 },{ 0x6c3d, 0x6c46 },{ 0x6c47, 0x532f }, { 0x6c49, 0x6f22 },{ 0x6c64, 0x6e6f },{ 0x6c79, 0x6d36 },{ 0x6c9f, 0x6e9d }, { 0x6ca1, 0x6c92 },{ 0x6ca3, 0x7043 },{ 0x6ca4, 0x6f1a },{ 0x6ca5, 0x701d }, { 0x6ca6, 0x6dea },{ 0x6ca7, 0x6ec4 },{ 0x6ca9, 0x6e88 },{ 0x6caa, 0x6eec }, { 0x6cb2, 0x6cb1 },{ 0x6cc4, 0x6d29 },{ 0x6cde, 0x6fd8 },{ 0x6cea, 0x6dda }, { 0x6cf6, 0x6fa9 },{ 0x6cf7, 0x7027 },{ 0x6cf8, 0x7018 },{ 0x6cfa, 0x6ffc }, { 0x6cfb, 0x7009 },{ 0x6cfc, 0x6f51 },{ 0x6cfd, 0x6fa4 },{ 0x6cfe, 0x6d87 }, { 0x6d01, 0x6f54 },{ 0x6d12, 0x7051 },{ 0x6d3c, 0x7aaa },{ 0x6d43, 0x6d79 }, { 0x6d45, 0x6dfa },{ 0x6d46, 0x6f3f },{ 0x6d47, 0x6f86 },{ 0x6d48, 0x6e5e }, { 0x6d4a, 0x6fc1 },{ 0x6d4b, 0x6e2c },{ 0x6d4d, 0x6fae },{ 0x6d4e, 0x6fdf }, { 0x6d4f, 0x700f },{ 0x6d51, 0x6e3e },{ 0x6d52, 0x6ef8 },{ 0x6d53, 0x6fc3 }, { 0x6d54, 0x6f6f },{ 0x6d5c, 0x6ff1 },{ 0x6d82, 0x5857 },{ 0x6d8c, 0x6e67 }, { 0x6d9b, 0x6fe4 },{ 0x6d9d, 0x6f87 },{ 0x6d9e, 0x6df6 },{ 0x6d9f, 0x6f23 }, { 0x6da0, 0x6f7f },{ 0x6da1, 0x6e26 },{ 0x6da3, 0x6e19 },{ 0x6da4, 0x6ecc }, { 0x6da6, 0x6f64 },{ 0x6da7, 0x6f97 },{ 0x6da8, 0x6f32 },{ 0x6da9, 0x6f80 }, { 0x6dc0, 0x6fb1 },{ 0x6e0a, 0x6df5 },{ 0x6e0c, 0x6de5 },{ 0x6e0d, 0x6f2c }, { 0x6e0e, 0x7006 },{ 0x6e10, 0x6f38 },{ 0x6e11, 0x6fa0 },{ 0x6e14, 0x6f01 }, { 0x6e16, 0x700b },{ 0x6e17, 0x6ef2 },{ 0x6e29, 0x6eab },{ 0x6e38, 0x904a }, { 0x6e7e, 0x7063 },{ 0x6e7f, 0x6fd5 },{ 0x6e83, 0x6f70 },{ 0x6e85, 0x6ffa }, { 0x6e86, 0x6f35 },{ 0x6ed7, 0x6f77 },{ 0x6eda, 0x6efe },{ 0x6ede, 0x6eef }, { 0x6edf, 0x7069 },{ 0x6ee0, 0x7044 },{ 0x6ee1, 0x6eff },{ 0x6ee2, 0x7005 }, { 0x6ee4, 0x6ffe },{ 0x6ee5, 0x6feb },{ 0x6ee6, 0x7064 },{ 0x6ee8, 0x6ff1 }, { 0x6ee9, 0x7058 },{ 0x6f46, 0x7020 },{ 0x6f47, 0x701f },{ 0x6f4b, 0x7032 }, { 0x6f4d, 0x6ff0 },{ 0x6f5c, 0x6f5b },{ 0x6f74, 0x7026 },{ 0x6f9c, 0x703e }, { 0x6fd1, 0x7028 },{ 0x6fd2, 0x7015 },{ 0x704f, 0x705d },{ 0x706c, 0x706b }, { 0x706d, 0x6ec5 },{ 0x706f, 0x71c8 },{ 0x7075, 0x9748 },{ 0x707e, 0x707d }, { 0x707f, 0x71e6 },{ 0x7080, 0x716c },{ 0x7089, 0x7210 },{ 0x7096, 0x71c9 }, { 0x709c, 0x7152 },{ 0x709d, 0x7197 },{ 0x70ae, 0x7832 },{ 0x70b9, 0x9ede }, { 0x70bc, 0x934a },{ 0x70bd, 0x71be },{ 0x70c1, 0x720d },{ 0x70c2, 0x721b }, { 0x70c3, 0x70f4 },{ 0x70db, 0x71ed },{ 0x70df, 0x7159 },{ 0x70e6, 0x7169 }, { 0x70e7, 0x71d2 },{ 0x70e8, 0x71c1 },{ 0x70e9, 0x71f4 },{ 0x70eb, 0x71d9 }, { 0x70ec, 0x71fc },{ 0x70ed, 0x71b1 },{ 0x7115, 0x7165 },{ 0x7116, 0x71dc }, { 0x7118, 0x71fe },{ 0x7130, 0x71c4 },{ 0x7145, 0x935b },{ 0x718f, 0x71fb }, { 0x7231, 0x611b },{ 0x7237, 0x723a },{ 0x724d, 0x7258 },{ 0x7266, 0x729b }, { 0x7275, 0x727d },{ 0x727a, 0x72a7 },{ 0x728a, 0x72a2 },{ 0x72ad, 0x72ac }, { 0x72b6, 0x72c0 },{ 0x72b7, 0x7377 },{ 0x72b9, 0x7336 },{ 0x72c8, 0x72fd }, { 0x72de, 0x7370 },{ 0x72ec, 0x7368 },{ 0x72ed, 0x72f9 },{ 0x72ee, 0x7345 }, { 0x72ef, 0x736a },{ 0x72f0, 0x7319 },{ 0x72f1, 0x7344 },{ 0x72f2, 0x733b }, { 0x7303, 0x736b },{ 0x730e, 0x7375 },{ 0x7315, 0x737c },{ 0x7321, 0x7380 }, { 0x732a, 0x8c6c },{ 0x732b, 0x8c93 },{ 0x732c, 0x875f },{ 0x732e, 0x737b }, { 0x736d, 0x737a },{ 0x7391, 0x74a3 },{ 0x739b, 0x746a },{ 0x73ae, 0x744b }, { 0x73af, 0x74b0 },{ 0x73b0, 0x73fe },{ 0x73ba, 0x74bd },{ 0x73c9, 0x739f }, { 0x73cf, 0x73a8 },{ 0x73d0, 0x743a },{ 0x73d1, 0x74cf },{ 0x73f2, 0x743f }, { 0x740f, 0x7489 },{ 0x7410, 0x7463 },{ 0x743c, 0x74ca },{ 0x7476, 0x7464 }, { 0x7477, 0x74a6 },{ 0x748e, 0x74d4 },{ 0x74d2, 0x74da },{ 0x74ee, 0x7515 }, { 0x74ef, 0x750c },{ 0x7535, 0x96fb },{ 0x753b, 0x756b },{ 0x7545, 0x66a2 }, { 0x7572, 0x756c },{ 0x7574, 0x7587 },{ 0x7596, 0x7664 },{ 0x7597, 0x7642 }, { 0x759f, 0x7627 },{ 0x75a0, 0x7658 },{ 0x75a1, 0x760d },{ 0x75ae, 0x7621 }, { 0x75af, 0x760b },{ 0x75b1, 0x76b0 },{ 0x75b4, 0x75fe },{ 0x75c8, 0x7670 }, { 0x75c9, 0x75d9 },{ 0x75d2, 0x7662 },{ 0x75e8, 0x7646 },{ 0x75ea, 0x7613 }, { 0x75eb, 0x7647 },{ 0x75f4, 0x7661 },{ 0x75f9, 0x75fa },{ 0x7605, 0x7649 }, { 0x7617, 0x761e },{ 0x7618, 0x763a },{ 0x762a, 0x765f },{ 0x762b, 0x7671 }, { 0x763e, 0x766e },{ 0x763f, 0x766d },{ 0x765e, 0x7669 },{ 0x7663, 0x766c }, { 0x766b, 0x7672 },{ 0x7691, 0x769a },{ 0x76b1, 0x76ba },{ 0x76b2, 0x76b8 }, { 0x76cf, 0x76de },{ 0x76d0, 0x9e7d },{ 0x76d1, 0x76e3 },{ 0x76d6, 0x84cb }, { 0x76d7, 0x76dc },{ 0x76d8, 0x76e4 },{ 0x7726, 0x7725 },{ 0x772f, 0x7787 }, { 0x7740, 0x8457 },{ 0x7741, 0x775c },{ 0x7750, 0x775e },{ 0x7751, 0x77bc }, { 0x777e, 0x776a },{ 0x777f, 0x53e1 },{ 0x7792, 0x779e },{ 0x77a9, 0x77da }, { 0x77eb, 0x77ef },{ 0x77f6, 0x78ef },{ 0x77fe, 0x792c },{ 0x77ff, 0x7926 }, { 0x7800, 0x78ad },{ 0x7801, 0x78bc },{ 0x7816, 0x78da },{ 0x7817, 0x7868 }, { 0x781a, 0x786f },{ 0x783a, 0x792a },{ 0x783b, 0x7931 },{ 0x783e, 0x792b }, { 0x7840, 0x790e },{ 0x7855, 0x78a9 },{ 0x7856, 0x7864 },{ 0x7857, 0x78fd }, { 0x786e, 0x78ba },{ 0x7877, 0x9e7c },{ 0x788d, 0x7919 },{ 0x789b, 0x78e7 }, { 0x789c, 0x78e3 },{ 0x78b1, 0x583f },{ 0x7934, 0x7921 },{ 0x793b, 0x793a }, { 0x793c, 0x79ae },{ 0x795b, 0x88aa },{ 0x7962, 0x79b0 },{ 0x796f, 0x798e }, { 0x7977, 0x79b1 },{ 0x7978, 0x798d },{ 0x7980, 0x7a1f },{ 0x7984, 0x797f }, { 0x7985, 0x79aa },{ 0x79bb, 0x96e2 },{ 0x79c3, 0x79bf },{ 0x79c6, 0x7a08 }, { 0x79cd, 0x7a2e },{ 0x79ef, 0x7a4d },{ 0x79f0, 0x7a31 },{ 0x79fd, 0x7a62 }, { 0x7a0e, 0x7a05 },{ 0x7a23, 0x7a4c },{ 0x7a33, 0x7a69 },{ 0x7a51, 0x7a61 }, { 0x7a77, 0x7aae },{ 0x7a83, 0x7aca },{ 0x7a8d, 0x7ac5 },{ 0x7a91, 0x7aaf }, { 0x7a9c, 0x7ac4 },{ 0x7a9d, 0x7aa9 },{ 0x7aa5, 0x7aba },{ 0x7aa6, 0x7ac7 }, { 0x7aad, 0x7ab6 },{ 0x7ad6, 0x8c4e },{ 0x7ade, 0x7af6 },{ 0x7b03, 0x7be4 }, { 0x7b0b, 0x7b4d },{ 0x7b14, 0x7b46 },{ 0x7b15, 0x7b67 },{ 0x7b3a, 0x7b8b }, { 0x7b3c, 0x7c60 },{ 0x7b3e, 0x7c69 },{ 0x7b47, 0x7b3b },{ 0x7b51, 0x7bc9 }, { 0x7b5a, 0x7bf3 },{ 0x7b5b, 0x7be9 },{ 0x7b5d, 0x7b8f },{ 0x7b71, 0x7be0 }, { 0x7b79, 0x7c4c },{ 0x7b7e, 0x7c3d },{ 0x7b80, 0x7c21 },{ 0x7ba6, 0x7c00 }, { 0x7ba7, 0x7bcb },{ 0x7ba8, 0x7c5c },{ 0x7ba9, 0x7c6e },{ 0x7baa, 0x7c1e }, { 0x7bab, 0x7c2b },{ 0x7bd1, 0x7c23 },{ 0x7bd3, 0x7c0d },{ 0x7bee, 0x7c43 }, { 0x7bf1, 0x7c6c },{ 0x7c16, 0x7c6a },{ 0x7c41, 0x7c5f },{ 0x7c74, 0x7cf4 }, { 0x7c7b, 0x985e },{ 0x7c7c, 0x79c8 },{ 0x7c9c, 0x7cf6 },{ 0x7c9d, 0x7cf2 }, { 0x7ca4, 0x7cb5 },{ 0x7caa, 0x7cde },{ 0x7cae, 0x7ce7 },{ 0x7cc1, 0x7cdd }, { 0x7cc7, 0x9931 },{ 0x7ccd, 0x9908 },{ 0x7d27, 0x7dca },{ 0x7d77, 0x7e36 }, { 0x7e9f, 0x7d72 },{ 0x7ea0, 0x7cfe },{ 0x7ea1, 0x7d06 },{ 0x7ea2, 0x7d05 }, { 0x7ea3, 0x7d02 },{ 0x7ea4, 0x7e96 },{ 0x7ea5, 0x7d07 },{ 0x7ea6, 0x7d04 }, { 0x7ea7, 0x7d1a },{ 0x7ea8, 0x7d08 },{ 0x7ea9, 0x7e8a },{ 0x7eaa, 0x7d00 }, { 0x7eab, 0x7d09 },{ 0x7eac, 0x7def },{ 0x7ead, 0x7d1c },{ 0x7eaf, 0x7d14 }, { 0x7eb0, 0x7d15 },{ 0x7eb1, 0x7d17 },{ 0x7eb2, 0x7db1 },{ 0x7eb3, 0x7d0d }, { 0x7eb5, 0x7e31 },{ 0x7eb6, 0x7db8 },{ 0x7eb7, 0x7d1b },{ 0x7eb8, 0x7d19 }, { 0x7eb9, 0x7d0b },{ 0x7eba, 0x7d21 },{ 0x7ebd, 0x7d10 },{ 0x7ebe, 0x7d13 }, { 0x7ebf, 0x7dda },{ 0x7ec0, 0x7d3a },{ 0x7ec1, 0x7d32 },{ 0x7ec2, 0x7d31 }, { 0x7ec3, 0x7df4 },{ 0x7ec4, 0x7d44 },{ 0x7ec5, 0x7d33 },{ 0x7ec6, 0x7d30 }, { 0x7ec7, 0x7e54 },{ 0x7ec8, 0x7d42 },{ 0x7ec9, 0x7e10 },{ 0x7eca, 0x7d46 }, { 0x7ecb, 0x7d3c },{ 0x7ecc, 0x7d40 },{ 0x7ecd, 0x7d39 },{ 0x7ece, 0x7e79 }, { 0x7ecf, 0x7d93 },{ 0x7ed0, 0x7d3f },{ 0x7ed1, 0x7d81 },{ 0x7ed2, 0x7d68 }, { 0x7ed3, 0x7d50 },{ 0x7ed4, 0x8932 },{ 0x7ed5, 0x7e5e },{ 0x7ed7, 0x7d4e }, { 0x7ed8, 0x7e6a },{ 0x7ed9, 0x7d66 },{ 0x7eda, 0x7d62 },{ 0x7edb, 0x7d73 }, { 0x7edc, 0x7d61 },{ 0x7edd, 0x7d55 },{ 0x7ede, 0x7d5e },{ 0x7edf, 0x7d71 }, { 0x7ee0, 0x7d86 },{ 0x7ee1, 0x7d83 },{ 0x7ee2, 0x7d79 },{ 0x7ee3, 0x7e61 }, { 0x7ee5, 0x7d8f },{ 0x7ee6, 0x7d5b },{ 0x7ee7, 0x7e7c },{ 0x7ee8, 0x7d88 }, { 0x7ee9, 0x7e3e },{ 0x7eea, 0x7dd2 },{ 0x7eeb, 0x7dbe },{ 0x7eed, 0x7e8c }, { 0x7eee, 0x7dba },{ 0x7eef, 0x7dcb },{ 0x7ef0, 0x7dbd },{ 0x7ef2, 0x7dc4 }, { 0x7ef3, 0x7e69 },{ 0x7ef4, 0x7dad },{ 0x7ef5, 0x7dbf },{ 0x7ef6, 0x7dac }, { 0x7ef7, 0x7e43 },{ 0x7ef8, 0x7da2 },{ 0x7efa, 0x7db9 },{ 0x7efb, 0x7da3 }, { 0x7efc, 0x7d9c },{ 0x7efd, 0x7dbb },{ 0x7efe, 0x7db0 },{ 0x7eff, 0x7da0 }, { 0x7f00, 0x7db4 },{ 0x7f01, 0x7dc7 },{ 0x7f02, 0x7dd9 },{ 0x7f03, 0x7dd7 }, { 0x7f04, 0x7dd8 },{ 0x7f05, 0x7dec },{ 0x7f06, 0x7e9c },{ 0x7f07, 0x7df9 }, { 0x7f08, 0x7df2 },{ 0x7f09, 0x7ddd },{ 0x7f0b, 0x7e62 },{ 0x7f0c, 0x7de6 }, { 0x7f0d, 0x7d9e },{ 0x7f0e, 0x7dde },{ 0x7f0f, 0x7df6 },{ 0x7f11, 0x7df1 }, { 0x7f12, 0x7e0b },{ 0x7f13, 0x7de9 },{ 0x7f14, 0x7de0 },{ 0x7f15, 0x7e37 }, { 0x7f16, 0x7de8 },{ 0x7f17, 0x7de1 },{ 0x7f18, 0x7de3 },{ 0x7f19, 0x7e09 }, { 0x7f1a, 0x7e1b },{ 0x7f1b, 0x7e1f },{ 0x7f1c, 0x7e1d },{ 0x7f1d, 0x7e2b }, { 0x7f1f, 0x7e1e },{ 0x7f20, 0x7e8f },{ 0x7f21, 0x7e2d },{ 0x7f22, 0x7e0a }, { 0x7f23, 0x7e11 },{ 0x7f24, 0x7e7d },{ 0x7f25, 0x7e39 },{ 0x7f26, 0x7e35 }, { 0x7f27, 0x7e32 },{ 0x7f28, 0x7e93 },{ 0x7f29, 0x7e2e },{ 0x7f2a, 0x7e46 }, { 0x7f2b, 0x7e45 },{ 0x7f2c, 0x7e88 },{ 0x7f2d, 0x7e5a },{ 0x7f2e, 0x7e55 }, { 0x7f2f, 0x7e52 },{ 0x7f30, 0x97c1 },{ 0x7f31, 0x7e7e },{ 0x7f32, 0x7e70 }, { 0x7f33, 0x7e6f },{ 0x7f34, 0x7e73 },{ 0x7f35, 0x7e98 },{ 0x7f42, 0x7f4c }, { 0x7f51, 0x7db2 },{ 0x7f57, 0x7f85 },{ 0x7f5a, 0x7f70 },{ 0x7f62, 0x7f77 }, { 0x7f74, 0x7f86 },{ 0x7f81, 0x7f88 },{ 0x7f9f, 0x7fa5 },{ 0x7fa1, 0x7fa8 }, { 0x7fd8, 0x7ff9 },{ 0x8027, 0x802c },{ 0x8038, 0x8073 },{ 0x803b, 0x6065 }, { 0x8042, 0x8076 },{ 0x804b, 0x807e },{ 0x804c, 0x8077 },{ 0x804d, 0x8079 }, { 0x8054, 0x806f },{ 0x8069, 0x8075 },{ 0x806a, 0x8070 },{ 0x8080, 0x807f }, { 0x8083, 0x8085 },{ 0x80a0, 0x8178 },{ 0x80a4, 0x819a },{ 0x80ae, 0x9aaf }, { 0x80b4, 0x991a },{ 0x80be, 0x814e },{ 0x80bf, 0x816b },{ 0x80c0, 0x8139 }, { 0x80c1, 0x8105 },{ 0x80c4, 0x5191 },{ 0x80c6, 0x81bd },{ 0x80dc, 0x52dd }, { 0x80e7, 0x6727 },{ 0x80ea, 0x81da },{ 0x80eb, 0x811b },{ 0x80f6, 0x81a0 }, { 0x8109, 0x8108 },{ 0x810d, 0x81be },{ 0x810f, 0x9ad2 },{ 0x8110, 0x81cd }, { 0x8111, 0x8166 },{ 0x8113, 0x81bf },{ 0x8114, 0x81e0 },{ 0x811a, 0x8173 }, { 0x8131, 0x812b },{ 0x8132, 0x5c3f },{ 0x8136, 0x8161 },{ 0x8138, 0x81c9 }, { 0x814a, 0x81d8 },{ 0x814c, 0x9183 },{ 0x816d, 0x9f76 },{ 0x817b, 0x81a9 }, { 0x817c, 0x9766 },{ 0x817d, 0x8183 },{ 0x817e, 0x9a30 },{ 0x8191, 0x81cf }, { 0x8206, 0x8f3f },{ 0x8223, 0x8264 },{ 0x8230, 0x8266 },{ 0x8231, 0x8259 }, { 0x823b, 0x826b },{ 0x8270, 0x8271 },{ 0x8273, 0x8c54 },{ 0x8279, 0x8278 }, { 0x827a, 0x85dd },{ 0x8282, 0x7bc0 },{ 0x8288, 0x7f8b },{ 0x8297, 0x858c }, { 0x829c, 0x856a },{ 0x82a6, 0x8606 },{ 0x82c1, 0x84ef },{ 0x82c7, 0x8466 }, { 0x82c8, 0x85f6 },{ 0x82cb, 0x83a7 },{ 0x82cc, 0x8407 },{ 0x82cd, 0x84bc }, { 0x82ce, 0x82e7 },{ 0x82cf, 0x8607 },{ 0x82f9, 0x860b },{ 0x8303, 0x7bc4 }, { 0x830e, 0x8396 },{ 0x830f, 0x8622 },{ 0x8311, 0x8526 },{ 0x8314, 0x584b }, { 0x8315, 0x7162 },{ 0x8327, 0x7e6d },{ 0x8346, 0x834a },{ 0x8350, 0x85a6 }, { 0x835a, 0x83a2 },{ 0x835b, 0x8558 },{ 0x835c, 0x84fd },{ 0x835e, 0x854e }, { 0x835f, 0x8588 },{ 0x8360, 0x85ba },{ 0x8361, 0x8569 },{ 0x8363, 0x69ae }, { 0x8364, 0x8477 },{ 0x8365, 0x6ece },{ 0x8366, 0x7296 },{ 0x8367, 0x7192 }, { 0x8368, 0x8541 },{ 0x8369, 0x85ce },{ 0x836a, 0x84c0 },{ 0x836b, 0x852d }, { 0x836c, 0x85da },{ 0x836d, 0x8452 },{ 0x836f, 0x85e5 },{ 0x8385, 0x849e }, { 0x83b1, 0x840a },{ 0x83b2, 0x84ee },{ 0x83b3, 0x8494 },{ 0x83b4, 0x8435 }, { 0x83b6, 0x859f },{ 0x83b7, 0x7372 },{ 0x83b8, 0x8555 },{ 0x83b9, 0x7469 }, { 0x83ba, 0x9daf },{ 0x83bc, 0x84f4 },{ 0x841d, 0x863f },{ 0x8424, 0x87a2 }, { 0x8425, 0x71df },{ 0x8426, 0x7e08 },{ 0x8427, 0x856d },{ 0x8428, 0x85a9 }, { 0x8471, 0x8525 },{ 0x8487, 0x8546 },{ 0x8489, 0x8562 },{ 0x848b, 0x8523 }, { 0x848c, 0x851e },{ 0x84d1, 0x7c11 },{ 0x84dd, 0x85cd },{ 0x84df, 0x858a }, { 0x84e0, 0x863a },{ 0x84e3, 0x8577 },{ 0x84e5, 0x93a3 },{ 0x84e6, 0x9a40 }, { 0x8537, 0x8594 },{ 0x8539, 0x861e },{ 0x853a, 0x85fa },{ 0x853c, 0x85f9 }, { 0x8572, 0x8604 },{ 0x8574, 0x860a },{ 0x85ae, 0x85ea },{ 0x85d3, 0x861a }, { 0x8616, 0x8617 },{ 0x864f, 0x865c },{ 0x8651, 0x616e },{ 0x865a, 0x865b }, { 0x866b, 0x87f2 },{ 0x866c, 0x866f },{ 0x866e, 0x87e3 },{ 0x867d, 0x96d6 }, { 0x867e, 0x8766 },{ 0x867f, 0x8806 },{ 0x8680, 0x8755 },{ 0x8681, 0x87fb }, { 0x8682, 0x879e },{ 0x8695, 0x8836 },{ 0x869d, 0x8814 },{ 0x86ac, 0x8706 }, { 0x86ca, 0x8831 },{ 0x86ce, 0x8823 },{ 0x86cf, 0x87f6 },{ 0x86ee, 0x883b }, { 0x86f0, 0x87c4 },{ 0x86f1, 0x86fa },{ 0x86f2, 0x87ef },{ 0x86f3, 0x8784 }, { 0x86f4, 0x8810 },{ 0x8715, 0x86fb },{ 0x8717, 0x8778 },{ 0x8721, 0x881f }, { 0x8747, 0x8805 },{ 0x8748, 0x87c8 },{ 0x8749, 0x87ec },{ 0x874e, 0x880d }, { 0x8770, 0x867a },{ 0x877c, 0x87bb },{ 0x877e, 0x8811 },{ 0x87ee, 0x87fa }, { 0x8845, 0x91c1 },{ 0x8854, 0x929c },{ 0x8864, 0x8863 },{ 0x8865, 0x88dc }, { 0x886c, 0x896f },{ 0x886e, 0x889e },{ 0x8884, 0x8956 },{ 0x8885, 0x88ca }, { 0x889c, 0x896a },{ 0x88ad, 0x8972 },{ 0x88c5, 0x88dd },{ 0x88c6, 0x8960 }, { 0x88e2, 0x8933 },{ 0x88e3, 0x895d },{ 0x88e4, 0x8932 },{ 0x88e5, 0x8949 }, { 0x891b, 0x8938 },{ 0x8934, 0x8964 },{ 0x89c1, 0x898b },{ 0x89c2, 0x89c0 }, { 0x89c4, 0x898f },{ 0x89c5, 0x8993 },{ 0x89c6, 0x8996 },{ 0x89c7, 0x8998 }, { 0x89c8, 0x89bd },{ 0x89c9, 0x89ba },{ 0x89ca, 0x89ac },{ 0x89cb, 0x89a1 }, { 0x89cc, 0x89bf },{ 0x89ce, 0x89a6 },{ 0x89cf, 0x89af },{ 0x89d0, 0x89b2 }, { 0x89d1, 0x89b7 },{ 0x89de, 0x89f4 },{ 0x89e6, 0x89f8 },{ 0x89ef, 0x89f6 }, { 0x8a89, 0x8b7d },{ 0x8a8a, 0x8b04 },{ 0x8ba0, 0x8a00 },{ 0x8ba1, 0x8a08 }, { 0x8ba2, 0x8a02 },{ 0x8ba3, 0x8a03 },{ 0x8ba4, 0x8a8d },{ 0x8ba5, 0x8b4f }, { 0x8ba6, 0x8a10 },{ 0x8ba7, 0x8a0c },{ 0x8ba8, 0x8a0e },{ 0x8ba9, 0x8b93 }, { 0x8baa, 0x8a15 },{ 0x8bab, 0x8a16 },{ 0x8bad, 0x8a13 },{ 0x8bae, 0x8b70 }, { 0x8baf, 0x8a0a },{ 0x8bb0, 0x8a18 },{ 0x8bb2, 0x8b1b },{ 0x8bb3, 0x8af1 }, { 0x8bb4, 0x8b33 },{ 0x8bb5, 0x8a4e },{ 0x8bb6, 0x8a1d },{ 0x8bb7, 0x8a25 }, { 0x8bb8, 0x8a31 },{ 0x8bb9, 0x8a1b },{ 0x8bba, 0x8ad6 },{ 0x8bbc, 0x8a1f }, { 0x8bbd, 0x8af7 },{ 0x8bbe, 0x8a2d },{ 0x8bbf, 0x8a2a },{ 0x8bc0, 0x8a23 }, { 0x8bc1, 0x8b49 },{ 0x8bc2, 0x8a41 },{ 0x8bc3, 0x8a36 },{ 0x8bc4, 0x8a55 }, { 0x8bc5, 0x8a5b },{ 0x8bc6, 0x8b58 },{ 0x8bc8, 0x8a50 },{ 0x8bc9, 0x8a34 }, { 0x8bca, 0x8a3a },{ 0x8bcb, 0x8a46 },{ 0x8bcc, 0x8b05 },{ 0x8bcd, 0x8a5e }, { 0x8bce, 0x8a58 },{ 0x8bcf, 0x8a54 },{ 0x8bd1, 0x8b6f },{ 0x8bd2, 0x8a52 }, { 0x8bd3, 0x8a86 },{ 0x8bd4, 0x8a84 },{ 0x8bd5, 0x8a66 },{ 0x8bd6, 0x8a7f }, { 0x8bd7, 0x8a69 },{ 0x8bd8, 0x8a70 },{ 0x8bd9, 0x8a7c },{ 0x8bda, 0x8aa0 }, { 0x8bdb, 0x8a85 },{ 0x8bdc, 0x8a75 },{ 0x8bdd, 0x8a71 },{ 0x8bde, 0x8a95 }, { 0x8bdf, 0x8a6c },{ 0x8be0, 0x8a6e },{ 0x8be1, 0x8a6d },{ 0x8be2, 0x8a62 }, { 0x8be3, 0x8a63 },{ 0x8be4, 0x8acd },{ 0x8be5, 0x8a72 },{ 0x8be6, 0x8a73 }, { 0x8be7, 0x8a6b },{ 0x8be8, 0x8ae2 },{ 0x8be9, 0x8a61 },{ 0x8beb, 0x8aa1 }, { 0x8bec, 0x8aa3 },{ 0x8bed, 0x8a9e },{ 0x8bee, 0x8a9a },{ 0x8bef, 0x8aa4 }, { 0x8bf0, 0x8aa5 },{ 0x8bf1, 0x8a98 },{ 0x8bf2, 0x8aa8 },{ 0x8bf3, 0x8a91 }, { 0x8bf4, 0x8aaa },{ 0x8bf5, 0x8aa6 },{ 0x8bf6, 0x8a92 },{ 0x8bf7, 0x8acb }, { 0x8bf8, 0x8af8 },{ 0x8bf9, 0x8acf },{ 0x8bfa, 0x8afe },{ 0x8bfb, 0x8b80 }, { 0x8bfc, 0x8ad1 },{ 0x8bfd, 0x8ab9 },{ 0x8bfe, 0x8ab2 },{ 0x8bff, 0x8ac9 }, { 0x8c00, 0x8adb },{ 0x8c01, 0x8ab0 },{ 0x8c02, 0x8ad7 },{ 0x8c03, 0x8abf }, { 0x8c04, 0x8ac2 },{ 0x8c05, 0x8ad2 },{ 0x8c06, 0x8ac4 },{ 0x8c07, 0x8ab6 }, { 0x8c08, 0x8ac7 },{ 0x8c0a, 0x8abc },{ 0x8c0b, 0x8b00 },{ 0x8c0c, 0x8af6 }, { 0x8c0d, 0x8adc },{ 0x8c0e, 0x8b0a },{ 0x8c0f, 0x8aeb },{ 0x8c10, 0x8ae7 }, { 0x8c11, 0x8b14 },{ 0x8c12, 0x8b01 },{ 0x8c13, 0x8b02 },{ 0x8c14, 0x8ae4 }, { 0x8c15, 0x8aed },{ 0x8c16, 0x8afc },{ 0x8c17, 0x8b92 },{ 0x8c18, 0x8aee }, { 0x8c19, 0x8af3 },{ 0x8c1a, 0x8afa },{ 0x8c1b, 0x8ae6 },{ 0x8c1c, 0x8b0e }, { 0x8c1d, 0x8ade },{ 0x8c1f, 0x8b28 },{ 0x8c20, 0x8b9c },{ 0x8c21, 0x8b16 }, { 0x8c22, 0x8b1d },{ 0x8c23, 0x8b20 },{ 0x8c24, 0x8b17 },{ 0x8c25, 0x8b1a }, { 0x8c26, 0x8b19 },{ 0x8c27, 0x8b10 },{ 0x8c28, 0x8b39 },{ 0x8c29, 0x8b3e }, { 0x8c2a, 0x8b2b },{ 0x8c2b, 0x8b7e },{ 0x8c2c, 0x8b2c },{ 0x8c2d, 0x8b5a }, { 0x8c2e, 0x8b56 },{ 0x8c2f, 0x8b59 },{ 0x8c30, 0x8b95 },{ 0x8c31, 0x8b5c }, { 0x8c32, 0x8b4e },{ 0x8c33, 0x8b9e },{ 0x8c34, 0x8b74 },{ 0x8c35, 0x8b6b }, { 0x8c36, 0x8b96 },{ 0x8d1d, 0x8c9d },{ 0x8d1e, 0x8c9e },{ 0x8d1f, 0x8ca0 }, { 0x8d21, 0x8ca2 },{ 0x8d22, 0x8ca1 },{ 0x8d23, 0x8cac },{ 0x8d24, 0x8ce2 }, { 0x8d25, 0x6557 },{ 0x8d26, 0x8cec },{ 0x8d27, 0x8ca8 },{ 0x8d28, 0x8cea }, { 0x8d29, 0x8ca9 },{ 0x8d2a, 0x8caa },{ 0x8d2b, 0x8ca7 },{ 0x8d2c, 0x8cb6 }, { 0x8d2d, 0x8cfc },{ 0x8d2e, 0x8caf },{ 0x8d2f, 0x8cab },{ 0x8d30, 0x8cb3 }, { 0x8d31, 0x8ce4 },{ 0x8d32, 0x8cc1 },{ 0x8d33, 0x8cb0 },{ 0x8d34, 0x8cbc }, { 0x8d35, 0x8cb4 },{ 0x8d36, 0x8cba },{ 0x8d37, 0x8cb8 },{ 0x8d38, 0x8cbf }, { 0x8d39, 0x8cbb },{ 0x8d3a, 0x8cc0 },{ 0x8d3b, 0x8cbd },{ 0x8d3c, 0x8cca }, { 0x8d3d, 0x8d04 },{ 0x8d3e, 0x8cc8 },{ 0x8d3f, 0x8cc4 },{ 0x8d40, 0x8cb2 }, { 0x8d41, 0x8cc3 },{ 0x8d42, 0x8cc2 },{ 0x8d43, 0x8d13 },{ 0x8d44, 0x8cc7 }, { 0x8d45, 0x8cc5 },{ 0x8d46, 0x8d10 },{ 0x8d47, 0x8cd5 },{ 0x8d48, 0x8cd1 }, { 0x8d49, 0x8cda },{ 0x8d4a, 0x8cd2 },{ 0x8d4b, 0x8ce6 },{ 0x8d4c, 0x8ced }, { 0x8d4d, 0x9f4e },{ 0x8d4e, 0x8d16 },{ 0x8d4f, 0x8cde },{ 0x8d50, 0x8cdc }, { 0x8d53, 0x8ce1 },{ 0x8d54, 0x8ce0 },{ 0x8d55, 0x8ce7 },{ 0x8d56, 0x8cf4 }, { 0x8d58, 0x8d05 },{ 0x8d59, 0x8cfb },{ 0x8d5a, 0x8cfa },{ 0x8d5b, 0x8cfd }, { 0x8d5c, 0x8cfe },{ 0x8d5d, 0x8d17 },{ 0x8d5e, 0x8d0a },{ 0x8d60, 0x8d08 }, { 0x8d61, 0x8d0d },{ 0x8d62, 0x8d0f },{ 0x8d63, 0x8d1b },{ 0x8d75, 0x8d99 }, { 0x8d76, 0x8d95 },{ 0x8d8b, 0x8da8 },{ 0x8db1, 0x8db2 },{ 0x8db8, 0x8e89 }, { 0x8dc3, 0x8e8d },{ 0x8dc4, 0x8e4c },{ 0x8dde, 0x8e92 },{ 0x8df5, 0x8e10 }, { 0x8df7, 0x8e7a },{ 0x8df8, 0x8e55 },{ 0x8df9, 0x8e9a },{ 0x8dfb, 0x8e8b }, { 0x8e0a, 0x8e34 },{ 0x8e0c, 0x8e8a },{ 0x8e2a, 0x8e64 },{ 0x8e2c, 0x8e93 }, { 0x8e2f, 0x8e91 },{ 0x8e51, 0x8ea1 },{ 0x8e52, 0x8e63 },{ 0x8e70, 0x8e95 }, { 0x8e7f, 0x8ea5 },{ 0x8e8f, 0x8eaa },{ 0x8e9c, 0x8ea6 },{ 0x8eaf, 0x8ec0 }, { 0x8f66, 0x8eca },{ 0x8f67, 0x8ecb },{ 0x8f68, 0x8ecc },{ 0x8f69, 0x8ed2 }, { 0x8f6b, 0x8ed4 },{ 0x8f6c, 0x8f49 },{ 0x8f6d, 0x8edb },{ 0x8f6e, 0x8f2a }, { 0x8f6f, 0x8edf },{ 0x8f70, 0x8f5f },{ 0x8f72, 0x8efb },{ 0x8f73, 0x8f64 }, { 0x8f74, 0x8ef8 },{ 0x8f75, 0x8ef9 },{ 0x8f76, 0x8efc },{ 0x8f78, 0x8eeb }, { 0x8f79, 0x8f62 },{ 0x8f7a, 0x8efa },{ 0x8f7b, 0x8f15 },{ 0x8f7c, 0x8efe }, { 0x8f7d, 0x8f09 },{ 0x8f7e, 0x8f0a },{ 0x8f7f, 0x8f4e },{ 0x8f81, 0x8f07 }, { 0x8f82, 0x8f05 },{ 0x8f83, 0x8f03 },{ 0x8f84, 0x8f12 },{ 0x8f85, 0x8f14 }, { 0x8f86, 0x8f1b },{ 0x8f87, 0x8f26 },{ 0x8f88, 0x8f29 },{ 0x8f89, 0x8f1d }, { 0x8f8a, 0x8f25 },{ 0x8f8b, 0x8f1e },{ 0x8f8d, 0x8f1f },{ 0x8f8e, 0x8f1c }, { 0x8f8f, 0x8f33 },{ 0x8f90, 0x8f3b },{ 0x8f91, 0x8f2f },{ 0x8f93, 0x8f38 }, { 0x8f94, 0x8f61 },{ 0x8f95, 0x8f45 },{ 0x8f96, 0x8f44 },{ 0x8f97, 0x8f3e }, { 0x8f98, 0x8f46 },{ 0x8f99, 0x8f4d },{ 0x8f9a, 0x8f54 },{ 0x8f9e, 0x8fad }, { 0x8f9f, 0x95e2 },{ 0x8fa9, 0x8faf },{ 0x8fab, 0x8fae },{ 0x8fb9, 0x908a }, { 0x8fbd, 0x907c },{ 0x8fbe, 0x9054 },{ 0x8fc1, 0x9077 },{ 0x8fc7, 0x904e }, { 0x8fc8, 0x9081 },{ 0x8fd0, 0x904b },{ 0x8fd8, 0x9084 },{ 0x8fd9, 0x9019 }, { 0x8fdb, 0x9032 },{ 0x8fdc, 0x9060 },{ 0x8fdd, 0x9055 },{ 0x8fde, 0x9023 }, { 0x8fdf, 0x9072 },{ 0x8fe9, 0x9087 },{ 0x8ff3, 0x9015 },{ 0x8ff9, 0x8e5f }, { 0x9002, 0x9069 },{ 0x9009, 0x9078 },{ 0x900a, 0x905c },{ 0x9012, 0x905e }, { 0x9026, 0x9090 },{ 0x903b, 0x908f },{ 0x9057, 0x907a },{ 0x9065, 0x9059 }, { 0x9093, 0x9127 },{ 0x909d, 0x913a },{ 0x90ac, 0x9114 },{ 0x90ae, 0x90f5 }, { 0x90b9, 0x9112 },{ 0x90ba, 0x9134 },{ 0x90bb, 0x9130 },{ 0x90c1, 0x9b31 }, { 0x90c4, 0x9699 },{ 0x90cf, 0x90df },{ 0x90d0, 0x9136 },{ 0x90d1, 0x912d }, { 0x90d3, 0x9106 },{ 0x90e6, 0x9148 },{ 0x90e7, 0x9116 },{ 0x90f8, 0x9132 }, { 0x915d, 0x919e },{ 0x9171, 0x91ac },{ 0x917d, 0x91c5 },{ 0x917e, 0x91c3 }, { 0x917f, 0x91c0 },{ 0x91c7, 0x63a1 },{ 0x91ca, 0x91cb },{ 0x91cc, 0x88e1 }, { 0x9274, 0x9451 },{ 0x92ae, 0x947e },{ 0x933e, 0x93e8 },{ 0x9485, 0x91d1 }, { 0x9486, 0x91d3 },{ 0x9487, 0x91d4 },{ 0x9488, 0x91dd },{ 0x9489, 0x91d8 }, { 0x948a, 0x91d7 },{ 0x948b, 0x91d9 },{ 0x948c, 0x91d5 },{ 0x948d, 0x91f7 }, { 0x948e, 0x91ec },{ 0x948f, 0x91e7 },{ 0x9490, 0x91e4 },{ 0x9492, 0x91e9 }, { 0x9493, 0x91e3 },{ 0x9494, 0x9346 },{ 0x9495, 0x91f9 },{ 0x9497, 0x91f5 }, { 0x9499, 0x9223 },{ 0x949b, 0x9226 },{ 0x949c, 0x9245 },{ 0x949d, 0x920d }, { 0x949e, 0x9214 },{ 0x949f, 0x9418 },{ 0x94a0, 0x9209 },{ 0x94a1, 0x92c7 }, { 0x94a2, 0x92fc },{ 0x94a3, 0x9211 },{ 0x94a4, 0x9210 },{ 0x94a5, 0x9470 }, { 0x94a6, 0x6b3d },{ 0x94a7, 0x921e },{ 0x94a8, 0x93a2 },{ 0x94a9, 0x9264 }, { 0x94aa, 0x9227 },{ 0x94ab, 0x9201 },{ 0x94ac, 0x9225 },{ 0x94ad, 0x9204 }, { 0x94ae, 0x9215 },{ 0x94af, 0x9200 },{ 0x94b0, 0x923a },{ 0x94b1, 0x9322 }, { 0x94b2, 0x9266 },{ 0x94b3, 0x9257 },{ 0x94b4, 0x9237 },{ 0x94b5, 0x7f3d }, { 0x94b6, 0x9233 },{ 0x94b8, 0x923d },{ 0x94b9, 0x9238 },{ 0x94ba, 0x925e }, { 0x94bb, 0x947d },{ 0x94bc, 0x926c },{ 0x94bd, 0x926d },{ 0x94be, 0x9240 }, { 0x94bf, 0x923f },{ 0x94c0, 0x923e },{ 0x94c1, 0x9435 },{ 0x94c2, 0x9251 }, { 0x94c3, 0x9234 },{ 0x94c4, 0x9460 },{ 0x94c5, 0x925b },{ 0x94c6, 0x925a }, { 0x94c8, 0x9230 },{ 0x94c9, 0x9249 },{ 0x94ca, 0x9248 },{ 0x94cb, 0x924d }, { 0x94cc, 0x922e },{ 0x94cd, 0x9239 },{ 0x94ce, 0x9438 },{ 0x94d0, 0x92ac }, { 0x94d1, 0x92a0 },{ 0x94d2, 0x927a },{ 0x94d5, 0x92aa },{ 0x94d6, 0x92ee }, { 0x94d7, 0x92cf },{ 0x94d9, 0x9403 },{ 0x94db, 0x943a },{ 0x94dc, 0x9285 }, { 0x94dd, 0x92c1 },{ 0x94df, 0x92a6 },{ 0x94e0, 0x93a7 },{ 0x94e1, 0x9358 }, { 0x94e2, 0x9296 },{ 0x94e3, 0x9291 },{ 0x94e4, 0x92cc },{ 0x94e5, 0x92a9 }, { 0x94e7, 0x93f5 },{ 0x94e8, 0x9293 },{ 0x94e9, 0x93a9 },{ 0x94ea, 0x927f }, { 0x94eb, 0x929a },{ 0x94ec, 0x927b },{ 0x94ed, 0x9298 },{ 0x94ee, 0x931a }, { 0x94ef, 0x92ab },{ 0x94f0, 0x9278 },{ 0x94f1, 0x92a5 },{ 0x94f2, 0x93df }, { 0x94f3, 0x9283 },{ 0x94f4, 0x940b },{ 0x94f5, 0x92a8 },{ 0x94f6, 0x9280 }, { 0x94f7, 0x92a3 },{ 0x94f8, 0x9444 },{ 0x94f9, 0x9412 },{ 0x94fa, 0x92ea }, { 0x94fc, 0x9338 },{ 0x94fd, 0x92f1 },{ 0x94fe, 0x93c8 },{ 0x94ff, 0x93d7 }, { 0x9500, 0x92b7 },{ 0x9501, 0x9396 },{ 0x9502, 0x92f0 },{ 0x9504, 0x92e4 }, { 0x9505, 0x934b },{ 0x9506, 0x92ef },{ 0x9507, 0x92e8 },{ 0x9508, 0x93fd }, { 0x9509, 0x92bc },{ 0x950a, 0x92dd },{ 0x950b, 0x92d2 },{ 0x950c, 0x92c5 }, { 0x9510, 0x92b3 },{ 0x9511, 0x92bb },{ 0x9512, 0x92c3 },{ 0x9513, 0x92df }, { 0x9514, 0x92e6 },{ 0x9515, 0x9312 },{ 0x9516, 0x9306 },{ 0x9517, 0x937a }, { 0x9519, 0x932f },{ 0x951a, 0x9328 },{ 0x951b, 0x931b },{ 0x951e, 0x9301 }, { 0x951f, 0x9315 },{ 0x9521, 0x932b },{ 0x9522, 0x932e },{ 0x9523, 0x947c }, { 0x9524, 0x939a },{ 0x9525, 0x9310 },{ 0x9526, 0x9326 },{ 0x9529, 0x9308 }, { 0x952c, 0x931f },{ 0x952d, 0x9320 },{ 0x952e, 0x9375 },{ 0x952f, 0x92f8 }, { 0x9530, 0x9333 },{ 0x9531, 0x9319 },{ 0x9532, 0x9365 },{ 0x9534, 0x9347 }, { 0x9535, 0x93d8 },{ 0x9536, 0x9376 },{ 0x9537, 0x9354 },{ 0x9538, 0x9364 }, { 0x9539, 0x936c },{ 0x953a, 0x937e },{ 0x953b, 0x935b },{ 0x953c, 0x93aa }, { 0x953e, 0x9370 },{ 0x9540, 0x934d },{ 0x9541, 0x9382 },{ 0x9542, 0x93e4 }, { 0x9544, 0x9428 },{ 0x9546, 0x93cc },{ 0x9547, 0x93ae },{ 0x9549, 0x9398 }, { 0x954a, 0x9477 },{ 0x954c, 0x942b },{ 0x954d, 0x93b3 },{ 0x954f, 0x93a6 }, { 0x9550, 0x93ac },{ 0x9551, 0x938a },{ 0x9552, 0x93b0 },{ 0x9553, 0x93b5 }, { 0x9554, 0x944c },{ 0x9556, 0x93e2 },{ 0x9557, 0x93dc },{ 0x9558, 0x93dd }, { 0x9559, 0x93cd },{ 0x955b, 0x93de },{ 0x955c, 0x93e1 },{ 0x955d, 0x93d1 }, { 0x955e, 0x93c3 },{ 0x955f, 0x93c7 },{ 0x9561, 0x9414 },{ 0x9563, 0x9410 }, { 0x9564, 0x93f7 },{ 0x9566, 0x9413 },{ 0x9567, 0x946d },{ 0x9568, 0x9420 }, { 0x956a, 0x93f9 },{ 0x956b, 0x9419 },{ 0x956c, 0x944a },{ 0x956d, 0x9433 }, { 0x956f, 0x9432 },{ 0x9570, 0x942e },{ 0x9571, 0x943f },{ 0x9573, 0x9463 }, { 0x9576, 0x9472 },{ 0x957f, 0x9577 },{ 0x95e8, 0x9580 },{ 0x95e9, 0x9582 }, { 0x95ea, 0x9583 },{ 0x95eb, 0x9586 },{ 0x95ed, 0x9589 },{ 0x95ee, 0x554f }, { 0x95ef, 0x95d6 },{ 0x95f0, 0x958f },{ 0x95f1, 0x95c8 },{ 0x95f2, 0x9592 }, { 0x95f3, 0x958e },{ 0x95f4, 0x9593 },{ 0x95f5, 0x9594 },{ 0x95f6, 0x958c }, { 0x95f7, 0x60b6 },{ 0x95f8, 0x9598 },{ 0x95f9, 0x9b27 },{ 0x95fa, 0x95a8 }, { 0x95fb, 0x805e },{ 0x95fc, 0x95e5 },{ 0x95fd, 0x95a9 },{ 0x95fe, 0x95ad }, { 0x9600, 0x95a5 },{ 0x9601, 0x95a3 },{ 0x9602, 0x95a1 },{ 0x9603, 0x95ab }, { 0x9604, 0x9b2e },{ 0x9605, 0x95b1 },{ 0x9606, 0x95ac },{ 0x9608, 0x95be }, { 0x9609, 0x95b9 },{ 0x960a, 0x95b6 },{ 0x960b, 0x9b29 },{ 0x960c, 0x95bf }, { 0x960d, 0x95bd },{ 0x960e, 0x95bb },{ 0x960f, 0x95bc },{ 0x9610, 0x95e1 }, { 0x9611, 0x95cc },{ 0x9612, 0x95c3 },{ 0x9614, 0x95ca },{ 0x9615, 0x95cb }, { 0x9616, 0x95d4 },{ 0x9617, 0x95d0 },{ 0x9619, 0x95d5 },{ 0x961a, 0x95de }, { 0x961d, 0x961c },{ 0x961f, 0x968a },{ 0x9633, 0x967d },{ 0x9634, 0x9670 }, { 0x9635, 0x9663 },{ 0x9636, 0x968e },{ 0x9645, 0x969b },{ 0x9646, 0x9678 }, { 0x9647, 0x96b4 },{ 0x9648, 0x9673 },{ 0x9649, 0x9658 },{ 0x9655, 0x965d }, { 0x9667, 0x9689 },{ 0x9668, 0x9695 },{ 0x9669, 0x96aa },{ 0x968f, 0x96a8 }, { 0x9690, 0x96b1 },{ 0x96b6, 0x96b8 },{ 0x96bd, 0x96cb },{ 0x96be, 0x96e3 }, { 0x96cf, 0x96db },{ 0x96e0, 0x8b8e },{ 0x96f3, 0x9742 },{ 0x96fe, 0x9727 }, { 0x9701, 0x973d },{ 0x972d, 0x9744 },{ 0x9753, 0x975a },{ 0x9759, 0x975c }, { 0x9765, 0x9768 },{ 0x9791, 0x97c3 },{ 0x9792, 0x6a47 },{ 0x97af, 0x97c9 }, { 0x97e6, 0x97cb },{ 0x97e7, 0x97cc },{ 0x97e9, 0x97d3 },{ 0x97ea, 0x97d9 }, { 0x97eb, 0x97de },{ 0x97ec, 0x97dc },{ 0x97f5, 0x97fb },{ 0x9875, 0x9801 }, { 0x9876, 0x9802 },{ 0x9877, 0x9803 },{ 0x9878, 0x9807 },{ 0x9879, 0x9805 }, { 0x987a, 0x9806 },{ 0x987b, 0x9808 },{ 0x987c, 0x980a },{ 0x987d, 0x9811 }, { 0x987e, 0x9867 },{ 0x987f, 0x9813 },{ 0x9880, 0x980e },{ 0x9881, 0x9812 }, { 0x9882, 0x980c },{ 0x9883, 0x980f },{ 0x9884, 0x9810 },{ 0x9885, 0x9871 }, { 0x9886, 0x9818 },{ 0x9887, 0x9817 },{ 0x9888, 0x9838 },{ 0x9889, 0x9821 }, { 0x988a, 0x9830 },{ 0x988c, 0x981c },{ 0x988d, 0x6f41 },{ 0x988f, 0x9826 }, { 0x9890, 0x9824 },{ 0x9891, 0x983b },{ 0x9893, 0x9839 },{ 0x9894, 0x9837 }, { 0x9896, 0x7a4e },{ 0x9897, 0x9846 },{ 0x9898, 0x984c },{ 0x989a, 0x984e }, { 0x989b, 0x9853 },{ 0x989c, 0x984f },{ 0x989d, 0x984d },{ 0x989e, 0x9873 }, { 0x989f, 0x9862 },{ 0x98a0, 0x985b },{ 0x98a1, 0x9859 },{ 0x98a2, 0x9865 }, { 0x98a4, 0x986b },{ 0x98a6, 0x9870 },{ 0x98a7, 0x9874 },{ 0x98ce, 0x98a8 }, { 0x98d1, 0x98ae },{ 0x98d2, 0x98af },{ 0x98d3, 0x98b6 },{ 0x98d5, 0x98bc }, { 0x98d8, 0x98c4 },{ 0x98d9, 0x98c6 },{ 0x98de, 0x98db },{ 0x98e8, 0x9957 }, { 0x990d, 0x995c },{ 0x9963, 0x98df },{ 0x9965, 0x98e2 },{ 0x9967, 0x9933 }, { 0x9968, 0x98e9 },{ 0x9969, 0x993c },{ 0x996a, 0x98ea },{ 0x996b, 0x98eb }, { 0x996c, 0x98ed },{ 0x996d, 0x98ef },{ 0x996e, 0x98f2 },{ 0x996f, 0x991e }, { 0x9970, 0x98fe },{ 0x9971, 0x98fd },{ 0x9972, 0x98fc },{ 0x9974, 0x98f4 }, { 0x9975, 0x990c },{ 0x9976, 0x9952 },{ 0x9977, 0x9909 },{ 0x997a, 0x9903 }, { 0x997c, 0x9905 },{ 0x997d, 0x9911 },{ 0x997f, 0x9913 },{ 0x9980, 0x9918 }, { 0x9981, 0x9912 },{ 0x9984, 0x991b },{ 0x9985, 0x9921 },{ 0x9986, 0x9928 }, { 0x9988, 0x994b },{ 0x998a, 0x993f },{ 0x998b, 0x995e },{ 0x998d, 0x7ce2 }, { 0x998f, 0x993e },{ 0x9990, 0x9948 },{ 0x9991, 0x9949 },{ 0x9992, 0x9945 }, { 0x9994, 0x994c },{ 0x9a6c, 0x99ac },{ 0x9a6d, 0x99ad },{ 0x9a6e, 0x99b1 }, { 0x9a6f, 0x99b4 },{ 0x9a70, 0x99b3 },{ 0x9a71, 0x9a45 },{ 0x9a73, 0x99c1 }, { 0x9a74, 0x9a62 },{ 0x9a75, 0x99d4 },{ 0x9a76, 0x99db },{ 0x9a77, 0x99df }, { 0x9a78, 0x99d9 },{ 0x9a79, 0x99d2 },{ 0x9a7a, 0x9a36 },{ 0x9a7b, 0x99d0 }, { 0x9a7c, 0x99dd },{ 0x9a7d, 0x99d1 },{ 0x9a7e, 0x99d5 },{ 0x9a7f, 0x9a5b }, { 0x9a80, 0x99d8 },{ 0x9a81, 0x9a4d },{ 0x9a82, 0x7f75 },{ 0x9a84, 0x9a55 }, { 0x9a85, 0x9a4a },{ 0x9a86, 0x99f1 },{ 0x9a87, 0x99ed },{ 0x9a88, 0x99e2 }, { 0x9a8a, 0x9a6a },{ 0x9a8b, 0x9a01 },{ 0x9a8c, 0x9a57 },{ 0x9a8f, 0x99ff }, { 0x9a90, 0x9a0f },{ 0x9a91, 0x9a0e },{ 0x9a92, 0x9a0d },{ 0x9a93, 0x9a05 }, { 0x9a96, 0x9a42 },{ 0x9a97, 0x9a19 },{ 0x9a98, 0x9a2d },{ 0x9a9a, 0x9a37 }, { 0x9a9b, 0x9a16 },{ 0x9a9c, 0x9a41 },{ 0x9a9d, 0x9a2e },{ 0x9a9e, 0x9a2b }, { 0x9a9f, 0x9a38 },{ 0x9aa0, 0x9a43 },{ 0x9aa1, 0x9a3e },{ 0x9aa2, 0x9a44 }, { 0x9aa3, 0x9a4f },{ 0x9aa4, 0x9a5f },{ 0x9aa5, 0x9a65 },{ 0x9aa7, 0x9a64 }, { 0x9ac5, 0x9acf },{ 0x9acb, 0x9ad6 },{ 0x9acc, 0x9ad5 },{ 0x9b13, 0x9b22 }, { 0x9b47, 0x9b58 },{ 0x9b49, 0x9b4e },{ 0x9c7c, 0x9b5a },{ 0x9c7f, 0x9b77 }, { 0x9c81, 0x9b6f },{ 0x9c82, 0x9b74 },{ 0x9c87, 0x9bf0 },{ 0x9c88, 0x9c78 }, { 0x9c8b, 0x9b92 },{ 0x9c8d, 0x9b91 },{ 0x9c8e, 0x9c5f },{ 0x9c90, 0x9b90 }, { 0x9c91, 0x9bad },{ 0x9c92, 0x9b9a },{ 0x9c94, 0x9baa },{ 0x9c95, 0x9b9e }, { 0x9c9a, 0x9c6d },{ 0x9c9b, 0x9bab },{ 0x9c9c, 0x9bae },{ 0x9c9e, 0x9bd7 }, { 0x9c9f, 0x9c58 },{ 0x9ca0, 0x9bc1 },{ 0x9ca1, 0x9c7a },{ 0x9ca2, 0x9c31 }, { 0x9ca3, 0x9c39 },{ 0x9ca4, 0x9bc9 },{ 0x9ca5, 0x9c23 },{ 0x9ca6, 0x9c37 }, { 0x9ca7, 0x9bc0 },{ 0x9ca8, 0x9bca },{ 0x9ca9, 0x9bc7 },{ 0x9cab, 0x9bfd }, { 0x9cad, 0x9bd6 },{ 0x9cae, 0x9bea },{ 0x9cb0, 0x9beb },{ 0x9cb1, 0x9be1 }, { 0x9cb2, 0x9be4 },{ 0x9cb3, 0x9be7 },{ 0x9cb5, 0x9be2 },{ 0x9cb6, 0x9bf0 }, { 0x9cb7, 0x9bdb },{ 0x9cb8, 0x9be8 },{ 0x9cbb, 0x9bd4 },{ 0x9cbd, 0x9c08 }, { 0x9cc3, 0x9c13 },{ 0x9cc4, 0x9c77 },{ 0x9cc5, 0x9c0d },{ 0x9cc6, 0x9c12 }, { 0x9cc7, 0x9c09 },{ 0x9ccc, 0x9c32 },{ 0x9ccd, 0x9c2d },{ 0x9cce, 0x9c28 }, { 0x9ccf, 0x9c25 },{ 0x9cd0, 0x9c29 },{ 0x9cd3, 0x9c33 },{ 0x9cd4, 0x9c3e }, { 0x9cd5, 0x9c48 },{ 0x9cd6, 0x9c49 },{ 0x9cd7, 0x9c3b },{ 0x9cdc, 0x9c56 }, { 0x9cdd, 0x9c54 },{ 0x9cde, 0x9c57 },{ 0x9cdf, 0x9c52 },{ 0x9ce2, 0x9c67 }, { 0x9e1f, 0x9ce5 },{ 0x9e20, 0x9ce9 },{ 0x9e21, 0x96de },{ 0x9e22, 0x9cf6 }, { 0x9e23, 0x9cf4 },{ 0x9e25, 0x9dd7 },{ 0x9e26, 0x9d09 },{ 0x9e28, 0x9d07 }, { 0x9e29, 0x9d06 },{ 0x9e2a, 0x9d23 },{ 0x9e2b, 0x9d87 },{ 0x9e2c, 0x9e15 }, { 0x9e2d, 0x9d28 },{ 0x9e2f, 0x9d26 },{ 0x9e31, 0x9d1f },{ 0x9e32, 0x9d1d }, { 0x9e33, 0x9d1b },{ 0x9e35, 0x9d15 },{ 0x9e36, 0x9de5 },{ 0x9e37, 0x9dd9 }, { 0x9e38, 0x9d2f },{ 0x9e39, 0x9d30 },{ 0x9e3a, 0x9d42 },{ 0x9e3d, 0x9d3f }, { 0x9e3e, 0x9e1e },{ 0x9e3f, 0x9d3b },{ 0x9e41, 0x9d53 },{ 0x9e42, 0x9e1d }, { 0x9e43, 0x9d51 },{ 0x9e44, 0x9d60 },{ 0x9e45, 0x9d5d },{ 0x9e46, 0x9d52 }, { 0x9e47, 0x9df4 },{ 0x9e48, 0x9d5c },{ 0x9e49, 0x9d61 },{ 0x9e4a, 0x9d72 }, { 0x9e4c, 0x9d6a },{ 0x9e4e, 0x9d6f },{ 0x9e4f, 0x9d6c },{ 0x9e51, 0x9d89 }, { 0x9e55, 0x9d98 },{ 0x9e57, 0x9d9a },{ 0x9e58, 0x9dbb },{ 0x9e5a, 0x9dbf }, { 0x9e5c, 0x9da9 },{ 0x9e5e, 0x9dc2 },{ 0x9e63, 0x9dbc },{ 0x9e64, 0x9db4 }, { 0x9e66, 0x9e1a },{ 0x9e67, 0x9dd3 },{ 0x9e68, 0x9dda },{ 0x9e69, 0x9def }, { 0x9e6a, 0x9de6 },{ 0x9e6b, 0x9df2 },{ 0x9e6c, 0x9df8 },{ 0x9e6d, 0x9dfa }, { 0x9e70, 0x9df9 },{ 0x9e73, 0x9e1b },{ 0x9e7e, 0x9e7a },{ 0x9ea6, 0x9ea5 }, { 0x9eb8, 0x9ea9 },{ 0x9ebd, 0x9ebc },{ 0x9ec4, 0x9ec3 },{ 0x9ec9, 0x9ecc }, { 0x9ee9, 0x9ef7 },{ 0x9eea, 0x9ef2 },{ 0x9efe, 0x9efd },{ 0x9f0b, 0x9eff }, { 0x9f0d, 0x9f09 },{ 0x9f39, 0x9f34 },{ 0x9f50, 0x9f4a },{ 0x9f51, 0x9f4f }, { 0x9f7f, 0x9f52 },{ 0x9f80, 0x9f54 },{ 0x9f83, 0x9f5f },{ 0x9f84, 0x9f61 }, { 0x9f85, 0x9f59 },{ 0x9f86, 0x9f60 },{ 0x9f87, 0x9f5c },{ 0x9f88, 0x9f66 }, { 0x9f89, 0x9f6c },{ 0x9f8a, 0x9f6a },{ 0x9f8b, 0x9f72 },{ 0x9f8c, 0x9f77 }, { 0x9f99, 0x9f8d },{ 0x9f9a, 0x9f94 },{ 0x9f9b, 0x9f95 },{ 0x9f9f, 0x9f9c }, { 0xff02, 0x301e },{ 0xff3b, 0xfe5d },{ 0xff3d, 0xfe5e },{ 0xff40, 0x2035 } }; const static NabiUnicharPair nabi_tc_to_sc_table[] = { { 0x00af, 0x02c9 },{ 0x00b7, 0x30fb },{ 0x03a0, 0x220f },{ 0x03a3, 0x2211 }, { 0x2025, 0x00a8 },{ 0x2027, 0x30fb },{ 0x2035, 0xff40 },{ 0x2225, 0x2016 }, { 0x2252, 0x2248 },{ 0x2266, 0x2264 },{ 0x2267, 0x2265 },{ 0x2500, 0x2015 }, { 0x2571, 0xff0f },{ 0x2572, 0xff3c },{ 0x2574, 0xff3f },{ 0x301d, 0xff02 }, { 0x301e, 0x2033 },{ 0x4e1f, 0x4e22 },{ 0x4e26, 0x5e76 },{ 0x4e3c, 0x4e95 }, { 0x4e7e, 0x5e72 },{ 0x4e82, 0x4e71 },{ 0x4e99, 0x4e98 },{ 0x4e9e, 0x4e9a }, { 0x4f15, 0x592b },{ 0x4f47, 0x4f2b },{ 0x4f48, 0x5e03 },{ 0x4f54, 0x5360 }, { 0x4f6a, 0x5f8a },{ 0x4f75, 0x5e76 },{ 0x4f86, 0x6765 },{ 0x4f96, 0x4ed1 }, { 0x4f9a, 0x5f87 },{ 0x4fb6, 0x4fa3 },{ 0x4fb7, 0x5c40 },{ 0x4fc1, 0x4fe3 }, { 0x4fc2, 0x7cfb },{ 0x4fe0, 0x4fa0 },{ 0x5000, 0x4f25 },{ 0x5006, 0x4fe9 }, { 0x5009, 0x4ed3 },{ 0x500b, 0x4e2a },{ 0x5011, 0x4eec },{ 0x5016, 0x5e78 }, { 0x5023, 0x4eff },{ 0x502b, 0x4f26 },{ 0x5049, 0x4f1f },{ 0x506a, 0x903c }, { 0x5074, 0x4fa7 },{ 0x5075, 0x4fa6 },{ 0x507a, 0x54b1 },{ 0x507d, 0x4f2a }, { 0x5091, 0x6770 },{ 0x5096, 0x4f27 },{ 0x5098, 0x4f1e },{ 0x5099, 0x5907 }, { 0x509a, 0x6548 },{ 0x50a2, 0x5bb6 },{ 0x50ad, 0x4f63 },{ 0x50af, 0x506c }, { 0x50b3, 0x4f20 },{ 0x50b4, 0x4f1b },{ 0x50b5, 0x503a },{ 0x50b7, 0x4f24 }, { 0x50be, 0x503e },{ 0x50c2, 0x507b },{ 0x50c5, 0x4ec5 },{ 0x50c9, 0x4f65 }, { 0x50ca, 0x4ed9 },{ 0x50d1, 0x4fa8 },{ 0x50d5, 0x4ec6 },{ 0x50e3, 0x50ed }, { 0x50e5, 0x4fa5 },{ 0x50e8, 0x507e },{ 0x50f1, 0x96c7 },{ 0x50f9, 0x4ef7 }, { 0x5100, 0x4eea },{ 0x5102, 0x4fac },{ 0x5104, 0x4ebf },{ 0x5105, 0x5f53 }, { 0x5108, 0x4fa9 },{ 0x5109, 0x4fed },{ 0x5110, 0x50a7 },{ 0x5114, 0x4fe6 }, { 0x5115, 0x4faa },{ 0x5118, 0x5c3d },{ 0x511f, 0x507f },{ 0x512a, 0x4f18 }, { 0x5132, 0x50a8 },{ 0x5137, 0x4fea },{ 0x5138, 0x7f57 },{ 0x513a, 0x50a9 }, { 0x513b, 0x50a5 },{ 0x513c, 0x4fe8 },{ 0x5147, 0x51f6 },{ 0x514c, 0x5151 }, { 0x5152, 0x513f },{ 0x5157, 0x5156 },{ 0x5167, 0x5185 },{ 0x5169, 0x4e24 }, { 0x518a, 0x518c },{ 0x5191, 0x80c4 },{ 0x51aa, 0x5e42 },{ 0x51c5, 0x6db8 }, { 0x51c8, 0x51c0 },{ 0x51cd, 0x51bb },{ 0x51dc, 0x51db },{ 0x51f1, 0x51ef }, { 0x5225, 0x522b },{ 0x522a, 0x5220 },{ 0x5244, 0x522d },{ 0x5247, 0x5219 }, { 0x5249, 0x9509 },{ 0x524b, 0x514b },{ 0x524e, 0x5239 },{ 0x525b, 0x521a }, { 0x525d, 0x5265 },{ 0x526e, 0x5250 },{ 0x5274, 0x5240 },{ 0x5275, 0x521b }, { 0x5277, 0x94f2 },{ 0x5283, 0x5212 },{ 0x5284, 0x672d },{ 0x5287, 0x5267 }, { 0x5289, 0x5218 },{ 0x528a, 0x523d },{ 0x528c, 0x523f },{ 0x528d, 0x5251 }, { 0x5291, 0x5242 },{ 0x52bb, 0x5321 },{ 0x52c1, 0x52b2 },{ 0x52d5, 0x52a8 }, { 0x52d7, 0x52d6 },{ 0x52d9, 0x52a1 },{ 0x52db, 0x52cb },{ 0x52dd, 0x80dc }, { 0x52de, 0x52b3 },{ 0x52e2, 0x52bf },{ 0x52e3, 0x7ee9 },{ 0x52e6, 0x527f }, { 0x52f1, 0x52a2 },{ 0x52f3, 0x52cb },{ 0x52f5, 0x52b1 },{ 0x52f8, 0x529d }, { 0x52fb, 0x5300 },{ 0x530b, 0x9676 },{ 0x532d, 0x5326 },{ 0x532f, 0x6c47 }, { 0x5331, 0x532e },{ 0x5340, 0x533a },{ 0x5344, 0x5eff },{ 0x5354, 0x534f }, { 0x536c, 0x6602 },{ 0x5379, 0x6064 },{ 0x537b, 0x5374 },{ 0x5399, 0x538d }, { 0x53ad, 0x538c },{ 0x53b2, 0x5389 },{ 0x53b4, 0x53a3 },{ 0x53c3, 0x53c2 }, { 0x53e1, 0x777f },{ 0x53e2, 0x4e1b },{ 0x540b, 0x5bf8 },{ 0x5433, 0x5434 }, { 0x5436, 0x5450 },{ 0x5442, 0x5415 },{ 0x544e, 0x5c3a },{ 0x54b7, 0x5555 }, { 0x54bc, 0x5459 },{ 0x54e1, 0x5458 },{ 0x5504, 0x5457 },{ 0x5538, 0x5ff5 }, { 0x554f, 0x95ee },{ 0x5557, 0x5556 },{ 0x555e, 0x54d1 },{ 0x555f, 0x542f }, { 0x5563, 0x8854 },{ 0x559a, 0x5524 },{ 0x55aa, 0x4e27 },{ 0x55ab, 0x5403 }, { 0x55ac, 0x4e54 },{ 0x55ae, 0x5355 },{ 0x55b2, 0x54df },{ 0x55c6, 0x545b }, { 0x55c7, 0x556c },{ 0x55ce, 0x5417 },{ 0x55da, 0x545c },{ 0x55e9, 0x5522 }, { 0x55f6, 0x54d4 },{ 0x5606, 0x53f9 },{ 0x560d, 0x55bd },{ 0x5614, 0x5455 }, { 0x5616, 0x5567 },{ 0x5617, 0x5c1d },{ 0x561c, 0x551b },{ 0x5629, 0x54d7 }, { 0x562e, 0x5520 },{ 0x562f, 0x5578 },{ 0x5630, 0x53fd },{ 0x5635, 0x54d3 }, { 0x5638, 0x5452 },{ 0x5641, 0x6076 },{ 0x5653, 0x5618 },{ 0x5660, 0x54d2 }, { 0x5665, 0x54dd },{ 0x5666, 0x54d5 },{ 0x566f, 0x55f3 },{ 0x5672, 0x54d9 }, { 0x5674, 0x55b7 },{ 0x5678, 0x5428 },{ 0x5679, 0x5f53 },{ 0x5680, 0x549b }, { 0x5687, 0x5413 },{ 0x568c, 0x54dc },{ 0x5690, 0x5c1d },{ 0x5695, 0x565c }, { 0x5699, 0x556e },{ 0x56a5, 0x54bd },{ 0x56a6, 0x5456 },{ 0x56a8, 0x5499 }, { 0x56ae, 0x5411 },{ 0x56b3, 0x55be },{ 0x56b4, 0x4e25 },{ 0x56b6, 0x5624 }, { 0x56c0, 0x556d },{ 0x56c1, 0x55eb },{ 0x56c2, 0x56a3 },{ 0x56c5, 0x5181 }, { 0x56c8, 0x5453 },{ 0x56c9, 0x7f57 },{ 0x56cc, 0x82cf },{ 0x56d1, 0x5631 }, { 0x56d3, 0x556e },{ 0x56ea, 0x56f1 },{ 0x5707, 0x56f5 },{ 0x570b, 0x56fd }, { 0x570d, 0x56f4 },{ 0x5712, 0x56ed },{ 0x5713, 0x5706 },{ 0x5716, 0x56fe }, { 0x5718, 0x56e2 },{ 0x5775, 0x4e18 },{ 0x57dc, 0x91ce },{ 0x57e1, 0x57ad }, { 0x57f7, 0x6267 },{ 0x57fc, 0x5d0e },{ 0x5805, 0x575a },{ 0x580a, 0x57a9 }, { 0x581d, 0x57da },{ 0x582f, 0x5c27 },{ 0x5831, 0x62a5 },{ 0x5834, 0x573a }, { 0x583f, 0x78b1 },{ 0x584a, 0x5757 },{ 0x584b, 0x8314 },{ 0x584f, 0x57b2 }, { 0x5852, 0x57d8 },{ 0x5857, 0x6d82 },{ 0x585a, 0x51a2 },{ 0x5862, 0x575e }, { 0x5864, 0x57d9 },{ 0x5875, 0x5c18 },{ 0x5879, 0x5811 },{ 0x588a, 0x57ab }, { 0x5891, 0x5892 },{ 0x589c, 0x5760 },{ 0x58ab, 0x6a3d },{ 0x58ae, 0x5815 }, { 0x58b3, 0x575f },{ 0x58bb, 0x5899 },{ 0x58be, 0x57a6 },{ 0x58c7, 0x575b }, { 0x58ce, 0x57d9 },{ 0x58d3, 0x538b },{ 0x58d8, 0x5792 },{ 0x58d9, 0x5739 }, { 0x58da, 0x5786 },{ 0x58de, 0x574f },{ 0x58df, 0x5784 },{ 0x58e2, 0x575c }, { 0x58e9, 0x575d },{ 0x58ef, 0x58ee },{ 0x58fa, 0x58f6 },{ 0x58fd, 0x5bff }, { 0x5920, 0x591f },{ 0x5922, 0x68a6 },{ 0x5925, 0x4f19 },{ 0x593e, 0x5939 }, { 0x5950, 0x5942 },{ 0x5967, 0x5965 },{ 0x5969, 0x5941 },{ 0x596a, 0x593a }, { 0x596e, 0x594b },{ 0x599d, 0x5986 },{ 0x59b3, 0x4f60 },{ 0x59cd, 0x59d7 }, { 0x59e6, 0x5978 },{ 0x59ea, 0x4f84 },{ 0x5a1b, 0x5a31 },{ 0x5a41, 0x5a04 }, { 0x5a66, 0x5987 },{ 0x5a6c, 0x6deb },{ 0x5a6d, 0x5a05 },{ 0x5aa7, 0x5a32 }, { 0x5aae, 0x5077 },{ 0x5aaf, 0x59ab },{ 0x5abc, 0x5aaa },{ 0x5abd, 0x5988 }, { 0x5abf, 0x6127 },{ 0x5acb, 0x8885 },{ 0x5ad7, 0x59aa },{ 0x5af5, 0x59a9 }, { 0x5afb, 0x5a34 },{ 0x5b08, 0x5a06 },{ 0x5b0b, 0x5a75 },{ 0x5b0c, 0x5a07 }, { 0x5b19, 0x5af1 },{ 0x5b1d, 0x8885 },{ 0x5b21, 0x5ad2 },{ 0x5b24, 0x5b37 }, { 0x5b2a, 0x5ad4 },{ 0x5b2d, 0x5976 },{ 0x5b30, 0x5a74 },{ 0x5b38, 0x5a76 }, { 0x5b43, 0x5a18 },{ 0x5b4c, 0x5a08 },{ 0x5b6b, 0x5b59 },{ 0x5b78, 0x5b66 }, { 0x5b7f, 0x5b6a },{ 0x5bae, 0x5bab },{ 0x5bd8, 0x7f6e },{ 0x5be2, 0x5bdd }, { 0x5be6, 0x5b9e },{ 0x5be7, 0x5b81 },{ 0x5be9, 0x5ba1 },{ 0x5beb, 0x5199 }, { 0x5bec, 0x5bbd },{ 0x5bf5, 0x5ba0 },{ 0x5bf6, 0x5b9d },{ 0x5c07, 0x5c06 }, { 0x5c08, 0x4e13 },{ 0x5c0b, 0x5bfb },{ 0x5c0d, 0x5bf9 },{ 0x5c0e, 0x5bfc }, { 0x5c37, 0x5c34 },{ 0x5c46, 0x5c4a },{ 0x5c4d, 0x5c38 },{ 0x5c5c, 0x5c49 }, { 0x5c5d, 0x6249 },{ 0x5c62, 0x5c61 },{ 0x5c64, 0x5c42 },{ 0x5c68, 0x5c66 }, { 0x5c6c, 0x5c5e },{ 0x5ca1, 0x5188 },{ 0x5cf4, 0x5c98 },{ 0x5cf6, 0x5c9b }, { 0x5cfd, 0x5ce1 },{ 0x5d0d, 0x5d03 },{ 0x5d11, 0x6606 },{ 0x5d17, 0x5c97 }, { 0x5d19, 0x4ed1 },{ 0x5d20, 0x5cbd },{ 0x5d22, 0x5ce5 },{ 0x5d33, 0x5d5b }, { 0x5d50, 0x5c9a },{ 0x5d52, 0x5ca9 },{ 0x5d81, 0x5d5d },{ 0x5d84, 0x5d2d }, { 0x5d87, 0x5c96 },{ 0x5d97, 0x5d02 },{ 0x5da0, 0x5ce4 },{ 0x5da7, 0x5cc4 }, { 0x5db8, 0x5d58 },{ 0x5dba, 0x5cad },{ 0x5dbc, 0x5c7f },{ 0x5dbd, 0x5cb3 }, { 0x5dcb, 0x5cbf },{ 0x5dd2, 0x5ce6 },{ 0x5dd4, 0x5dc5 },{ 0x5dd6, 0x5ca9 }, { 0x5df0, 0x5def },{ 0x5df9, 0x537a },{ 0x5e25, 0x5e05 },{ 0x5e2b, 0x5e08 }, { 0x5e33, 0x5e10 },{ 0x5e36, 0x5e26 },{ 0x5e40, 0x5e27 },{ 0x5e43, 0x5e0f }, { 0x5e57, 0x5e3c },{ 0x5e58, 0x5e3b },{ 0x5e5f, 0x5e1c },{ 0x5e63, 0x5e01 }, { 0x5e6b, 0x5e2e },{ 0x5e6c, 0x5e31 },{ 0x5e75, 0x5f00 },{ 0x5e79, 0x5e72 }, { 0x5e7e, 0x51e0 },{ 0x5e82, 0x4ec4 },{ 0x5eab, 0x5e93 },{ 0x5ec1, 0x5395 }, { 0x5ec2, 0x53a2 },{ 0x5ec4, 0x53a9 },{ 0x5ec8, 0x53a6 },{ 0x5eda, 0x53a8 }, { 0x5edd, 0x53ae },{ 0x5edf, 0x5e99 },{ 0x5ee0, 0x5382 },{ 0x5ee1, 0x5e91 }, { 0x5ee2, 0x5e9f },{ 0x5ee3, 0x5e7f },{ 0x5ee9, 0x5eea },{ 0x5eec, 0x5e90 }, { 0x5ef1, 0x75c8 },{ 0x5ef3, 0x5385 },{ 0x5f12, 0x5f11 },{ 0x5f14, 0x540a }, { 0x5f33, 0x5f2a },{ 0x5f35, 0x5f20 },{ 0x5f37, 0x5f3a },{ 0x5f46, 0x522b }, { 0x5f48, 0x5f39 },{ 0x5f4a, 0x5f3a },{ 0x5f4c, 0x5f25 },{ 0x5f4e, 0x5f2f }, { 0x5f59, 0x6c47 },{ 0x5f65, 0x5f66 },{ 0x5f6b, 0x96d5 },{ 0x5f7f, 0x4f5b }, { 0x5f8c, 0x540e },{ 0x5f91, 0x5f84 },{ 0x5f9e, 0x4ece },{ 0x5fa0, 0x5f95 }, { 0x5fa9, 0x590d },{ 0x5fac, 0x65c1 },{ 0x5fb9, 0x5f7b },{ 0x6046, 0x6052 }, { 0x6065, 0x803b },{ 0x6085, 0x60a6 },{ 0x60b5, 0x6005 },{ 0x60b6, 0x95f7 }, { 0x60bd, 0x51c4 },{ 0x60c7, 0x6566 },{ 0x60e1, 0x6076 },{ 0x60f1, 0x607c }, { 0x60f2, 0x607d },{ 0x60f7, 0x8822 },{ 0x60fb, 0x607b },{ 0x611b, 0x7231 }, { 0x611c, 0x60ec },{ 0x6128, 0x60ab },{ 0x6134, 0x6006 },{ 0x6137, 0x607a }, { 0x613e, 0x5ffe },{ 0x6144, 0x6817 },{ 0x6147, 0x6bb7 },{ 0x614b, 0x6001 }, { 0x614d, 0x6120 },{ 0x6158, 0x60e8 },{ 0x615a, 0x60ed },{ 0x615f, 0x6078 }, { 0x6163, 0x60ef },{ 0x616a, 0x6004 },{ 0x616b, 0x6002 },{ 0x616e, 0x8651 }, { 0x6173, 0x60ad },{ 0x6176, 0x5e86 },{ 0x617c, 0x621a },{ 0x617e, 0x6b32 }, { 0x6182, 0x5fe7 },{ 0x618a, 0x60eb },{ 0x6190, 0x601c },{ 0x6191, 0x51ed }, { 0x6192, 0x6126 },{ 0x619a, 0x60ee },{ 0x61a4, 0x6124 },{ 0x61ab, 0x60af }, { 0x61ae, 0x6003 },{ 0x61b2, 0x5baa },{ 0x61b6, 0x5fc6 },{ 0x61c3, 0x52e4 }, { 0x61c7, 0x6073 },{ 0x61c9, 0x5e94 },{ 0x61cc, 0x603f },{ 0x61cd, 0x61d4 }, { 0x61de, 0x8499 },{ 0x61df, 0x603c },{ 0x61e3, 0x61d1 },{ 0x61e8, 0x6079 }, { 0x61f2, 0x60e9 },{ 0x61f6, 0x61d2 },{ 0x61f7, 0x6000 },{ 0x61f8, 0x60ac }, { 0x61fa, 0x5fcf },{ 0x61fc, 0x60e7 },{ 0x61fe, 0x6151 },{ 0x6200, 0x604b }, { 0x6207, 0x6206 },{ 0x6209, 0x94ba },{ 0x6214, 0x620b },{ 0x6227, 0x6217 }, { 0x6229, 0x622c },{ 0x6230, 0x6218 },{ 0x6232, 0x620f },{ 0x6236, 0x6237 }, { 0x6250, 0x4ec2 },{ 0x625e, 0x634d },{ 0x6271, 0x63d2 },{ 0x627a, 0x62b5 }, { 0x6283, 0x62da },{ 0x6294, 0x62b1 },{ 0x62b4, 0x66f3 },{ 0x62cb, 0x629b }, { 0x62d1, 0x94b3 },{ 0x630c, 0x683c },{ 0x6336, 0x5c40 },{ 0x633e, 0x631f }, { 0x6368, 0x820d },{ 0x636b, 0x626a },{ 0x6372, 0x5377 },{ 0x6383, 0x626b }, { 0x6384, 0x62a1 },{ 0x6399, 0x6323 },{ 0x639b, 0x6302 },{ 0x63a1, 0x91c7 }, { 0x63c0, 0x62e3 },{ 0x63da, 0x626c },{ 0x63db, 0x6362 },{ 0x63ee, 0x6325 }, { 0x63f9, 0x80cc },{ 0x6406, 0x6784 },{ 0x640d, 0x635f },{ 0x6416, 0x6447 }, { 0x6417, 0x6363 },{ 0x641f, 0x64c0 },{ 0x6425, 0x6376 },{ 0x6428, 0x6253 }, { 0x642f, 0x638f },{ 0x6436, 0x62a2 },{ 0x643e, 0x69a8 },{ 0x6440, 0x6342 }, { 0x6443, 0x625b },{ 0x6451, 0x63b4 },{ 0x645c, 0x63bc },{ 0x645f, 0x6402 }, { 0x646f, 0x631a },{ 0x6473, 0x62a0 },{ 0x6476, 0x629f },{ 0x647b, 0x63ba }, { 0x6488, 0x635e },{ 0x6490, 0x6491 },{ 0x6493, 0x6320 },{ 0x649a, 0x637b }, { 0x649f, 0x6322 },{ 0x64a2, 0x63b8 },{ 0x64a3, 0x63b8 },{ 0x64a5, 0x62e8 }, { 0x64a6, 0x626f },{ 0x64ab, 0x629a },{ 0x64b2, 0x6251 },{ 0x64b3, 0x63ff }, { 0x64bb, 0x631e },{ 0x64be, 0x631d },{ 0x64bf, 0x6361 },{ 0x64c1, 0x62e5 }, { 0x64c4, 0x63b3 },{ 0x64c7, 0x62e9 },{ 0x64ca, 0x51fb },{ 0x64cb, 0x6321 }, { 0x64d4, 0x62c5 },{ 0x64da, 0x636e },{ 0x64e0, 0x6324 },{ 0x64e3, 0x6363 }, { 0x64ec, 0x62df },{ 0x64ef, 0x6448 },{ 0x64f0, 0x62e7 },{ 0x64f1, 0x6401 }, { 0x64f2, 0x63b7 },{ 0x64f4, 0x6269 },{ 0x64f7, 0x64b7 },{ 0x64fa, 0x6446 }, { 0x64fb, 0x64de },{ 0x64fc, 0x64b8 },{ 0x64fe, 0x6270 },{ 0x6504, 0x6445 }, { 0x6506, 0x64b5 },{ 0x650f, 0x62e2 },{ 0x6514, 0x62e6 },{ 0x6516, 0x6484 }, { 0x6519, 0x6400 },{ 0x651b, 0x64ba },{ 0x651c, 0x643a },{ 0x651d, 0x6444 }, { 0x6522, 0x6512 },{ 0x6523, 0x631b },{ 0x6524, 0x644a },{ 0x652a, 0x6405 }, { 0x652c, 0x63fd },{ 0x6537, 0x8003 },{ 0x6557, 0x8d25 },{ 0x6558, 0x53d9 }, { 0x6575, 0x654c },{ 0x6578, 0x6570 },{ 0x6582, 0x655b },{ 0x6583, 0x6bd9 }, { 0x6595, 0x6593 },{ 0x65ac, 0x65a9 },{ 0x65b7, 0x65ad },{ 0x65c2, 0x65d7 }, { 0x65db, 0x5e61 },{ 0x6607, 0x5347 },{ 0x6642, 0x65f6 },{ 0x6649, 0x664b }, { 0x665d, 0x663c },{ 0x665e, 0x66e6 },{ 0x6662, 0x6670 },{ 0x667b, 0x6697 }, { 0x6688, 0x6655 },{ 0x6689, 0x6656 },{ 0x6698, 0x9633 },{ 0x66a2, 0x7545 }, { 0x66ab, 0x6682 },{ 0x66b1, 0x6635 },{ 0x66b8, 0x4e86 },{ 0x66c4, 0x6654 }, { 0x66c6, 0x5386 },{ 0x66c7, 0x6619 },{ 0x66c9, 0x6653 },{ 0x66cf, 0x5411 }, { 0x66d6, 0x66a7 },{ 0x66e0, 0x65f7 },{ 0x66ec, 0x6652 },{ 0x66f8, 0x4e66 }, { 0x6703, 0x4f1a },{ 0x6722, 0x671b },{ 0x6727, 0x80e7 },{ 0x672e, 0x672f }, { 0x6747, 0x572c },{ 0x6771, 0x4e1c },{ 0x67b4, 0x62d0 },{ 0x67f5, 0x6805 }, { 0x67fa, 0x62d0 },{ 0x6812, 0x65ec },{ 0x686e, 0x676f },{ 0x687f, 0x6746 }, { 0x6894, 0x6800 },{ 0x689d, 0x6761 },{ 0x689f, 0x67ad },{ 0x68b1, 0x6346 }, { 0x68c4, 0x5f03 },{ 0x68d6, 0x67a8 },{ 0x68d7, 0x67a3 },{ 0x68df, 0x680b }, { 0x68e7, 0x6808 },{ 0x68f2, 0x6816 },{ 0x690f, 0x6860 },{ 0x6944, 0x533e }, { 0x694a, 0x6768 },{ 0x6953, 0x67ab },{ 0x6959, 0x8302 },{ 0x695c, 0x80e1 }, { 0x6968, 0x6862 },{ 0x696d, 0x4e1a },{ 0x6975, 0x6781 },{ 0x69a6, 0x5e72 }, { 0x69aa, 0x6769 },{ 0x69ae, 0x8363 },{ 0x69bf, 0x6864 },{ 0x69c3, 0x76d8 }, { 0x69cb, 0x6784 },{ 0x69cd, 0x67aa },{ 0x69d3, 0x6760 },{ 0x69e7, 0x6920 }, { 0x69e8, 0x6901 },{ 0x69f3, 0x6868 },{ 0x6a01, 0x6869 },{ 0x6a02, 0x4e50 }, { 0x6a05, 0x679e },{ 0x6a11, 0x6881 },{ 0x6a13, 0x697c },{ 0x6a19, 0x6807 }, { 0x6a1e, 0x67a2 },{ 0x6a23, 0x6837 },{ 0x6a38, 0x6734 },{ 0x6a39, 0x6811 }, { 0x6a3a, 0x6866 },{ 0x6a48, 0x6861 },{ 0x6a4b, 0x6865 },{ 0x6a5f, 0x673a }, { 0x6a62, 0x692d },{ 0x6a66, 0x5e62 },{ 0x6a6b, 0x6a2a },{ 0x6a81, 0x6aa9 }, { 0x6a89, 0x67fd },{ 0x6a94, 0x6863 },{ 0x6a9c, 0x6867 },{ 0x6aa2, 0x68c0 }, { 0x6aa3, 0x6a2f },{ 0x6aaf, 0x53f0 },{ 0x6ab3, 0x69df },{ 0x6ab8, 0x67e0 }, { 0x6abb, 0x69db },{ 0x6ac2, 0x68f9 },{ 0x6ac3, 0x67dc },{ 0x6ad0, 0x7d2f }, { 0x6ad3, 0x6a79 },{ 0x6ada, 0x6988 },{ 0x6adb, 0x6809 },{ 0x6add, 0x691f }, { 0x6ade, 0x6a7c },{ 0x6adf, 0x680e },{ 0x6ae5, 0x6a71 },{ 0x6ae7, 0x69e0 }, { 0x6ae8, 0x680c },{ 0x6aea, 0x67a5 },{ 0x6aeb, 0x6a65 },{ 0x6aec, 0x6987 }, { 0x6af3, 0x680a },{ 0x6af8, 0x6989 },{ 0x6afa, 0x68c2 },{ 0x6afb, 0x6a31 }, { 0x6b04, 0x680f },{ 0x6b0a, 0x6743 },{ 0x6b0f, 0x6924 },{ 0x6b12, 0x683e }, { 0x6b16, 0x6984 },{ 0x6b1e, 0x68c2 },{ 0x6b38, 0x5509 },{ 0x6b3d, 0x94a6 }, { 0x6b4e, 0x53f9 },{ 0x6b50, 0x6b27 },{ 0x6b5f, 0x6b24 },{ 0x6b61, 0x6b22 }, { 0x6b72, 0x5c81 },{ 0x6b77, 0x5386 },{ 0x6b78, 0x5f52 },{ 0x6b7f, 0x6b81 }, { 0x6b80, 0x592d },{ 0x6b98, 0x6b8b },{ 0x6b9e, 0x6b92 },{ 0x6ba4, 0x6b87 }, { 0x6bab, 0x6b9a },{ 0x6bad, 0x50f5 },{ 0x6bae, 0x6b93 },{ 0x6baf, 0x6ba1 }, { 0x6bb2, 0x6b7c },{ 0x6bba, 0x6740 },{ 0x6bbc, 0x58f3 },{ 0x6bbd, 0x80b4 }, { 0x6bc0, 0x6bc1 },{ 0x6bc6, 0x6bb4 },{ 0x6bcc, 0x6bcb },{ 0x6bd8, 0x6bd7 }, { 0x6bec, 0x7403 },{ 0x6bff, 0x6bf5 },{ 0x6c08, 0x6be1 },{ 0x6c0c, 0x6c07 }, { 0x6c23, 0x6c14 },{ 0x6c2b, 0x6c22 },{ 0x6c2c, 0x6c29 },{ 0x6c33, 0x6c32 }, { 0x6c3e, 0x6cdb },{ 0x6c46, 0x6c3d },{ 0x6c4d, 0x4e38 },{ 0x6c4e, 0x6cdb }, { 0x6c59, 0x6c61 },{ 0x6c7a, 0x51b3 },{ 0x6c8d, 0x51b1 },{ 0x6c92, 0x6ca1 }, { 0x6c96, 0x51b2 },{ 0x6cc1, 0x51b5 },{ 0x6cdd, 0x6eaf },{ 0x6d1f, 0x6d95 }, { 0x6d29, 0x6cc4 },{ 0x6d36, 0x6c79 },{ 0x6d6c, 0x91cc },{ 0x6d79, 0x6d43 }, { 0x6d87, 0x6cfe },{ 0x6dbc, 0x51c9 },{ 0x6dd2, 0x51c4 },{ 0x6dda, 0x6cea }, { 0x6de5, 0x6e0c },{ 0x6de8, 0x51c0 },{ 0x6dea, 0x6ca6 },{ 0x6df5, 0x6e0a }, { 0x6df6, 0x6d9e },{ 0x6dfa, 0x6d45 },{ 0x6e19, 0x6da3 },{ 0x6e1b, 0x51cf }, { 0x6e26, 0x6da1 },{ 0x6e2c, 0x6d4b },{ 0x6e3e, 0x6d51 },{ 0x6e4a, 0x51d1 }, { 0x6e5e, 0x6d48 },{ 0x6e63, 0x95f5 },{ 0x6e67, 0x6d8c },{ 0x6e6f, 0x6c64 }, { 0x6e88, 0x6ca9 },{ 0x6e96, 0x51c6 },{ 0x6e9d, 0x6c9f },{ 0x6eab, 0x6e29 }, { 0x6ebc, 0x6e7f },{ 0x6ec4, 0x6ca7 },{ 0x6ec5, 0x706d },{ 0x6ecc, 0x6da4 }, { 0x6ece, 0x8365 },{ 0x6eec, 0x6caa },{ 0x6eef, 0x6ede },{ 0x6ef2, 0x6e17 }, { 0x6ef7, 0x5364 },{ 0x6ef8, 0x6d52 },{ 0x6efe, 0x6eda },{ 0x6eff, 0x6ee1 }, { 0x6f01, 0x6e14 },{ 0x6f1a, 0x6ca4 },{ 0x6f22, 0x6c49 },{ 0x6f23, 0x6d9f }, { 0x6f2c, 0x6e0d },{ 0x6f32, 0x6da8 },{ 0x6f35, 0x6e86 },{ 0x6f38, 0x6e10 }, { 0x6f3f, 0x6d46 },{ 0x6f41, 0x988d },{ 0x6f51, 0x6cfc },{ 0x6f54, 0x6d01 }, { 0x6f5b, 0x6f5c },{ 0x6f5f, 0x8204 },{ 0x6f64, 0x6da6 },{ 0x6f6f, 0x6d54 }, { 0x6f70, 0x6e83 },{ 0x6f77, 0x6ed7 },{ 0x6f7f, 0x6da0 },{ 0x6f80, 0x6da9 }, { 0x6f82, 0x6f84 },{ 0x6f86, 0x6d47 },{ 0x6f87, 0x6d9d },{ 0x6f94, 0x6d69 }, { 0x6f97, 0x6da7 },{ 0x6fa0, 0x6e11 },{ 0x6fa4, 0x6cfd },{ 0x6fa9, 0x6cf6 }, { 0x6fae, 0x6d4d },{ 0x6fb1, 0x6dc0 },{ 0x6fc1, 0x6d4a },{ 0x6fc3, 0x6d53 }, { 0x6fd5, 0x6e7f },{ 0x6fd8, 0x6cde },{ 0x6fdb, 0x8499 },{ 0x6fdf, 0x6d4e }, { 0x6fe4, 0x6d9b },{ 0x6feb, 0x6ee5 },{ 0x6fec, 0x6d5a },{ 0x6ff0, 0x6f4d }, { 0x6ff1, 0x6ee8 },{ 0x6ffa, 0x6e85 },{ 0x6ffc, 0x6cfa },{ 0x6ffe, 0x6ee4 }, { 0x7001, 0x6f3e },{ 0x7005, 0x6ee2 },{ 0x7006, 0x6e0e },{ 0x7009, 0x6cfb }, { 0x700b, 0x6c88 },{ 0x700f, 0x6d4f },{ 0x7015, 0x6fd2 },{ 0x7018, 0x6cf8 }, { 0x701d, 0x6ca5 },{ 0x701f, 0x6f47 },{ 0x7020, 0x6f46 },{ 0x7026, 0x6f74 }, { 0x7027, 0x6cf7 },{ 0x7028, 0x6fd1 },{ 0x7030, 0x5f25 },{ 0x7032, 0x6f4b }, { 0x703e, 0x6f9c },{ 0x7043, 0x6ca3 },{ 0x7044, 0x6ee0 },{ 0x7051, 0x6d12 }, { 0x7055, 0x6f13 },{ 0x7058, 0x6ee9 },{ 0x705d, 0x704f },{ 0x7063, 0x6e7e }, { 0x7064, 0x6ee6 },{ 0x7069, 0x6edf },{ 0x707d, 0x707e },{ 0x70a4, 0x7167 }, { 0x70b0, 0x70ae },{ 0x70ba, 0x4e3a },{ 0x70cf, 0x4e4c },{ 0x70f4, 0x70c3 }, { 0x7121, 0x65e0 },{ 0x7149, 0x70bc },{ 0x7152, 0x709c },{ 0x7156, 0x6696 }, { 0x7159, 0x70df },{ 0x7162, 0x8315 },{ 0x7165, 0x7115 },{ 0x7169, 0x70e6 }, { 0x716c, 0x7080 },{ 0x7192, 0x8367 },{ 0x7197, 0x709d },{ 0x71b1, 0x70ed }, { 0x71be, 0x70bd },{ 0x71c1, 0x70e8 },{ 0x71c4, 0x7130 },{ 0x71c8, 0x706f }, { 0x71c9, 0x7096 },{ 0x71d0, 0x78f7 },{ 0x71d2, 0x70e7 },{ 0x71d9, 0x70eb }, { 0x71dc, 0x7116 },{ 0x71df, 0x8425 },{ 0x71e6, 0x707f },{ 0x71ec, 0x6bc1 }, { 0x71ed, 0x70db },{ 0x71f4, 0x70e9 },{ 0x71fb, 0x718f },{ 0x71fc, 0x70ec }, { 0x71fe, 0x7118 },{ 0x71ff, 0x8000 },{ 0x720d, 0x70c1 },{ 0x7210, 0x7089 }, { 0x721b, 0x70c2 },{ 0x722d, 0x4e89 },{ 0x723a, 0x7237 },{ 0x723e, 0x5c14 }, { 0x7246, 0x5899 },{ 0x7258, 0x724d },{ 0x7260, 0x5b83 },{ 0x7274, 0x62b5 }, { 0x727d, 0x7275 },{ 0x7296, 0x8366 },{ 0x729b, 0x7266 },{ 0x72a2, 0x728a }, { 0x72a7, 0x727a },{ 0x72c0, 0x72b6 },{ 0x72da, 0x65e6 },{ 0x72f9, 0x72ed }, { 0x72fd, 0x72c8 },{ 0x7319, 0x72f0 },{ 0x7336, 0x72b9 },{ 0x733b, 0x72f2 }, { 0x7343, 0x5446 },{ 0x7344, 0x72f1 },{ 0x7345, 0x72ee },{ 0x734e, 0x5956 }, { 0x7368, 0x72ec },{ 0x736a, 0x72ef },{ 0x736b, 0x7303 },{ 0x7370, 0x72de }, { 0x7372, 0x83b7 },{ 0x7375, 0x730e },{ 0x7377, 0x72b7 },{ 0x7378, 0x517d }, { 0x737a, 0x736d },{ 0x737b, 0x732e },{ 0x737c, 0x7315 },{ 0x7380, 0x7321 }, { 0x7385, 0x5999 },{ 0x7386, 0x5179 },{ 0x73a8, 0x73cf },{ 0x73ea, 0x572d }, { 0x73ee, 0x4f69 },{ 0x73fe, 0x73b0 },{ 0x7431, 0x96d5 },{ 0x743a, 0x73d0 }, { 0x743f, 0x73f2 },{ 0x744b, 0x73ae },{ 0x7463, 0x7410 },{ 0x7464, 0x7476 }, { 0x7469, 0x83b9 },{ 0x746a, 0x739b },{ 0x746f, 0x7405 },{ 0x7489, 0x740f }, { 0x74a3, 0x7391 },{ 0x74a6, 0x7477 },{ 0x74b0, 0x73af },{ 0x74bd, 0x73ba }, { 0x74bf, 0x7487 },{ 0x74ca, 0x743c },{ 0x74cf, 0x73d1 },{ 0x74d4, 0x748e }, { 0x74d6, 0x9576 },{ 0x74da, 0x74d2 },{ 0x750c, 0x74ef },{ 0x7515, 0x74ee }, { 0x7522, 0x4ea7 },{ 0x7526, 0x82cf },{ 0x752a, 0x89d2 },{ 0x752f, 0x5b81 }, { 0x755d, 0x4ea9 },{ 0x7562, 0x6bd5 },{ 0x756b, 0x753b },{ 0x756c, 0x7572 }, { 0x7570, 0x5f02 },{ 0x7576, 0x5f53 },{ 0x7587, 0x7574 },{ 0x758a, 0x53e0 }, { 0x75bf, 0x75f1 },{ 0x75d9, 0x75c9 },{ 0x75e0, 0x9178 },{ 0x75f2, 0x9ebb }, { 0x75f3, 0x9ebb },{ 0x75fa, 0x75f9 },{ 0x75fe, 0x75b4 },{ 0x7609, 0x6108 }, { 0x760b, 0x75af },{ 0x760d, 0x75a1 },{ 0x7613, 0x75ea },{ 0x761e, 0x7617 }, { 0x7621, 0x75ae },{ 0x7627, 0x759f },{ 0x763a, 0x7618 },{ 0x7642, 0x7597 }, { 0x7646, 0x75e8 },{ 0x7647, 0x75eb },{ 0x7649, 0x7605 },{ 0x7652, 0x6108 }, { 0x7658, 0x75a0 },{ 0x765f, 0x762a },{ 0x7661, 0x75f4 },{ 0x7662, 0x75d2 }, { 0x7664, 0x7596 },{ 0x7665, 0x75c7 },{ 0x7669, 0x765e },{ 0x766c, 0x7663 }, { 0x766d, 0x763f },{ 0x766e, 0x763e },{ 0x7670, 0x75c8 },{ 0x7671, 0x762b }, { 0x7672, 0x766b },{ 0x767c, 0x53d1 },{ 0x7681, 0x7682 },{ 0x769a, 0x7691 }, { 0x76b0, 0x75b1 },{ 0x76b8, 0x76b2 },{ 0x76ba, 0x76b1 },{ 0x76c3, 0x676f }, { 0x76dc, 0x76d7 },{ 0x76de, 0x76cf },{ 0x76e1, 0x5c3d },{ 0x76e3, 0x76d1 }, { 0x76e4, 0x76d8 },{ 0x76e7, 0x5362 },{ 0x76ea, 0x8361 },{ 0x7725, 0x7726 }, { 0x773e, 0x4f17 },{ 0x774f, 0x56f0 },{ 0x775c, 0x7741 },{ 0x775e, 0x7750 }, { 0x776a, 0x777e },{ 0x7787, 0x772f },{ 0x779e, 0x7792 },{ 0x77ad, 0x4e86 }, { 0x77bc, 0x7751 },{ 0x77c7, 0x8499 },{ 0x77d3, 0x80e7 },{ 0x77da, 0x77a9 }, { 0x77ef, 0x77eb },{ 0x7832, 0x70ae },{ 0x7843, 0x6731 },{ 0x7864, 0x7856 }, { 0x7868, 0x7817 },{ 0x786f, 0x781a },{ 0x7881, 0x68cb },{ 0x7895, 0x5d0e }, { 0x78a9, 0x7855 },{ 0x78aa, 0x7827 },{ 0x78ad, 0x7800 },{ 0x78ba, 0x786e }, { 0x78bc, 0x7801 },{ 0x78da, 0x7816 },{ 0x78e3, 0x789c },{ 0x78e7, 0x789b }, { 0x78ef, 0x77f6 },{ 0x78fd, 0x7857 },{ 0x790e, 0x7840 },{ 0x7919, 0x788d }, { 0x7921, 0x7934 },{ 0x7926, 0x77ff },{ 0x792a, 0x783a },{ 0x792b, 0x783e }, { 0x792c, 0x77fe },{ 0x7931, 0x783b },{ 0x7942, 0x4ed6 },{ 0x7945, 0x7946 }, { 0x7947, 0x53ea },{ 0x7950, 0x4f51 },{ 0x7955, 0x79d8 },{ 0x797c, 0x88f8 }, { 0x797f, 0x7984 },{ 0x798d, 0x7978 },{ 0x798e, 0x796f },{ 0x79a6, 0x5fa1 }, { 0x79aa, 0x7985 },{ 0x79ae, 0x793c },{ 0x79b0, 0x7962 },{ 0x79b1, 0x7977 }, { 0x79bf, 0x79c3 },{ 0x79c8, 0x7c7c },{ 0x79cf, 0x8017 },{ 0x7a05, 0x7a0e }, { 0x7a08, 0x79c6 },{ 0x7a1c, 0x68f1 },{ 0x7a1f, 0x7980 },{ 0x7a28, 0x6241 }, { 0x7a2e, 0x79cd },{ 0x7a31, 0x79f0 },{ 0x7a40, 0x8c37 },{ 0x7a4c, 0x7a23 }, { 0x7a4d, 0x79ef },{ 0x7a4e, 0x9896 },{ 0x7a61, 0x7a51 },{ 0x7a62, 0x79fd }, { 0x7a68, 0x9893 },{ 0x7a69, 0x7a33 },{ 0x7a6b, 0x83b7 },{ 0x7aa9, 0x7a9d }, { 0x7aaa, 0x6d3c },{ 0x7aae, 0x7a77 },{ 0x7aaf, 0x7a91 },{ 0x7ab6, 0x7aad }, { 0x7aba, 0x7aa5 },{ 0x7ac4, 0x7a9c },{ 0x7ac5, 0x7a8d },{ 0x7ac7, 0x7aa6 }, { 0x7aca, 0x7a83 },{ 0x7af6, 0x7ade },{ 0x7b3b, 0x7b47 },{ 0x7b46, 0x7b14 }, { 0x7b4d, 0x7b0b },{ 0x7b67, 0x7b15 },{ 0x7b74, 0x7b56 },{ 0x7b84, 0x7b85 }, { 0x7b87, 0x4e2a },{ 0x7b8b, 0x7b3a },{ 0x7b8f, 0x7b5d },{ 0x7ba0, 0x68f0 }, { 0x7bc0, 0x8282 },{ 0x7bc4, 0x8303 },{ 0x7bc9, 0x7b51 },{ 0x7bcb, 0x7ba7 }, { 0x7bdb, 0x7bac },{ 0x7be0, 0x7b71 },{ 0x7be4, 0x7b03 },{ 0x7be9, 0x7b5b }, { 0x7bf2, 0x5f57 },{ 0x7bf3, 0x7b5a },{ 0x7c00, 0x7ba6 },{ 0x7c0d, 0x7bd3 }, { 0x7c11, 0x84d1 },{ 0x7c1e, 0x7baa },{ 0x7c21, 0x7b80 },{ 0x7c23, 0x7bd1 }, { 0x7c2b, 0x7bab },{ 0x7c37, 0x6a90 },{ 0x7c3d, 0x7b7e },{ 0x7c3e, 0x5e18 }, { 0x7c43, 0x7bee },{ 0x7c4c, 0x7b79 },{ 0x7c50, 0x85e4 },{ 0x7c5c, 0x7ba8 }, { 0x7c5f, 0x7c41 },{ 0x7c60, 0x7b3c },{ 0x7c64, 0x7b7e },{ 0x7c65, 0x9fa0 }, { 0x7c69, 0x7b3e },{ 0x7c6a, 0x7c16 },{ 0x7c6c, 0x7bf1 },{ 0x7c6e, 0x7ba9 }, { 0x7c72, 0x5401 },{ 0x7ca7, 0x5986 },{ 0x7cb5, 0x7ca4 },{ 0x7cdd, 0x7cc1 }, { 0x7cde, 0x7caa },{ 0x7ce2, 0x998d },{ 0x7ce7, 0x7cae },{ 0x7cf0, 0x56e2 }, { 0x7cf2, 0x7c9d },{ 0x7cf4, 0x7c74 },{ 0x7cf6, 0x7c9c },{ 0x7cfe, 0x7ea0 }, { 0x7d00, 0x7eaa },{ 0x7d02, 0x7ea3 },{ 0x7d04, 0x7ea6 },{ 0x7d05, 0x7ea2 }, { 0x7d06, 0x7ea1 },{ 0x7d07, 0x7ea5 },{ 0x7d08, 0x7ea8 },{ 0x7d09, 0x7eab }, { 0x7d0b, 0x7eb9 },{ 0x7d0d, 0x7eb3 },{ 0x7d10, 0x7ebd },{ 0x7d13, 0x7ebe }, { 0x7d14, 0x7eaf },{ 0x7d15, 0x7eb0 },{ 0x7d17, 0x7eb1 },{ 0x7d19, 0x7eb8 }, { 0x7d1a, 0x7ea7 },{ 0x7d1b, 0x7eb7 },{ 0x7d1c, 0x7ead },{ 0x7d21, 0x7eba }, { 0x7d2e, 0x624e },{ 0x7d30, 0x7ec6 },{ 0x7d31, 0x7ec2 },{ 0x7d32, 0x7ec1 }, { 0x7d33, 0x7ec5 },{ 0x7d39, 0x7ecd },{ 0x7d3a, 0x7ec0 },{ 0x7d3c, 0x7ecb }, { 0x7d3f, 0x7ed0 },{ 0x7d40, 0x7ecc },{ 0x7d42, 0x7ec8 },{ 0x7d43, 0x5f26 }, { 0x7d44, 0x7ec4 },{ 0x7d46, 0x7eca },{ 0x7d4e, 0x7ed7 },{ 0x7d50, 0x7ed3 }, { 0x7d55, 0x7edd },{ 0x7d5b, 0x7ee6 },{ 0x7d5e, 0x7ede },{ 0x7d61, 0x7edc }, { 0x7d62, 0x7eda },{ 0x7d66, 0x7ed9 },{ 0x7d68, 0x7ed2 },{ 0x7d71, 0x7edf }, { 0x7d72, 0x4e1d },{ 0x7d73, 0x7edb },{ 0x7d79, 0x7ee2 },{ 0x7d81, 0x7ed1 }, { 0x7d83, 0x7ee1 },{ 0x7d86, 0x7ee0 },{ 0x7d88, 0x7ee8 },{ 0x7d8f, 0x7ee5 }, { 0x7d91, 0x6346 },{ 0x7d93, 0x7ecf },{ 0x7d9c, 0x7efc },{ 0x7d9e, 0x7f0d }, { 0x7da0, 0x7eff },{ 0x7da2, 0x7ef8 },{ 0x7da3, 0x7efb },{ 0x7dac, 0x7ef6 }, { 0x7dad, 0x7ef4 },{ 0x7db0, 0x7efe },{ 0x7db1, 0x7eb2 },{ 0x7db2, 0x7f51 }, { 0x7db4, 0x7f00 },{ 0x7db5, 0x5f69 },{ 0x7db8, 0x7eb6 },{ 0x7db9, 0x7efa }, { 0x7dba, 0x7eee },{ 0x7dbb, 0x7efd },{ 0x7dbd, 0x7ef0 },{ 0x7dbe, 0x7eeb }, { 0x7dbf, 0x7ef5 },{ 0x7dc4, 0x7ef2 },{ 0x7dc7, 0x7f01 },{ 0x7dca, 0x7d27 }, { 0x7dcb, 0x7eef },{ 0x7dd2, 0x7eea },{ 0x7dd7, 0x7f03 },{ 0x7dd8, 0x7f04 }, { 0x7dd9, 0x7f02 },{ 0x7dda, 0x7ebf },{ 0x7ddd, 0x7f09 },{ 0x7dde, 0x7f0e }, { 0x7de0, 0x7f14 },{ 0x7de1, 0x7f17 },{ 0x7de3, 0x7f18 },{ 0x7de6, 0x7f0c }, { 0x7de8, 0x7f16 },{ 0x7de9, 0x7f13 },{ 0x7dec, 0x7f05 },{ 0x7def, 0x7eac }, { 0x7df1, 0x7f11 },{ 0x7df2, 0x7f08 },{ 0x7df4, 0x7ec3 },{ 0x7df6, 0x7f0f }, { 0x7df9, 0x7f07 },{ 0x7dfb, 0x81f4 },{ 0x7e08, 0x8426 },{ 0x7e09, 0x7f19 }, { 0x7e0a, 0x7f22 },{ 0x7e0b, 0x7f12 },{ 0x7e10, 0x7ec9 },{ 0x7e11, 0x7f23 }, { 0x7e1a, 0x7ee6 },{ 0x7e1b, 0x7f1a },{ 0x7e1d, 0x7f1c },{ 0x7e1e, 0x7f1f }, { 0x7e1f, 0x7f1b },{ 0x7e23, 0x53bf },{ 0x7e2b, 0x7f1d },{ 0x7e2d, 0x7f21 }, { 0x7e2e, 0x7f29 },{ 0x7e2f, 0x6f14 },{ 0x7e31, 0x7eb5 },{ 0x7e32, 0x7f27 }, { 0x7e33, 0x7f1a },{ 0x7e34, 0x7ea4 },{ 0x7e35, 0x7f26 },{ 0x7e36, 0x7d77 }, { 0x7e37, 0x7f15 },{ 0x7e39, 0x7f25 },{ 0x7e3d, 0x603b },{ 0x7e3e, 0x7ee9 }, { 0x7e43, 0x7ef7 },{ 0x7e45, 0x7f2b },{ 0x7e46, 0x7f2a },{ 0x7e48, 0x8941 }, { 0x7e52, 0x7f2f },{ 0x7e54, 0x7ec7 },{ 0x7e55, 0x7f2e },{ 0x7e59, 0x7ffb }, { 0x7e5a, 0x7f2d },{ 0x7e5e, 0x7ed5 },{ 0x7e61, 0x7ee3 },{ 0x7e62, 0x7f0b }, { 0x7e69, 0x7ef3 },{ 0x7e6a, 0x7ed8 },{ 0x7e6b, 0x7cfb },{ 0x7e6d, 0x8327 }, { 0x7e6f, 0x7f33 },{ 0x7e70, 0x7f32 },{ 0x7e73, 0x7f34 },{ 0x7e79, 0x7ece }, { 0x7e7c, 0x7ee7 },{ 0x7e7d, 0x7f24 },{ 0x7e7e, 0x7f31 },{ 0x7e88, 0x7f2c }, { 0x7e8a, 0x7ea9 },{ 0x7e8c, 0x7eed },{ 0x7e8d, 0x7d2f },{ 0x7e8f, 0x7f20 }, { 0x7e93, 0x7f28 },{ 0x7e94, 0x624d },{ 0x7e96, 0x7ea4 },{ 0x7e98, 0x7f35 }, { 0x7e9c, 0x7f06 },{ 0x7f3d, 0x94b5 },{ 0x7f3e, 0x74f6 },{ 0x7f48, 0x575b }, { 0x7f4c, 0x7f42 },{ 0x7f66, 0x7f58 },{ 0x7f70, 0x7f5a },{ 0x7f75, 0x9a82 }, { 0x7f77, 0x7f62 },{ 0x7f85, 0x7f57 },{ 0x7f86, 0x7f74 },{ 0x7f88, 0x7f81 }, { 0x7f8b, 0x8288 },{ 0x7fa5, 0x7f9f },{ 0x7fa8, 0x7fa1 },{ 0x7fa9, 0x4e49 }, { 0x7fb6, 0x81bb },{ 0x7fd2, 0x4e60 },{ 0x7ff9, 0x7fd8 },{ 0x8011, 0x7aef }, { 0x8021, 0x52a9 },{ 0x8024, 0x85c9 },{ 0x802c, 0x8027 },{ 0x8056, 0x5723 }, { 0x805e, 0x95fb },{ 0x806f, 0x8054 },{ 0x8070, 0x806a },{ 0x8072, 0x58f0 }, { 0x8073, 0x8038 },{ 0x8075, 0x8069 },{ 0x8076, 0x8042 },{ 0x8077, 0x804c }, { 0x8079, 0x804d },{ 0x807d, 0x542c },{ 0x807e, 0x804b },{ 0x8085, 0x8083 }, { 0x808f, 0x64cd },{ 0x8090, 0x80f3 },{ 0x80c7, 0x80ba },{ 0x80ca, 0x6710 }, { 0x8105, 0x80c1 },{ 0x8108, 0x8109 },{ 0x811b, 0x80eb },{ 0x8123, 0x5507 }, { 0x8129, 0x4fee },{ 0x812b, 0x8131 },{ 0x8139, 0x80c0 },{ 0x814e, 0x80be }, { 0x8161, 0x8136 },{ 0x8166, 0x8111 },{ 0x816b, 0x80bf },{ 0x8173, 0x811a }, { 0x8178, 0x80a0 },{ 0x8183, 0x817d },{ 0x8186, 0x55c9 },{ 0x819a, 0x80a4 }, { 0x81a0, 0x80f6 },{ 0x81a9, 0x817b },{ 0x81bd, 0x80c6 },{ 0x81be, 0x810d }, { 0x81bf, 0x8113 },{ 0x81c9, 0x8138 },{ 0x81cd, 0x8110 },{ 0x81cf, 0x8191 }, { 0x81d5, 0x8198 },{ 0x81d8, 0x814a },{ 0x81d9, 0x80ed },{ 0x81da, 0x80ea }, { 0x81df, 0x810f },{ 0x81e0, 0x8114 },{ 0x81e5, 0x5367 },{ 0x81e8, 0x4e34 }, { 0x81fa, 0x53f0 },{ 0x8207, 0x4e0e },{ 0x8208, 0x5174 },{ 0x8209, 0x4e3e }, { 0x820a, 0x65e7 },{ 0x820b, 0x8845 },{ 0x8216, 0x94fa },{ 0x8259, 0x8231 }, { 0x8263, 0x6a79 },{ 0x8264, 0x8223 },{ 0x8266, 0x8230 },{ 0x826b, 0x823b }, { 0x8271, 0x8270 },{ 0x8277, 0x8273 },{ 0x8278, 0x8279 },{ 0x82bb, 0x520d }, { 0x82e7, 0x82ce },{ 0x82fa, 0x8393 },{ 0x830d, 0x82df },{ 0x8332, 0x5179 }, { 0x8345, 0x7b54 },{ 0x834a, 0x8346 },{ 0x8373, 0x8c46 },{ 0x838a, 0x5e84 }, { 0x8396, 0x830e },{ 0x83a2, 0x835a },{ 0x83a7, 0x82cb },{ 0x83eb, 0x5807 }, { 0x83ef, 0x534e },{ 0x83f4, 0x5eb5 },{ 0x8407, 0x82cc },{ 0x840a, 0x83b1 }, { 0x842c, 0x4e07 },{ 0x8435, 0x83b4 },{ 0x8449, 0x53f6 },{ 0x8452, 0x836d }, { 0x8466, 0x82c7 },{ 0x846f, 0x836f },{ 0x8477, 0x8364 },{ 0x8490, 0x641c }, { 0x8494, 0x83b3 },{ 0x849e, 0x8385 },{ 0x84bc, 0x82cd },{ 0x84c0, 0x836a }, { 0x84c6, 0x5e2d },{ 0x84cb, 0x76d6 },{ 0x84ee, 0x83b2 },{ 0x84ef, 0x82c1 }, { 0x84f4, 0x83bc },{ 0x84fd, 0x835c },{ 0x8506, 0x83f1 },{ 0x8514, 0x535c }, { 0x851e, 0x848c },{ 0x8523, 0x848b },{ 0x8525, 0x8471 },{ 0x8526, 0x8311 }, { 0x852d, 0x836b },{ 0x8541, 0x8368 },{ 0x8546, 0x8487 },{ 0x854e, 0x835e }, { 0x8553, 0x82b8 },{ 0x8555, 0x83b8 },{ 0x8558, 0x835b },{ 0x8562, 0x8489 }, { 0x8569, 0x8361 },{ 0x856a, 0x829c },{ 0x856d, 0x8427 },{ 0x8577, 0x84e3 }, { 0x8588, 0x835f },{ 0x858a, 0x84df },{ 0x858c, 0x8297 },{ 0x8591, 0x59dc }, { 0x8594, 0x8537 },{ 0x8599, 0x5243 },{ 0x859f, 0x83b6 },{ 0x85a6, 0x8350 }, { 0x85a9, 0x8428 },{ 0x85ba, 0x8360 },{ 0x85cd, 0x84dd },{ 0x85ce, 0x8369 }, { 0x85da, 0x836c },{ 0x85dd, 0x827a },{ 0x85e5, 0x836f },{ 0x85ea, 0x85ae }, { 0x85f6, 0x82c8 },{ 0x85f7, 0x85af },{ 0x85f9, 0x853c },{ 0x85fa, 0x853a }, { 0x8604, 0x8572 },{ 0x8606, 0x82a6 },{ 0x8607, 0x82cf },{ 0x860a, 0x8574 }, { 0x860b, 0x82f9 },{ 0x8617, 0x8616 },{ 0x861a, 0x85d3 },{ 0x861e, 0x8539 }, { 0x8622, 0x830f },{ 0x862d, 0x5170 },{ 0x863a, 0x84e0 },{ 0x863f, 0x841d }, { 0x8655, 0x5904 },{ 0x8656, 0x547c },{ 0x865b, 0x865a },{ 0x865c, 0x864f }, { 0x865f, 0x53f7 },{ 0x8667, 0x4e8f },{ 0x866f, 0x866c },{ 0x86fa, 0x86f1 }, { 0x86fb, 0x8715 },{ 0x8706, 0x86ac },{ 0x873a, 0x9713 },{ 0x8755, 0x8680 }, { 0x875f, 0x732c },{ 0x8766, 0x867e },{ 0x8768, 0x8671 },{ 0x8778, 0x8717 }, { 0x8784, 0x86f3 },{ 0x879e, 0x8682 },{ 0x87a2, 0x8424 },{ 0x87bb, 0x877c }, { 0x87c4, 0x86f0 },{ 0x87c8, 0x8748 },{ 0x87e3, 0x866e },{ 0x87ec, 0x8749 }, { 0x87ef, 0x86f2 },{ 0x87f2, 0x866b },{ 0x87f6, 0x86cf },{ 0x87fa, 0x87ee }, { 0x87fb, 0x8681 },{ 0x8805, 0x8747 },{ 0x8806, 0x867f },{ 0x880d, 0x874e }, { 0x8810, 0x86f4 },{ 0x8811, 0x877e },{ 0x8814, 0x869d },{ 0x881f, 0x8721 }, { 0x8823, 0x86ce },{ 0x8831, 0x86ca },{ 0x8836, 0x8695 },{ 0x8837, 0x883c }, { 0x883b, 0x86ee },{ 0x884a, 0x8511 },{ 0x8852, 0x70ab },{ 0x8853, 0x672f }, { 0x885a, 0x80e1 },{ 0x885b, 0x536b },{ 0x885d, 0x51b2 },{ 0x8879, 0x53ea }, { 0x889e, 0x886e },{ 0x88aa, 0x795b },{ 0x88ca, 0x8885 },{ 0x88cf, 0x91cc }, { 0x88dc, 0x8865 },{ 0x88dd, 0x88c5 },{ 0x88e1, 0x91cc },{ 0x88fd, 0x5236 }, { 0x8907, 0x590d },{ 0x890e, 0x8896 },{ 0x8932, 0x88e4 },{ 0x8933, 0x88e2 }, { 0x8938, 0x891b },{ 0x893b, 0x4eb5 },{ 0x8949, 0x88e5 },{ 0x8956, 0x8884 }, { 0x895d, 0x88e3 },{ 0x8960, 0x88c6 },{ 0x8964, 0x8934 },{ 0x896a, 0x889c }, { 0x896c, 0x6446 },{ 0x896f, 0x886c },{ 0x8972, 0x88ad },{ 0x897e, 0x897f }, { 0x8988, 0x6838 },{ 0x898b, 0x89c1 },{ 0x898f, 0x89c4 },{ 0x8993, 0x89c5 }, { 0x8996, 0x89c6 },{ 0x8998, 0x89c7 },{ 0x899c, 0x773a },{ 0x89a1, 0x89cb }, { 0x89a6, 0x89ce },{ 0x89aa, 0x4eb2 },{ 0x89ac, 0x89ca },{ 0x89af, 0x89cf }, { 0x89b2, 0x89d0 },{ 0x89b7, 0x89d1 },{ 0x89ba, 0x89c9 },{ 0x89bd, 0x89c8 }, { 0x89bf, 0x89cc },{ 0x89c0, 0x89c2 },{ 0x89d4, 0x7b4b },{ 0x89dd, 0x62b5 }, { 0x89f4, 0x89de },{ 0x89f6, 0x89ef },{ 0x89f8, 0x89e6 },{ 0x8a02, 0x8ba2 }, { 0x8a03, 0x8ba3 },{ 0x8a08, 0x8ba1 },{ 0x8a0a, 0x8baf },{ 0x8a0c, 0x8ba7 }, { 0x8a0e, 0x8ba8 },{ 0x8a10, 0x8ba6 },{ 0x8a13, 0x8bad },{ 0x8a15, 0x8baa }, { 0x8a16, 0x8bab },{ 0x8a17, 0x6258 },{ 0x8a18, 0x8bb0 },{ 0x8a1b, 0x8bb9 }, { 0x8a1d, 0x8bb6 },{ 0x8a1f, 0x8bbc },{ 0x8a22, 0x6b23 },{ 0x8a23, 0x8bc0 }, { 0x8a25, 0x8bb7 },{ 0x8a2a, 0x8bbf },{ 0x8a2d, 0x8bbe },{ 0x8a31, 0x8bb8 }, { 0x8a34, 0x8bc9 },{ 0x8a36, 0x8bc3 },{ 0x8a3a, 0x8bca },{ 0x8a3b, 0x6ce8 }, { 0x8a3c, 0x8bc1 },{ 0x8a41, 0x8bc2 },{ 0x8a46, 0x8bcb },{ 0x8a4e, 0x8bb5 }, { 0x8a50, 0x8bc8 },{ 0x8a52, 0x8bd2 },{ 0x8a54, 0x8bcf },{ 0x8a55, 0x8bc4 }, { 0x8a58, 0x8bce },{ 0x8a5b, 0x8bc5 },{ 0x8a5e, 0x8bcd },{ 0x8a60, 0x548f }, { 0x8a61, 0x8be9 },{ 0x8a62, 0x8be2 },{ 0x8a63, 0x8be3 },{ 0x8a66, 0x8bd5 }, { 0x8a69, 0x8bd7 },{ 0x8a6b, 0x8be7 },{ 0x8a6c, 0x8bdf },{ 0x8a6d, 0x8be1 }, { 0x8a6e, 0x8be0 },{ 0x8a70, 0x8bd8 },{ 0x8a71, 0x8bdd },{ 0x8a72, 0x8be5 }, { 0x8a73, 0x8be6 },{ 0x8a75, 0x8bdc },{ 0x8a76, 0x916c },{ 0x8a7b, 0x54af }, { 0x8a7c, 0x8bd9 },{ 0x8a7f, 0x8bd6 },{ 0x8a84, 0x8bd4 },{ 0x8a85, 0x8bdb }, { 0x8a86, 0x8bd3 },{ 0x8a87, 0x5938 },{ 0x8a8c, 0x5fd7 },{ 0x8a8d, 0x8ba4 }, { 0x8a91, 0x8bf3 },{ 0x8a92, 0x8bf6 },{ 0x8a95, 0x8bde },{ 0x8a98, 0x8bf1 }, { 0x8a9a, 0x8bee },{ 0x8a9e, 0x8bed },{ 0x8aa0, 0x8bda },{ 0x8aa1, 0x8beb }, { 0x8aa3, 0x8bec },{ 0x8aa4, 0x8bef },{ 0x8aa5, 0x8bf0 },{ 0x8aa6, 0x8bf5 }, { 0x8aa8, 0x8bf2 },{ 0x8aaa, 0x8bf4 },{ 0x8ab0, 0x8c01 },{ 0x8ab2, 0x8bfe }, { 0x8ab6, 0x8c07 },{ 0x8ab9, 0x8bfd },{ 0x8abc, 0x8c0a },{ 0x8abf, 0x8c03 }, { 0x8ac2, 0x8c04 },{ 0x8ac4, 0x8c06 },{ 0x8ac7, 0x8c08 },{ 0x8ac9, 0x8bff }, { 0x8acb, 0x8bf7 },{ 0x8acd, 0x8be4 },{ 0x8acf, 0x8bf9 },{ 0x8ad1, 0x8bfc }, { 0x8ad2, 0x8c05 },{ 0x8ad6, 0x8bba },{ 0x8ad7, 0x8c02 },{ 0x8adb, 0x8c00 }, { 0x8adc, 0x8c0d },{ 0x8ade, 0x8c1d },{ 0x8ae0, 0x55a7 },{ 0x8ae2, 0x8be8 }, { 0x8ae4, 0x8c14 },{ 0x8ae6, 0x8c1b },{ 0x8ae7, 0x8c10 },{ 0x8aeb, 0x8c0f }, { 0x8aed, 0x8c15 },{ 0x8aee, 0x8c18 },{ 0x8af1, 0x8bb3 },{ 0x8af3, 0x8c19 }, { 0x8af6, 0x8c0c },{ 0x8af7, 0x8bbd },{ 0x8af8, 0x8bf8 },{ 0x8afa, 0x8c1a }, { 0x8afc, 0x8c16 },{ 0x8afe, 0x8bfa },{ 0x8b00, 0x8c0b },{ 0x8b01, 0x8c12 }, { 0x8b02, 0x8c13 },{ 0x8b04, 0x8a8a },{ 0x8b05, 0x8bcc },{ 0x8b0a, 0x8c0e }, { 0x8b0e, 0x8c1c },{ 0x8b10, 0x8c27 },{ 0x8b14, 0x8c11 },{ 0x8b16, 0x8c21 }, { 0x8b17, 0x8c24 },{ 0x8b19, 0x8c26 },{ 0x8b1a, 0x8c25 },{ 0x8b1b, 0x8bb2 }, { 0x8b1d, 0x8c22 },{ 0x8b20, 0x8c23 },{ 0x8b28, 0x8c1f },{ 0x8b2b, 0x8c2a }, { 0x8b2c, 0x8c2c },{ 0x8b33, 0x8bb4 },{ 0x8b39, 0x8c28 },{ 0x8b3c, 0x547c }, { 0x8b3e, 0x8c29 },{ 0x8b41, 0x54d7 },{ 0x8b46, 0x563b },{ 0x8b49, 0x8bc1 }, { 0x8b4e, 0x8c32 },{ 0x8b4f, 0x8ba5 },{ 0x8b54, 0x64b0 },{ 0x8b56, 0x8c2e }, { 0x8b58, 0x8bc6 },{ 0x8b59, 0x8c2f },{ 0x8b5a, 0x8c2d },{ 0x8b5c, 0x8c31 }, { 0x8b5f, 0x566a },{ 0x8b6b, 0x8c35 },{ 0x8b6d, 0x6bc1 },{ 0x8b6f, 0x8bd1 }, { 0x8b70, 0x8bae },{ 0x8b74, 0x8c34 },{ 0x8b77, 0x62a4 },{ 0x8b7d, 0x8a89 }, { 0x8b7e, 0x8c2b },{ 0x8b80, 0x8bfb },{ 0x8b8a, 0x53d8 },{ 0x8b8c, 0x5bb4 }, { 0x8b8e, 0x96e0 },{ 0x8b92, 0x8c17 },{ 0x8b93, 0x8ba9 },{ 0x8b95, 0x8c30 }, { 0x8b96, 0x8c36 },{ 0x8b9a, 0x8d5e },{ 0x8b9c, 0x8c20 },{ 0x8b9e, 0x8c33 }, { 0x8c3f, 0x6eaa },{ 0x8c48, 0x5c82 },{ 0x8c4e, 0x7ad6 },{ 0x8c50, 0x4e30 }, { 0x8c54, 0x8273 },{ 0x8c56, 0x4e8d },{ 0x8c6c, 0x732a },{ 0x8c8d, 0x72f8 }, { 0x8c93, 0x732b },{ 0x8c9d, 0x8d1d },{ 0x8c9e, 0x8d1e },{ 0x8ca0, 0x8d1f }, { 0x8ca1, 0x8d22 },{ 0x8ca2, 0x8d21 },{ 0x8ca7, 0x8d2b },{ 0x8ca8, 0x8d27 }, { 0x8ca9, 0x8d29 },{ 0x8caa, 0x8d2a },{ 0x8cab, 0x8d2f },{ 0x8cac, 0x8d23 }, { 0x8caf, 0x8d2e },{ 0x8cb0, 0x8d33 },{ 0x8cb2, 0x8d40 },{ 0x8cb3, 0x8d30 }, { 0x8cb4, 0x8d35 },{ 0x8cb6, 0x8d2c },{ 0x8cb7, 0x4e70 },{ 0x8cb8, 0x8d37 }, { 0x8cba, 0x8d36 },{ 0x8cbb, 0x8d39 },{ 0x8cbc, 0x8d34 },{ 0x8cbd, 0x8d3b }, { 0x8cbf, 0x8d38 },{ 0x8cc0, 0x8d3a },{ 0x8cc1, 0x8d32 },{ 0x8cc2, 0x8d42 }, { 0x8cc3, 0x8d41 },{ 0x8cc4, 0x8d3f },{ 0x8cc5, 0x8d45 },{ 0x8cc7, 0x8d44 }, { 0x8cc8, 0x8d3e },{ 0x8cca, 0x8d3c },{ 0x8cd1, 0x8d48 },{ 0x8cd2, 0x8d4a }, { 0x8cd3, 0x5bbe },{ 0x8cd5, 0x8d47 },{ 0x8cd9, 0x5468 },{ 0x8cda, 0x8d49 }, { 0x8cdc, 0x8d50 },{ 0x8cde, 0x8d4f },{ 0x8ce0, 0x8d54 },{ 0x8ce1, 0x8d53 }, { 0x8ce2, 0x8d24 },{ 0x8ce3, 0x5356 },{ 0x8ce4, 0x8d31 },{ 0x8ce6, 0x8d4b }, { 0x8ce7, 0x8d55 },{ 0x8cea, 0x8d28 },{ 0x8cec, 0x8d26 },{ 0x8ced, 0x8d4c }, { 0x8cf4, 0x8d56 },{ 0x8cf8, 0x5269 },{ 0x8cfa, 0x8d5a },{ 0x8cfb, 0x8d59 }, { 0x8cfc, 0x8d2d },{ 0x8cfd, 0x8d5b },{ 0x8cfe, 0x8d5c },{ 0x8d04, 0x8d3d }, { 0x8d05, 0x8d58 },{ 0x8d08, 0x8d60 },{ 0x8d0a, 0x8d5e },{ 0x8d0d, 0x8d61 }, { 0x8d0f, 0x8d62 },{ 0x8d10, 0x8d46 },{ 0x8d13, 0x8d43 },{ 0x8d16, 0x8d4e }, { 0x8d17, 0x8d5d },{ 0x8d1b, 0x8d63 },{ 0x8d95, 0x8d76 },{ 0x8d99, 0x8d75 }, { 0x8da8, 0x8d8b },{ 0x8db2, 0x8db1 },{ 0x8de1, 0x8ff9 },{ 0x8dfc, 0x5c40 }, { 0x8e10, 0x8df5 },{ 0x8e21, 0x8737 },{ 0x8e2b, 0x78b0 },{ 0x8e30, 0x903e }, { 0x8e34, 0x8e0a },{ 0x8e4c, 0x8dc4 },{ 0x8e55, 0x8df8 },{ 0x8e5f, 0x8ff9 }, { 0x8e60, 0x8dd6 },{ 0x8e63, 0x8e52 },{ 0x8e64, 0x8e2a },{ 0x8e67, 0x7cdf }, { 0x8e7a, 0x8df7 },{ 0x8e89, 0x8db8 },{ 0x8e8a, 0x8e0c },{ 0x8e8b, 0x8dfb }, { 0x8e8d, 0x8dc3 },{ 0x8e91, 0x8e2f },{ 0x8e92, 0x8dde },{ 0x8e93, 0x8e2c }, { 0x8e95, 0x8e70 },{ 0x8e9a, 0x8df9 },{ 0x8ea1, 0x8e51 },{ 0x8ea5, 0x8e7f }, { 0x8ea6, 0x8e9c },{ 0x8eaa, 0x8e8f },{ 0x8ec0, 0x8eaf },{ 0x8eca, 0x8f66 }, { 0x8ecb, 0x8f67 },{ 0x8ecc, 0x8f68 },{ 0x8ecd, 0x519b },{ 0x8ed2, 0x8f69 }, { 0x8ed4, 0x8f6b },{ 0x8edb, 0x8f6d },{ 0x8edf, 0x8f6f },{ 0x8eeb, 0x8f78 }, { 0x8ef8, 0x8f74 },{ 0x8ef9, 0x8f75 },{ 0x8efa, 0x8f7a },{ 0x8efb, 0x8f72 }, { 0x8efc, 0x8f76 },{ 0x8efe, 0x8f7c },{ 0x8f03, 0x8f83 },{ 0x8f05, 0x8f82 }, { 0x8f07, 0x8f81 },{ 0x8f09, 0x8f7d },{ 0x8f0a, 0x8f7e },{ 0x8f12, 0x8f84 }, { 0x8f13, 0x633d },{ 0x8f14, 0x8f85 },{ 0x8f15, 0x8f7b },{ 0x8f1b, 0x8f86 }, { 0x8f1c, 0x8f8e },{ 0x8f1d, 0x8f89 },{ 0x8f1e, 0x8f8b },{ 0x8f1f, 0x8f8d }, { 0x8f25, 0x8f8a },{ 0x8f26, 0x8f87 },{ 0x8f29, 0x8f88 },{ 0x8f2a, 0x8f6e }, { 0x8f2f, 0x8f91 },{ 0x8f33, 0x8f8f },{ 0x8f38, 0x8f93 },{ 0x8f3b, 0x8f90 }, { 0x8f3e, 0x8f97 },{ 0x8f3f, 0x8206 },{ 0x8f42, 0x6bc2 },{ 0x8f44, 0x8f96 }, { 0x8f45, 0x8f95 },{ 0x8f46, 0x8f98 },{ 0x8f49, 0x8f6c },{ 0x8f4d, 0x8f99 }, { 0x8f4e, 0x8f7f },{ 0x8f54, 0x8f9a },{ 0x8f5f, 0x8f70 },{ 0x8f61, 0x8f94 }, { 0x8f62, 0x8f79 },{ 0x8f64, 0x8f73 },{ 0x8fa6, 0x529e },{ 0x8fad, 0x8f9e }, { 0x8fae, 0x8fab },{ 0x8faf, 0x8fa9 },{ 0x8fb2, 0x519c },{ 0x8fc6, 0x8fe4 }, { 0x8ff4, 0x56de },{ 0x8ffa, 0x4e43 },{ 0x9015, 0x8ff3 },{ 0x9019, 0x8fd9 }, { 0x9023, 0x8fde },{ 0x9031, 0x5468 },{ 0x9032, 0x8fdb },{ 0x904a, 0x6e38 }, { 0x904b, 0x8fd0 },{ 0x904e, 0x8fc7 },{ 0x9054, 0x8fbe },{ 0x9055, 0x8fdd }, { 0x9059, 0x9065 },{ 0x905c, 0x900a },{ 0x905e, 0x9012 },{ 0x9060, 0x8fdc }, { 0x9069, 0x9002 },{ 0x9072, 0x8fdf },{ 0x9077, 0x8fc1 },{ 0x9078, 0x9009 }, { 0x907a, 0x9057 },{ 0x907c, 0x8fbd },{ 0x9081, 0x8fc8 },{ 0x9084, 0x8fd8 }, { 0x9087, 0x8fe9 },{ 0x908a, 0x8fb9 },{ 0x908f, 0x903b },{ 0x9090, 0x9026 }, { 0x90df, 0x90cf },{ 0x90f5, 0x90ae },{ 0x9106, 0x90d3 },{ 0x9109, 0x4e61 }, { 0x9112, 0x90b9 },{ 0x9114, 0x90ac },{ 0x9116, 0x90e7 },{ 0x9127, 0x9093 }, { 0x912d, 0x90d1 },{ 0x9130, 0x90bb },{ 0x9132, 0x90f8 },{ 0x9134, 0x90ba }, { 0x9136, 0x90d0 },{ 0x913a, 0x909d },{ 0x9148, 0x90e6 },{ 0x9156, 0x9e29 }, { 0x9183, 0x814c },{ 0x9186, 0x76cf },{ 0x919c, 0x4e11 },{ 0x919e, 0x915d }, { 0x91ab, 0x533b },{ 0x91ac, 0x9171 },{ 0x91b1, 0x53d1 },{ 0x91bc, 0x5bb4 }, { 0x91c0, 0x917f },{ 0x91c1, 0x8845 },{ 0x91c3, 0x917e },{ 0x91c5, 0x917d }, { 0x91c6, 0x91c7 },{ 0x91cb, 0x91ca },{ 0x91d0, 0x5398 },{ 0x91d3, 0x9486 }, { 0x91d4, 0x9487 },{ 0x91d5, 0x948c },{ 0x91d7, 0x948a },{ 0x91d8, 0x9489 }, { 0x91d9, 0x948b },{ 0x91dd, 0x9488 },{ 0x91e3, 0x9493 },{ 0x91e4, 0x9490 }, { 0x91e6, 0x6263 },{ 0x91e7, 0x948f },{ 0x91e9, 0x9492 },{ 0x91ec, 0x948e }, { 0x91f5, 0x9497 },{ 0x91f7, 0x948d },{ 0x91f9, 0x9495 },{ 0x9200, 0x94af }, { 0x9201, 0x94ab },{ 0x9204, 0x94ad },{ 0x9209, 0x94a0 },{ 0x920d, 0x949d }, { 0x9210, 0x94a4 },{ 0x9211, 0x94a3 },{ 0x9214, 0x949e },{ 0x9215, 0x94ae }, { 0x921e, 0x94a7 },{ 0x9223, 0x9499 },{ 0x9225, 0x94ac },{ 0x9226, 0x949b }, { 0x9227, 0x94aa },{ 0x922e, 0x94cc },{ 0x9230, 0x94c8 },{ 0x9233, 0x94b6 }, { 0x9234, 0x94c3 },{ 0x9237, 0x94b4 },{ 0x9238, 0x94b9 },{ 0x9239, 0x94cd }, { 0x923a, 0x94b0 },{ 0x923d, 0x94b8 },{ 0x923e, 0x94c0 },{ 0x923f, 0x94bf }, { 0x9240, 0x94be },{ 0x9245, 0x5de8 },{ 0x9246, 0x94bb },{ 0x9248, 0x94ca }, { 0x9249, 0x94c9 },{ 0x924b, 0x5228 },{ 0x924d, 0x94cb },{ 0x9251, 0x94c2 }, { 0x9257, 0x94b3 },{ 0x925a, 0x94c6 },{ 0x925b, 0x94c5 },{ 0x925e, 0x94ba }, { 0x9264, 0x94a9 },{ 0x9266, 0x94b2 },{ 0x926c, 0x94bc },{ 0x926d, 0x94bd }, { 0x9278, 0x94f0 },{ 0x927a, 0x94d2 },{ 0x927b, 0x94ec },{ 0x927f, 0x94ea }, { 0x9280, 0x94f6 },{ 0x9283, 0x94f3 },{ 0x9285, 0x94dc },{ 0x9291, 0x94e3 }, { 0x9293, 0x94e8 },{ 0x9296, 0x94e2 },{ 0x9298, 0x94ed },{ 0x929a, 0x94eb }, { 0x929c, 0x8854 },{ 0x92a0, 0x94d1 },{ 0x92a3, 0x94f7 },{ 0x92a5, 0x94f1 }, { 0x92a6, 0x94df },{ 0x92a8, 0x94f5 },{ 0x92a9, 0x94e5 },{ 0x92aa, 0x94d5 }, { 0x92ab, 0x94ef },{ 0x92ac, 0x94d0 },{ 0x92b2, 0x710a },{ 0x92b3, 0x9510 }, { 0x92b7, 0x9500 },{ 0x92b9, 0x9508 },{ 0x92bb, 0x9511 },{ 0x92bc, 0x9509 }, { 0x92c1, 0x94dd },{ 0x92c3, 0x9512 },{ 0x92c5, 0x950c },{ 0x92c7, 0x94a1 }, { 0x92cc, 0x94e4 },{ 0x92cf, 0x94d7 },{ 0x92d2, 0x950b },{ 0x92dd, 0x950a }, { 0x92df, 0x9513 },{ 0x92e4, 0x9504 },{ 0x92e6, 0x9514 },{ 0x92e8, 0x9507 }, { 0x92ea, 0x94fa },{ 0x92ee, 0x94d6 },{ 0x92ef, 0x9506 },{ 0x92f0, 0x9502 }, { 0x92f1, 0x94fd },{ 0x92f8, 0x952f },{ 0x92fb, 0x9274 },{ 0x92fc, 0x94a2 }, { 0x9301, 0x951e },{ 0x9304, 0x5f55 },{ 0x9306, 0x9516 },{ 0x9308, 0x9529 }, { 0x9310, 0x9525 },{ 0x9312, 0x9515 },{ 0x9315, 0x951f },{ 0x9318, 0x9524 }, { 0x9319, 0x9531 },{ 0x931a, 0x94ee },{ 0x931b, 0x951b },{ 0x931f, 0x952c }, { 0x9320, 0x952d },{ 0x9322, 0x94b1 },{ 0x9326, 0x9526 },{ 0x9328, 0x951a }, { 0x932b, 0x9521 },{ 0x932e, 0x9522 },{ 0x932f, 0x9519 },{ 0x9333, 0x9530 }, { 0x9336, 0x8868 },{ 0x9338, 0x94fc },{ 0x9346, 0x9494 },{ 0x9347, 0x9534 }, { 0x934a, 0x70bc },{ 0x934b, 0x9505 },{ 0x934d, 0x9540 },{ 0x9354, 0x9537 }, { 0x9358, 0x94e1 },{ 0x935b, 0x953b },{ 0x9364, 0x9538 },{ 0x9365, 0x9532 }, { 0x936c, 0x9539 },{ 0x9370, 0x953e },{ 0x9375, 0x952e },{ 0x9376, 0x9536 }, { 0x937a, 0x9517 },{ 0x937c, 0x9488 },{ 0x937e, 0x949f },{ 0x9382, 0x9541 }, { 0x938a, 0x9551 },{ 0x938c, 0x9570 },{ 0x9394, 0x7194 },{ 0x9396, 0x9501 }, { 0x9397, 0x67aa },{ 0x9398, 0x9549 },{ 0x939a, 0x9524 },{ 0x93a2, 0x94a8 }, { 0x93a3, 0x84e5 },{ 0x93a6, 0x954f },{ 0x93a7, 0x94e0 },{ 0x93a9, 0x94e9 }, { 0x93aa, 0x953c },{ 0x93ac, 0x9550 },{ 0x93ae, 0x9547 },{ 0x93b0, 0x9552 }, { 0x93b3, 0x954d },{ 0x93b5, 0x9553 },{ 0x93c3, 0x955e },{ 0x93c7, 0x955f }, { 0x93c8, 0x94fe },{ 0x93cc, 0x9546 },{ 0x93cd, 0x9559 },{ 0x93d1, 0x955d }, { 0x93d7, 0x94ff },{ 0x93d8, 0x9535 },{ 0x93dc, 0x9557 },{ 0x93dd, 0x9558 }, { 0x93de, 0x955b },{ 0x93df, 0x94f2 },{ 0x93e1, 0x955c },{ 0x93e2, 0x9556 }, { 0x93e4, 0x9542 },{ 0x93e8, 0x933e },{ 0x93f5, 0x94e7 },{ 0x93f7, 0x9564 }, { 0x93f9, 0x956a },{ 0x93fd, 0x9508 },{ 0x9403, 0x94d9 },{ 0x9409, 0x94e3 }, { 0x940b, 0x94f4 },{ 0x9410, 0x9563 },{ 0x9412, 0x94f9 },{ 0x9413, 0x9566 }, { 0x9414, 0x9561 },{ 0x9418, 0x949f },{ 0x9419, 0x956b },{ 0x9420, 0x9568 }, { 0x9428, 0x9544 },{ 0x942b, 0x954c },{ 0x942e, 0x9570 },{ 0x9432, 0x956f }, { 0x9433, 0x956d },{ 0x9435, 0x94c1 },{ 0x9436, 0x73af },{ 0x9438, 0x94ce }, { 0x943a, 0x94db },{ 0x943f, 0x9571 },{ 0x9444, 0x94f8 },{ 0x944a, 0x956c }, { 0x944c, 0x9554 },{ 0x9451, 0x9274 },{ 0x9452, 0x9274 },{ 0x9460, 0x94c4 }, { 0x9463, 0x9573 },{ 0x9464, 0x5228 },{ 0x946a, 0x7089 },{ 0x946d, 0x9567 }, { 0x9470, 0x94a5 },{ 0x9472, 0x9576 },{ 0x9475, 0x7f50 },{ 0x9477, 0x954a }, { 0x947c, 0x9523 },{ 0x947d, 0x94bb },{ 0x947e, 0x92ae },{ 0x947f, 0x51ff }, { 0x9577, 0x957f },{ 0x9580, 0x95e8 },{ 0x9582, 0x95e9 },{ 0x9583, 0x95ea }, { 0x9586, 0x95eb },{ 0x9589, 0x95ed },{ 0x958b, 0x5f00 },{ 0x958c, 0x95f6 }, { 0x958e, 0x95f3 },{ 0x958f, 0x95f0 },{ 0x9591, 0x95f2 },{ 0x9592, 0x95f2 }, { 0x9593, 0x95f4 },{ 0x9594, 0x95f5 },{ 0x9598, 0x95f8 },{ 0x95a1, 0x9602 }, { 0x95a3, 0x9601 },{ 0x95a4, 0x5408 },{ 0x95a5, 0x9600 },{ 0x95a8, 0x95fa }, { 0x95a9, 0x95fd },{ 0x95ab, 0x9603 },{ 0x95ac, 0x9606 },{ 0x95ad, 0x95fe }, { 0x95b1, 0x9605 },{ 0x95b6, 0x960a },{ 0x95b9, 0x9609 },{ 0x95bb, 0x960e }, { 0x95bc, 0x960f },{ 0x95bd, 0x960d },{ 0x95be, 0x9608 },{ 0x95bf, 0x960c }, { 0x95c3, 0x9612 },{ 0x95c6, 0x677f },{ 0x95c7, 0x6697 },{ 0x95c8, 0x95f1 }, { 0x95ca, 0x9614 },{ 0x95cb, 0x9615 },{ 0x95cc, 0x9611 },{ 0x95d0, 0x9617 }, { 0x95d4, 0x9616 },{ 0x95d5, 0x9619 },{ 0x95d6, 0x95ef },{ 0x95dc, 0x5173 }, { 0x95de, 0x961a },{ 0x95e1, 0x9610 },{ 0x95e2, 0x8f9f },{ 0x95e5, 0x95fc }, { 0x9628, 0x5384 },{ 0x962c, 0x5751 },{ 0x962f, 0x5740 },{ 0x964f, 0x968b }, { 0x9658, 0x9649 },{ 0x965d, 0x9655 },{ 0x965e, 0x5347 },{ 0x9663, 0x9635 }, { 0x9670, 0x9634 },{ 0x9673, 0x9648 },{ 0x9678, 0x9646 },{ 0x967d, 0x9633 }, { 0x9684, 0x5824 },{ 0x9689, 0x9667 },{ 0x968a, 0x961f },{ 0x968e, 0x9636 }, { 0x9695, 0x9668 },{ 0x969b, 0x9645 },{ 0x96a4, 0x9893 },{ 0x96a8, 0x968f }, { 0x96aa, 0x9669 },{ 0x96b1, 0x9690 },{ 0x96b4, 0x9647 },{ 0x96b8, 0x96b6 }, { 0x96bb, 0x53ea },{ 0x96cb, 0x96bd },{ 0x96d6, 0x867d },{ 0x96d9, 0x53cc }, { 0x96db, 0x96cf },{ 0x96dc, 0x6742 },{ 0x96de, 0x9e21 },{ 0x96e2, 0x79bb }, { 0x96e3, 0x96be },{ 0x96f2, 0x4e91 },{ 0x96fb, 0x7535 },{ 0x9711, 0x6cbe }, { 0x9724, 0x6e9c },{ 0x9727, 0x96fe },{ 0x973d, 0x9701 },{ 0x9742, 0x96f3 }, { 0x9744, 0x972d },{ 0x9748, 0x7075 },{ 0x975a, 0x9753 },{ 0x975c, 0x9759 }, { 0x9766, 0x817c },{ 0x9768, 0x9765 },{ 0x978f, 0x5de9 },{ 0x97a6, 0x79cb }, { 0x97c1, 0x7f30 },{ 0x97c3, 0x9791 },{ 0x97c6, 0x5343 },{ 0x97c9, 0x97af }, { 0x97cb, 0x97e6 },{ 0x97cc, 0x97e7 },{ 0x97d3, 0x97e9 },{ 0x97d9, 0x97ea }, { 0x97dc, 0x97ec },{ 0x97de, 0x97eb },{ 0x97fb, 0x97f5 },{ 0x97ff, 0x54cd }, { 0x9801, 0x9875 },{ 0x9802, 0x9876 },{ 0x9803, 0x9877 },{ 0x9805, 0x9879 }, { 0x9806, 0x987a },{ 0x9807, 0x9878 },{ 0x9808, 0x987b },{ 0x980a, 0x987c }, { 0x980c, 0x9882 },{ 0x980e, 0x9880 },{ 0x980f, 0x9883 },{ 0x9810, 0x9884 }, { 0x9811, 0x987d },{ 0x9812, 0x9881 },{ 0x9813, 0x987f },{ 0x9817, 0x9887 }, { 0x9818, 0x9886 },{ 0x981c, 0x988c },{ 0x9821, 0x9889 },{ 0x9824, 0x9890 }, { 0x9826, 0x988f },{ 0x982b, 0x4fef },{ 0x982d, 0x5934 },{ 0x9830, 0x988a }, { 0x9837, 0x9894 },{ 0x9838, 0x9888 },{ 0x9839, 0x9893 },{ 0x983b, 0x9891 }, { 0x9846, 0x9897 },{ 0x984c, 0x9898 },{ 0x984d, 0x989d },{ 0x984e, 0x989a }, { 0x984f, 0x989c },{ 0x9853, 0x989b },{ 0x9858, 0x613f },{ 0x9859, 0x98a1 }, { 0x985b, 0x98a0 },{ 0x985e, 0x7c7b },{ 0x9862, 0x989f },{ 0x9865, 0x98a2 }, { 0x9867, 0x987e },{ 0x986b, 0x98a4 },{ 0x986f, 0x663e },{ 0x9870, 0x98a6 }, { 0x9871, 0x9885 },{ 0x9873, 0x989e },{ 0x9874, 0x98a7 },{ 0x98a8, 0x98ce }, { 0x98ae, 0x98d1 },{ 0x98af, 0x98d2 },{ 0x98b1, 0x53f0 },{ 0x98b3, 0x522e }, { 0x98b6, 0x98d3 },{ 0x98ba, 0x626c },{ 0x98bc, 0x98d5 },{ 0x98c4, 0x98d8 }, { 0x98c6, 0x98d9 },{ 0x98db, 0x98de },{ 0x98e2, 0x9965 },{ 0x98e9, 0x9968 }, { 0x98ea, 0x996a },{ 0x98eb, 0x996b },{ 0x98ed, 0x996c },{ 0x98ef, 0x996d }, { 0x98f2, 0x996e },{ 0x98f4, 0x9974 },{ 0x98fc, 0x9972 },{ 0x98fd, 0x9971 }, { 0x98fe, 0x9970 },{ 0x9903, 0x997a },{ 0x9905, 0x997c },{ 0x9908, 0x7ccd }, { 0x9909, 0x9977 },{ 0x990a, 0x517b },{ 0x990c, 0x9975 },{ 0x9911, 0x997d }, { 0x9912, 0x9981 },{ 0x9913, 0x997f },{ 0x9914, 0x54fa },{ 0x9918, 0x4f59 }, { 0x991a, 0x80b4 },{ 0x991b, 0x9984 },{ 0x991e, 0x996f },{ 0x9921, 0x9985 }, { 0x9928, 0x9986 },{ 0x992c, 0x7cca },{ 0x9931, 0x7cc7 },{ 0x9933, 0x9967 }, { 0x9935, 0x5582 },{ 0x993c, 0x9969 },{ 0x993d, 0x9988 },{ 0x993e, 0x998f }, { 0x993f, 0x998a },{ 0x9943, 0x998d },{ 0x9945, 0x9992 },{ 0x9948, 0x9990 }, { 0x9949, 0x9991 },{ 0x994b, 0x9988 },{ 0x994c, 0x9994 },{ 0x9951, 0x9965 }, { 0x9952, 0x9976 },{ 0x9957, 0x98e8 },{ 0x995c, 0x990d },{ 0x995e, 0x998b }, { 0x995f, 0x9977 },{ 0x99ac, 0x9a6c },{ 0x99ad, 0x9a6d },{ 0x99ae, 0x51af }, { 0x99b1, 0x9a6e },{ 0x99b3, 0x9a70 },{ 0x99b4, 0x9a6f },{ 0x99c1, 0x9a73 }, { 0x99d0, 0x9a7b },{ 0x99d1, 0x9a7d },{ 0x99d2, 0x9a79 },{ 0x99d4, 0x9a75 }, { 0x99d5, 0x9a7e },{ 0x99d8, 0x9a80 },{ 0x99d9, 0x9a78 },{ 0x99db, 0x9a76 }, { 0x99dd, 0x9a7c },{ 0x99df, 0x9a77 },{ 0x99e2, 0x9a88 },{ 0x99ed, 0x9a87 }, { 0x99ee, 0x9a73 },{ 0x99f1, 0x9a86 },{ 0x99ff, 0x9a8f },{ 0x9a01, 0x9a8b }, { 0x9a03, 0x5446 },{ 0x9a05, 0x9a93 },{ 0x9a0d, 0x9a92 },{ 0x9a0e, 0x9a91 }, { 0x9a0f, 0x9a90 },{ 0x9a16, 0x9a9b },{ 0x9a19, 0x9a97 },{ 0x9a23, 0x9b03 }, { 0x9a2b, 0x9a9e },{ 0x9a2d, 0x9a98 },{ 0x9a2e, 0x9a9d },{ 0x9a30, 0x817e }, { 0x9a36, 0x9a7a },{ 0x9a37, 0x9a9a },{ 0x9a38, 0x9a9f },{ 0x9a3e, 0x9aa1 }, { 0x9a40, 0x84e6 },{ 0x9a41, 0x9a9c },{ 0x9a42, 0x9a96 },{ 0x9a43, 0x9aa0 }, { 0x9a44, 0x9aa2 },{ 0x9a45, 0x9a71 },{ 0x9a4a, 0x9a85 },{ 0x9a4d, 0x9a81 }, { 0x9a4f, 0x9aa3 },{ 0x9a55, 0x9a84 },{ 0x9a57, 0x9a8c },{ 0x9a5a, 0x60ca }, { 0x9a5b, 0x9a7f },{ 0x9a5f, 0x9aa4 },{ 0x9a62, 0x9a74 },{ 0x9a64, 0x9aa7 }, { 0x9a65, 0x9aa5 },{ 0x9a6a, 0x9a8a },{ 0x9aaf, 0x80ae },{ 0x9acf, 0x9ac5 }, { 0x9ad2, 0x810f },{ 0x9ad4, 0x4f53 },{ 0x9ad5, 0x9acc },{ 0x9ad6, 0x9acb }, { 0x9ae3, 0x4eff },{ 0x9aee, 0x53d1 },{ 0x9b06, 0x677e },{ 0x9b0d, 0x80e1 }, { 0x9b1a, 0x987b },{ 0x9b22, 0x9b13 },{ 0x9b25, 0x6597 },{ 0x9b27, 0x95f9 }, { 0x9b28, 0x54c4 },{ 0x9b29, 0x960b },{ 0x9b2e, 0x9604 },{ 0x9b31, 0x90c1 }, { 0x9b4e, 0x9b49 },{ 0x9b58, 0x9b47 },{ 0x9b5a, 0x9c7c },{ 0x9b68, 0x8c5a }, { 0x9b6f, 0x9c81 },{ 0x9b74, 0x9c82 },{ 0x9b77, 0x9c7f },{ 0x9b90, 0x9c90 }, { 0x9b91, 0x9c8d },{ 0x9b92, 0x9c8b },{ 0x9b9a, 0x9c92 },{ 0x9b9e, 0x9c95 }, { 0x9baa, 0x9c94 },{ 0x9bab, 0x9c9b },{ 0x9bad, 0x9c91 },{ 0x9bae, 0x9c9c }, { 0x9bc0, 0x9ca7 },{ 0x9bc1, 0x9ca0 },{ 0x9bc7, 0x9ca9 },{ 0x9bc9, 0x9ca4 }, { 0x9bca, 0x9ca8 },{ 0x9bd4, 0x9cbb },{ 0x9bd6, 0x9cad },{ 0x9bd7, 0x9c9e }, { 0x9bdb, 0x9cb7 },{ 0x9be1, 0x9cb1 },{ 0x9be2, 0x9cb5 },{ 0x9be4, 0x9cb2 }, { 0x9be7, 0x9cb3 },{ 0x9be8, 0x9cb8 },{ 0x9bea, 0x9cae },{ 0x9beb, 0x9cb0 }, { 0x9bf0, 0x9c87 },{ 0x9bfd, 0x9cab },{ 0x9c08, 0x9cbd },{ 0x9c09, 0x9cc7 }, { 0x9c0d, 0x9cc5 },{ 0x9c12, 0x9cc6 },{ 0x9c13, 0x9cc3 },{ 0x9c23, 0x9ca5 }, { 0x9c25, 0x9ccf },{ 0x9c28, 0x9cce },{ 0x9c29, 0x9cd0 },{ 0x9c2d, 0x9ccd }, { 0x9c31, 0x9ca2 },{ 0x9c32, 0x9ccc },{ 0x9c33, 0x9cd3 },{ 0x9c37, 0x9ca6 }, { 0x9c39, 0x9ca3 },{ 0x9c3b, 0x9cd7 },{ 0x9c3e, 0x9cd4 },{ 0x9c48, 0x9cd5 }, { 0x9c49, 0x9cd6 },{ 0x9c52, 0x9cdf },{ 0x9c54, 0x9cdd },{ 0x9c56, 0x9cdc }, { 0x9c57, 0x9cde },{ 0x9c58, 0x9c9f },{ 0x9c5f, 0x9c8e },{ 0x9c67, 0x9ce2 }, { 0x9c6d, 0x9c9a },{ 0x9c77, 0x9cc4 },{ 0x9c78, 0x9c88 },{ 0x9c7a, 0x9ca1 }, { 0x9ce5, 0x9e1f },{ 0x9ce7, 0x51eb },{ 0x9ce9, 0x9e20 },{ 0x9cf3, 0x51e4 }, { 0x9cf4, 0x9e23 },{ 0x9cf6, 0x9e22 },{ 0x9d06, 0x9e29 },{ 0x9d07, 0x9e28 }, { 0x9d08, 0x96c1 },{ 0x9d09, 0x9e26 },{ 0x9d15, 0x9e35 },{ 0x9d1b, 0x9e33 }, { 0x9d1d, 0x9e32 },{ 0x9d1f, 0x9e31 },{ 0x9d23, 0x9e2a },{ 0x9d26, 0x9e2f }, { 0x9d28, 0x9e2d },{ 0x9d2f, 0x9e38 },{ 0x9d30, 0x9e39 },{ 0x9d3b, 0x9e3f }, { 0x9d3f, 0x9e3d },{ 0x9d42, 0x9e3a },{ 0x9d51, 0x9e43 },{ 0x9d52, 0x9e46 }, { 0x9d53, 0x9e41 },{ 0x9d5c, 0x9e48 },{ 0x9d5d, 0x9e45 },{ 0x9d60, 0x9e44 }, { 0x9d61, 0x9e49 },{ 0x9d6a, 0x9e4c },{ 0x9d6c, 0x9e4f },{ 0x9d6f, 0x9e4e }, { 0x9d70, 0x96d5 },{ 0x9d72, 0x9e4a },{ 0x9d87, 0x9e2b },{ 0x9d89, 0x9e51 }, { 0x9d98, 0x9e55 },{ 0x9d9a, 0x9e57 },{ 0x9da9, 0x9e5c },{ 0x9daf, 0x83ba }, { 0x9db1, 0x9a9e },{ 0x9db4, 0x9e64 },{ 0x9dbb, 0x9e58 },{ 0x9dbc, 0x9e63 }, { 0x9dbf, 0x9e5a },{ 0x9dc2, 0x9e5e },{ 0x9dd3, 0x9e67 },{ 0x9dd7, 0x9e25 }, { 0x9dd9, 0x9e37 },{ 0x9dda, 0x9e68 },{ 0x9de5, 0x9e36 },{ 0x9de6, 0x9e6a }, { 0x9def, 0x9e69 },{ 0x9df0, 0x71d5 },{ 0x9df2, 0x9e6b },{ 0x9df3, 0x9e47 }, { 0x9df4, 0x9e47 },{ 0x9df8, 0x9e6c },{ 0x9df9, 0x9e70 },{ 0x9dfa, 0x9e6d }, { 0x9e15, 0x9e2c },{ 0x9e1a, 0x9e66 },{ 0x9e1b, 0x9e73 },{ 0x9e1d, 0x9e42 }, { 0x9e1e, 0x9e3e },{ 0x9e75, 0x5364 },{ 0x9e79, 0x54b8 },{ 0x9e7a, 0x9e7e }, { 0x9e7c, 0x7877 },{ 0x9e7d, 0x76d0 },{ 0x9e97, 0x4e3d },{ 0x9ea5, 0x9ea6 }, { 0x9ea9, 0x9eb8 },{ 0x9eb5, 0x9762 },{ 0x9ebc, 0x4e48 },{ 0x9ec3, 0x9ec4 }, { 0x9ecc, 0x9ec9 },{ 0x9ede, 0x70b9 },{ 0x9ee8, 0x515a },{ 0x9ef2, 0x9eea }, { 0x9ef4, 0x9709 },{ 0x9ef7, 0x9ee9 },{ 0x9efd, 0x9efe },{ 0x9eff, 0x9f0b }, { 0x9f07, 0x9ccc },{ 0x9f09, 0x9f0d },{ 0x9f15, 0x51ac },{ 0x9f34, 0x9f39 }, { 0x9f4a, 0x9f50 },{ 0x9f4b, 0x658b },{ 0x9f4e, 0x8d4d },{ 0x9f4f, 0x9f51 }, { 0x9f52, 0x9f7f },{ 0x9f54, 0x9f80 },{ 0x9f59, 0x9f85 },{ 0x9f5c, 0x9f87 }, { 0x9f5f, 0x9f83 },{ 0x9f60, 0x9f86 },{ 0x9f61, 0x9f84 },{ 0x9f63, 0x51fa }, { 0x9f66, 0x9f88 },{ 0x9f67, 0x556e },{ 0x9f6a, 0x9f8a },{ 0x9f6c, 0x9f89 }, { 0x9f72, 0x9f8b },{ 0x9f76, 0x816d },{ 0x9f77, 0x9f8c },{ 0x9f8d, 0x9f99 }, { 0x9f90, 0x5e9e },{ 0x9f94, 0x9f9a },{ 0x9f95, 0x9f9b },{ 0x9f9c, 0x9f9f }, { 0x9fa2, 0x548c },{ 0xfa0c, 0x5140 },{ 0xfe30, 0x2236 },{ 0xfe31, 0xff5c }, { 0xfe33, 0xff5c },{ 0xfe3f, 0x2227 },{ 0xfe40, 0x2228 },{ 0xfe50, 0xff0c }, { 0xfe51, 0x3001 },{ 0xfe52, 0xff0e },{ 0xfe54, 0xff1b },{ 0xfe55, 0xff1a }, { 0xfe56, 0xff1f },{ 0xfe57, 0xff01 },{ 0xfe59, 0xff08 },{ 0xfe5a, 0xff09 }, { 0xfe5b, 0xff5b },{ 0xfe5c, 0xff5d },{ 0xfe5d, 0xff3b },{ 0xfe5e, 0xff3d }, { 0xfe5f, 0xff03 },{ 0xfe60, 0xff06 },{ 0xfe61, 0xff0a },{ 0xfe62, 0xff0b }, { 0xfe63, 0xff0d },{ 0xfe64, 0xff1c },{ 0xfe65, 0xff1e },{ 0xfe66, 0xff1d }, { 0xfe69, 0xff04 },{ 0xfe6a, 0xff05 },{ 0xfe6b, 0xff20 } }; nabi-1.0.0/src/util.h0000644000175000017500000000163311655153252011267 00000000000000/* Nabi - X Input Method server for hangul * Copyright (C) 2007-2008 Choe Hwanjin * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #ifndef nabi_util_h #define nabi_util_h char* nabi_traditional_to_simplified(const char* str); #endif // nabi_util_h nabi-1.0.0/src/util.c0000644000175000017500000000344311655153252011263 00000000000000/* Nabi - X Input Method server for hangul * Copyright (C) 2007-2008 Choe Hwanjin * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #include #include #include "debug.h" typedef struct _NabiUnicharPair NabiUnicharPair; struct _NabiUnicharPair { gunichar first; gunichar second; }; #include static int pair_compare(const void* x, const void* y) { const NabiUnicharPair* a = x; const NabiUnicharPair* b = y; return a->first - b->first; } char* nabi_traditional_to_simplified(const char* str) { GString* ret; if (str == NULL) return NULL; ret = g_string_new(NULL); while (*str != '\0') { gunichar c = g_utf8_get_char(str); NabiUnicharPair key = { c, 0 }; NabiUnicharPair* res; res = bsearch(&key, nabi_tc_to_sc_table, G_N_ELEMENTS(nabi_tc_to_sc_table), sizeof(NabiUnicharPair), pair_compare); if (res == NULL) { g_string_append_unichar(ret, c); } else { nabi_log(3, "tc -> sc: %x -> %x\n", res->first, res->second); g_string_append_unichar(ret, res->second); } str = g_utf8_next_char(str); } return g_string_free(ret, FALSE); } nabi-1.0.0/src/ustring.h0000644000175000017500000000267411655153252012013 00000000000000/* Nabi - X Input Method server for hangul * Copyright (C) 2008 Choe Hwanjin * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #ifndef nabi_ustring_h #define nabi_ustring_h #include #include typedef GArray UString; UString* ustring_new(); void ustring_delete(UString* str); void ustring_clear(UString* str); UString* ustring_erase(UString* str, guint pos, guint len); ucschar* ustring_begin(UString* str); ucschar* ustring_end(UString* str); guint ustring_length(const UString* str); UString* ustring_append(UString* str, const UString* s); UString* ustring_append_ucs4(UString* str, const ucschar* s, gint len); UString* ustring_append_utf8(UString* str, const char* utf8); gchar* ustring_to_utf8(const UString* str, guint len); #endif // nabi_ustring_h nabi-1.0.0/src/ustring.c0000644000175000017500000000412011655153252011772 00000000000000/* Nabi - X Input Method server for hangul * Copyright (C) 2008 Choe Hwanjin * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #include "ustring.h" UString* ustring_new() { return g_array_new(TRUE, TRUE, sizeof(ucschar)); } void ustring_delete(UString* str) { g_array_free(str, TRUE); } void ustring_clear(UString* str) { if (str->len > 0) g_array_remove_range(str, 0, str->len); } UString* ustring_erase(UString* str, guint pos, guint len) { return g_array_remove_range(str, pos, len); } ucschar* ustring_begin(UString* str) { return (ucschar*)str->data; } ucschar* ustring_end(UString* str) { return &g_array_index(str, ucschar, str->len); } guint ustring_length(const UString* str) { return str->len; } UString* ustring_append(UString* str, const UString* s) { return g_array_append_vals(str, s->data, s->len); } UString* ustring_append_ucs4(UString* str, const ucschar* s, gint len) { if (len < 0) { const ucschar*p = s; while (*p != 0) p++; len = p - s; } return g_array_append_vals(str, s, len); } UString* ustring_append_utf8(UString* str, const char* utf8) { while (*utf8 != '\0') { ucschar c = g_utf8_get_char(utf8); g_array_append_vals(str, &c, 1); utf8 = g_utf8_next_char(utf8); } return str; } gchar* ustring_to_utf8(const UString* str, guint len) { if (len < 0) len = str->len; return g_ucs4_to_utf8((const gunichar*)str->data, len, NULL, NULL, NULL); } nabi-1.0.0/src/keyboard-layout.h0000644000175000017500000000252611655153252013427 00000000000000/* Nabi - X Input Method server for hangul * Copyright (C) 2011 Choe Hwanjin * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #ifndef nabi_keyboard_layout_h #define nabi_keyboard_layout_h #include #include typedef struct _NabiKeyboardLayout NabiKeyboardLayout; struct _NabiKeyboardLayout { char* name; GArray* table; }; NabiKeyboardLayout* nabi_keyboard_layout_new(const char* name); void nabi_keyboard_layout_free(gpointer data, gpointer user_data); void nabi_keyboard_layout_append(NabiKeyboardLayout* layout, KeySym key, KeySym value); KeySym nabi_keyboard_layout_get_key(NabiKeyboardLayout* layout, KeySym keysym); #endif /* nabi_keyboard_layout_h */ nabi-1.0.0/src/keyboard-layout.c0000644000175000017500000000426611655153252013425 00000000000000/* Nabi - X Input Method server for hangul * Copyright (C) 2011 Choe Hwanjin * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #ifdef HAVE_CONFIG_H #include #endif #include #include "keyboard-layout.h" struct KeySymPair { KeySym key; KeySym value; }; NabiKeyboardLayout* nabi_keyboard_layout_new(const char* name) { NabiKeyboardLayout* layout = g_new(NabiKeyboardLayout, 1); layout->name = g_strdup(name); layout->table = NULL; return layout; } static int nabi_keyboard_layout_cmp(const void* a, const void* b) { const struct KeySymPair* pair1 = a; const struct KeySymPair* pair2 = b; return pair1->key - pair2->key; } void nabi_keyboard_layout_append(NabiKeyboardLayout* layout, KeySym key, KeySym value) { struct KeySymPair item = { key, value }; if (layout->table == NULL) layout->table = g_array_new(FALSE, FALSE, sizeof(struct KeySymPair)); g_array_append_vals(layout->table, &item, 1); } KeySym nabi_keyboard_layout_get_key(NabiKeyboardLayout* layout, KeySym keysym) { if (layout->table != NULL) { struct KeySymPair key = { keysym, 0 }; struct KeySymPair* ret; ret = bsearch(&key, layout->table->data, layout->table->len, sizeof(key), nabi_keyboard_layout_cmp); if (ret) { return ret->value; } } return keysym; } void nabi_keyboard_layout_free(gpointer data, gpointer user_data) { NabiKeyboardLayout *layout = data; g_free(layout->name); if (layout->table != NULL) g_array_free(layout->table, TRUE); g_free(layout); } nabi-1.0.0/src/main.c0000644000175000017500000000576311655153252011241 00000000000000/* Nabi - X Input Method server for hangul * Copyright (C) 2003-2008 Choe Hwanjin * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include #include #include #include #include "gettext.h" #include "server.h" #include "session.h" #include "nabi.h" #include "debug.h" NabiApplication* nabi = NULL; NabiServer* nabi_server = NULL; static int nabi_x_error_handler(Display *display, XErrorEvent *error) { gchar buf[64]; XGetErrorText (display, error->error_code, buf, 63); fprintf(stderr, "Nabi: X error: %s\n", buf); return 0; } static int nabi_x_io_error_handler(Display* display) { nabi_log(1, "x io error: save config\n"); nabi_server_write_log(nabi_server); nabi_app_save_config(); exit(0); } int main(int argc, char *argv[]) { GtkWidget *widget; #ifdef ENABLE_NLS bindtextdomain(PACKAGE, LOCALEDIR); bind_textdomain_codeset(PACKAGE, "UTF-8"); textdomain(PACKAGE); #endif gtk_init(&argc, &argv); nabi_log_set_device("stdout"); nabi_app_new(); nabi_app_init(&argc, &argv); XSetErrorHandler(nabi_x_error_handler); XSetIOErrorHandler(nabi_x_io_error_handler); if (!nabi->status_only) { Display* display; int screen; char *xim_name; /* we prefer command line option as default xim name */ if (nabi->xim_name != NULL) xim_name = nabi->xim_name; else xim_name = nabi->config->xim_name->str; if (nabi_server_is_running(xim_name)) { nabi_log(1, "xim %s is already running\n", xim_name); goto quit; } display = gdk_x11_get_default_xdisplay(); screen = gdk_x11_get_default_screen(); nabi_server = nabi_server_new(display, screen, xim_name); nabi_app_setup_server(); } widget = nabi_app_create_palette(); gtk_widget_show(widget); if (nabi_server != NULL) { nabi_server_start(nabi_server); } if (nabi_log_get_level() == 0) nabi_session_open(nabi->session_id); gtk_main(); if (nabi_log_get_level() == 0) nabi_session_close(); if (nabi_server != NULL) { nabi_server_stop(nabi_server); nabi_server_write_log(nabi_server); nabi_server_destroy(nabi_server); nabi_server = NULL; } quit: nabi_app_free(); return 0; } /* vim: set ts=8 sts=4 sw=4 : */ nabi-1.0.0/tables/0000755000175000017500000000000012100712170010663 500000000000000nabi-1.0.0/tables/Makefile.am0000644000175000017500000000026311655153252012656 00000000000000 keyboarddir = @NABI_DATA_DIR@ keyboard_DATA = keyboard_layouts symboltabledir = @NABI_DATA_DIR@ symboltable_DATA = symbol.txt EXTRA_DIST = $(keyboard_DATA) $(symboltable_DATA) nabi-1.0.0/tables/Makefile.in0000644000175000017500000003063712066005053012667 00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = tables DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(keyboarddir)" \ "$(DESTDIR)$(symboltabledir)" DATA = $(keyboard_DATA) $(symboltable_DATA) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ LDFLAGS = @LDFLAGS@ LIBHANGUL_CFLAGS = @LIBHANGUL_CFLAGS@ LIBHANGUL_LIBS = @LIBHANGUL_LIBS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ NABI_DATA_DIR = @NABI_DATA_DIR@ NABI_THEMES_DIR = @NABI_THEMES_DIR@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ keyboarddir = @NABI_DATA_DIR@ keyboard_DATA = keyboard_layouts symboltabledir = @NABI_DATA_DIR@ symboltable_DATA = symbol.txt EXTRA_DIST = $(keyboard_DATA) $(symboltable_DATA) all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu tables/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu tables/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-keyboardDATA: $(keyboard_DATA) @$(NORMAL_INSTALL) test -z "$(keyboarddir)" || $(MKDIR_P) "$(DESTDIR)$(keyboarddir)" @list='$(keyboard_DATA)'; test -n "$(keyboarddir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(keyboarddir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(keyboarddir)" || exit $$?; \ done uninstall-keyboardDATA: @$(NORMAL_UNINSTALL) @list='$(keyboard_DATA)'; test -n "$(keyboarddir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(keyboarddir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(keyboarddir)" && rm -f $$files install-symboltableDATA: $(symboltable_DATA) @$(NORMAL_INSTALL) test -z "$(symboltabledir)" || $(MKDIR_P) "$(DESTDIR)$(symboltabledir)" @list='$(symboltable_DATA)'; test -n "$(symboltabledir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(symboltabledir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(symboltabledir)" || exit $$?; \ done uninstall-symboltableDATA: @$(NORMAL_UNINSTALL) @list='$(symboltable_DATA)'; test -n "$(symboltabledir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(symboltabledir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(symboltabledir)" && rm -f $$files tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(DATA) installdirs: for dir in "$(DESTDIR)$(keyboarddir)" "$(DESTDIR)$(symboltabledir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-keyboardDATA install-symboltableDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-keyboardDATA uninstall-symboltableDATA .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic distclean \ distclean-generic distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am \ install-keyboardDATA install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip install-symboltableDATA \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am uninstall uninstall-am uninstall-keyboardDATA \ uninstall-symboltableDATA # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: nabi-1.0.0/tables/keyboard_layouts0000644000175000017500000002201711655153252014126 00000000000000[Dvorak] 0x0022 0x0051 # XK_quotedbl -> XK_Q 0x0027 0x0071 # XK_apostrophe -> XK_q 0x002b 0x007d # XK_plus -> XK_braceright 0x002c 0x0077 # XK_comma -> XK_w 0x002d 0x0027 # XK_minus -> XK_apostrophe 0x002e 0x0065 # XK_period -> XK_e 0x002f 0x005b # XK_slash -> XK_bracketleft 0x003a 0x005a # XK_colon -> XK_Z 0x003b 0x007a # XK_semicolon -> XK_z 0x003c 0x0057 # XK_less -> XK_W 0x003d 0x005d # XK_equal -> XK_bracketright 0x003e 0x0045 # XK_greater -> XK_E 0x003f 0x007b # XK_question -> XK_braceleft 0x0042 0x004e # XK_B -> XK_N 0x0043 0x0049 # XK_C -> XK_I 0x0044 0x0048 # XK_D -> XK_H 0x0045 0x0044 # XK_E -> XK_D 0x0046 0x0059 # XK_F -> XK_Y 0x0047 0x0055 # XK_G -> XK_U 0x0048 0x004a # XK_H -> XK_J 0x0049 0x0047 # XK_I -> XK_G 0x004a 0x0043 # XK_J -> XK_C 0x004b 0x0056 # XK_K -> XK_V 0x004c 0x0050 # XK_L -> XK_P 0x004e 0x004c # XK_N -> XK_L 0x004f 0x0053 # XK_O -> XK_S 0x0050 0x0052 # XK_P -> XK_R 0x0051 0x0058 # XK_Q -> XK_X 0x0052 0x004f # XK_R -> XK_O 0x0053 0x003a # XK_S -> XK_colon 0x0054 0x004b # XK_T -> XK_K 0x0055 0x0046 # XK_U -> XK_F 0x0056 0x003e # XK_V -> XK_greater 0x0057 0x003c # XK_W -> XK_less 0x0058 0x0042 # XK_X -> XK_B 0x0059 0x0054 # XK_Y -> XK_T 0x005a 0x003f # XK_Z -> XK_question 0x005b 0x002d # XK_bracketleft -> XK_minus 0x005d 0x003d # XK_bracketright -> XK_equal 0x005f 0x0022 # XK_underscore -> XK_quotedbl 0x0062 0x006e # XK_b -> XK_n 0x0063 0x0069 # XK_c -> XK_i 0x0064 0x0068 # XK_d -> XK_h 0x0065 0x0064 # XK_e -> XK_d 0x0066 0x0079 # XK_f -> XK_y 0x0067 0x0075 # XK_g -> XK_u 0x0068 0x006a # XK_h -> XK_j 0x0069 0x0067 # XK_i -> XK_g 0x006a 0x0063 # XK_j -> XK_c 0x006b 0x0076 # XK_k -> XK_v 0x006c 0x0070 # XK_l -> XK_p 0x006e 0x006c # XK_n -> XK_l 0x006f 0x0073 # XK_o -> XK_s 0x0070 0x0072 # XK_p -> XK_r 0x0071 0x0078 # XK_q -> XK_x 0x0072 0x006f # XK_r -> XK_o 0x0073 0x003b # XK_s -> XK_semicolon 0x0074 0x006b # XK_t -> XK_k 0x0075 0x0066 # XK_u -> XK_f 0x0076 0x002e # XK_v -> XK_period 0x0077 0x002c # XK_w -> XK_comma 0x0078 0x0062 # XK_x -> XK_b 0x0079 0x0074 # XK_y -> XK_t 0x007a 0x002f # XK_z -> XK_slash 0x007b 0x005f # XK_braceleft -> XK_underscore 0x007d 0x002b # XK_braceright -> XK_plus [Colemak] 0x003a 0x0050 # XK_colon -> XK_P 0x003b 0x0070 # XK_semicolon -> XK_p 0x0044 0x0047 # XK_D -> XK_G 0x0045 0x004b # XK_E -> XK_K 0x0046 0x0045 # XK_F -> XK_E 0x0047 0x0054 # XK_G -> XK_T 0x0049 0x004c # XK_I -> XK_L 0x004a 0x0059 # XK_J -> XK_Y 0x004b 0x004e # XK_K -> XK_N 0x004c 0x0055 # XK_L -> XK_U 0x004e 0x004a # XK_N -> XK_J 0x004f 0x003a # XK_O -> XK_colon 0x0050 0x0052 # XK_P -> XK_R 0x0052 0x0053 # XK_R -> XK_S 0x0053 0x0044 # XK_S -> XK_D 0x0054 0x0046 # XK_T -> XK_F 0x0055 0x0049 # XK_U -> XK_I 0x0059 0x004f # XK_Y -> XK_O 0x0064 0x0067 # XK_d -> XK_g 0x0065 0x006b # XK_e -> XK_k 0x0066 0x0065 # XK_f -> XK_e 0x0067 0x0074 # XK_g -> XK_t 0x0069 0x006c # XK_i -> XK_l 0x006a 0x0079 # XK_j -> XK_y 0x006b 0x006e # XK_k -> XK_n 0x006c 0x0075 # XK_l -> XK_u 0x006e 0x006a # XK_n -> XK_j 0x006f 0x003b # XK_o -> XK_semicolon 0x0070 0x0072 # XK_p -> XK_r 0x0072 0x0073 # XK_r -> XK_s 0x0073 0x0064 # XK_s -> XK_d 0x0074 0x0066 # XK_t -> XK_f 0x0075 0x0069 # XK_u -> XK_i 0x0079 0x006f # XK_y -> XK_o [French] 0x0021 0x002f # XK_exclam -> XK_slash 0x0022 0x0033 # XK_quotedbl -> XK_3 0x0024 0x005d # XK_dollar -> XK_bracketright 0x0025 0x0022 # XK_percent -> XK_quotedbl 0x0026 0x0031 # XK_ampersand -> XK_1 0x0027 0x0034 # XK_apostrophe -> XK_4 0x0028 0x0035 # XK_parenleft -> XK_5 0x0029 0x002d # XK_parenright -> XK_minus 0x002a 0x005c # XK_asterisk -> XK_backslash 0x002c 0x006d # XK_comma -> XK_m 0x002d 0x0036 # XK_minus -> XK_6 0x002e 0x003c # XK_period -> XK_less 0x002f 0x003e # XK_slash -> XK_greater 0x0030 0x0029 # XK_0 -> XK_parenright 0x0031 0x0021 # XK_1 -> XK_exclam 0x0032 0x0040 # XK_2 -> XK_at 0x0033 0x0023 # XK_3 -> XK_numbersign 0x0034 0x0024 # XK_4 -> XK_dollar 0x0035 0x0025 # XK_5 -> XK_percent 0x0036 0x005e # XK_6 -> XK_asciicircum 0x0037 0x0026 # XK_7 -> XK_ampersand 0x0038 0x002a # XK_8 -> XK_asterisk 0x0039 0x0028 # XK_9 -> XK_parenleft 0x003a 0x002e # XK_colon -> XK_period 0x003b 0x002c # XK_semicolon -> XK_comma 0x003f 0x004d # XK_question -> XK_M 0x0041 0x0051 # XK_A -> XK_Q 0x004d 0x003a # XK_M -> XK_colon 0x0051 0x0041 # XK_Q -> XK_A 0x0057 0x005a # XK_W -> XK_Z 0x005a 0x0057 # XK_Z -> XK_W 0x005f 0x0038 # XK_underscore -> XK_8 0x0061 0x0071 # XK_a -> XK_q 0x006d 0x003b # XK_m -> XK_semicolon 0x0071 0x0061 # XK_q -> XK_a 0x0077 0x007a # XK_w -> XK_z 0x007a 0x0077 # XK_z -> XK_w 0x00a3 0x007d # XK_sterling -> XK_braceright 0x00a7 0x003f # XK_section -> XK_question 0x00b0 0x005f # XK_degree -> XK_underscore 0x00b2 0x0060 # XK_twosuperior -> XK_grave 0x00b5 0x007c # XK_mu -> XK_bar 0x00e0 0x0030 # XK_agrave -> XK_0 0x00e7 0x0039 # XK_ccedilla -> XK_9 0x00e8 0x0037 # XK_egrave -> XK_7 0x00e9 0x0032 # XK_eacute -> XK_2 0x00f9 0x0027 # XK_ugrave -> XK_apostrophe 0xfe52 0x005b # XK_dead_circumflex -> XK_bracketleft 0xfe57 0x007b # XK_dead_diaeresis -> XK_braceleft [Germany] 0x0022 0x0040 # XK_quotedbl -> XK_at 0x0023 0x005c # XK_numbersign -> XK_backslash 0x0026 0x005e # XK_ampersand -> XK_asciicircum 0x0027 0x007c # XK_apostrophe -> XK_bar 0x0028 0x002a # XK_parenleft -> XK_asterisk 0x0029 0x0028 # XK_parenright -> XK_parenleft 0x002a 0x007d # XK_asterisk -> XK_braceright 0x002b 0x005d # XK_plus -> XK_bracketright 0x002d 0x002f # XK_minus -> XK_slash 0x002f 0x0026 # XK_slash -> XK_ampersand 0x003a 0x003e # XK_colon -> XK_greater 0x003b 0x003c # XK_semicolon -> XK_less 0x003d 0x0029 # XK_equal -> XK_parenright 0x003f 0x005f # XK_question -> XK_underscore 0x0059 0x005a # XK_Y -> XK_Z 0x005a 0x0059 # XK_Z -> XK_Y 0x005e 0x0060 # XK_asciicircum -> XK_grave 0x005f 0x003f # XK_underscore -> XK_question 0x0079 0x007a # XK_y -> XK_z 0x007a 0x0079 # XK_z -> XK_y 0x00a7 0x0023 # XK_section -> XK_numbersign 0x00b0 0x007e # XK_degree -> XK_asciitilde 0x00c4 0x0022 # XK_Adiaeresis -> XK_quotedbl 0x00d6 0x003a # XK_Odiaeresis -> XK_colon 0x00dc 0x007b # XK_Udiaeresis -> XK_braceleft 0x00df 0x002d # XK_ssharp -> XK_minus 0x00e4 0x0027 # XK_adiaeresis -> XK_apostrophe 0x00f6 0x003b # XK_odiaeresis -> XK_semicolon 0x00fc 0x005b # XK_udiaeresis -> XK_bracketleft 0xfe50 0x002b # XK_dead_grave -> XK_plus 0xfe51 0x003d # XK_dead_acute -> XK_equal 0xfe52 0x0060 # XK_dead_circumflex -> XK_grave nabi-1.0.0/tables/symbol.txt0000644000175000017500000002401711701776640012677 00000000000000# Copyright (c) 2005,2006 Choe Hwanjin # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # 1. Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # 3. Neither the name of the author nor the names of its contributors # may be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. ㄱ: : ㄱ:!: ㄱ:': ㄱ:,: ㄱ:.: ㄱ:/: ㄱ::: ㄱ:;: ㄱ:?: ㄱ:^: ㄱ:_: ㄱ:`: ㄱ:|: ㄱ: ̄: ㄱ:、: ㄱ:。: ㄱ:·: ㄱ:‥: ㄱ:…: ㄱ:¨: ㄱ:〃: ㄱ:­: ㄱ:―: ㄱ:∥: ㄱ:\: ㄱ:∼: ㄱ:´: ㄱ:~: ㄱ:ˇ: ㄱ:˘: ㄱ:˝: ㄱ:˚: ㄱ:˙: ㄱ:¸: ㄱ:˛: ㄱ:¡: ㄱ:¿: ㄱ:ː: ㄲ:Æ: ㄲ:Ð: ㄲ:Ħ: ㄲ:IJ: ㄲ:Ŀ: ㄲ:Ł: ㄲ:Ø: ㄲ:Œ: ㄲ:Þ: ㄲ:Ŧ: ㄲ:Ŋ: ㄲ:æ: ㄲ:đ: ㄲ:ð: ㄲ:ħ: ㄲ:ı: ㄲ:ij: ㄲ:ĸ: ㄲ:ŀ: ㄲ:ł: ㄲ:ø: ㄲ:œ: ㄲ:ß: ㄲ:þ: ㄲ:ŧ: ㄲ:ŋ: ㄲ:ʼn: ㄴ:": ㄴ:(: ㄴ:): ㄴ:[: ㄴ:]: ㄴ:{: ㄴ:}: ㄴ:‘: ㄴ:’: ㄴ:“: ㄴ:”: ㄴ:〔: ㄴ:〕: ㄴ:〈: ㄴ:〉: ㄴ:《: ㄴ:》: ㄴ:「: ㄴ:」: ㄴ:『: ㄴ:』: ㄴ:【: ㄴ:】: ㄷ:+: ㄷ:-: ㄷ:<: ㄷ:=: ㄷ:>: ㄷ:±: ㄷ:×: ㄷ:÷: ㄷ:≠: ㄷ:≤: ㄷ:≥: ㄷ:∞: ㄷ:∴: ㄷ:♂: ㄷ:♀: ㄷ:∠: ㄷ:⊥: ㄷ:⌒: ㄷ:∂: ㄷ:∇: ㄷ:≡: ㄷ:≒: ㄷ:≪: ㄷ:≫: ㄷ:√: ㄷ:∽: ㄷ:∝: ㄷ:∵: ㄷ:∫: ㄷ:∬: ㄷ:∈: ㄷ:∋: ㄷ:⊆: ㄷ:⊇: ㄷ:⊂: ㄷ:⊃: ㄷ:∪: ㄷ:∩: ㄷ:∧: ㄷ:∨: ㄷ:¬: ㄷ:⇒: ㄷ:⇔: ㄷ:∀: ㄷ:∃: ㄷ:∮: ㄷ:∑: ㄷ:∏: ㄸ:ぁ: ㄸ:あ: ㄸ:ぃ: ㄸ:い: ㄸ:ぅ: ㄸ:う: ㄸ:ぇ: ㄸ:え: ㄸ:ぉ: ㄸ:お: ㄸ:か: ㄸ:が: ㄸ:き: ㄸ:ぎ: ㄸ:く: ㄸ:ぐ: ㄸ:け: ㄸ:げ: ㄸ:こ: ㄸ:ご: ㄸ:さ: ㄸ:ざ: ㄸ:し: ㄸ:じ: ㄸ:す: ㄸ:ず: ㄸ:せ: ㄸ:ぜ: ㄸ:そ: ㄸ:ぞ: ㄸ:た: ㄸ:だ: ㄸ:ち: ㄸ:ぢ: ㄸ:っ: ㄸ:つ: ㄸ:づ: ㄸ:て: ㄸ:で: ㄸ:と: ㄸ:ど: ㄸ:な: ㄸ:に: ㄸ:ぬ: ㄸ:ね: ㄸ:の: ㄸ:は: ㄸ:ば: ㄸ:ぱ: ㄸ:ひ: ㄸ:び: ㄸ:ぴ: ㄸ:ふ: ㄸ:ぶ: ㄸ:ぷ: ㄸ:へ: ㄸ:べ: ㄸ:ぺ: ㄸ:ほ: ㄸ:ぼ: ㄸ:ぽ: ㄸ:ま: ㄸ:み: ㄸ:む: ㄸ:め: ㄸ:も: ㄸ:ゃ: ㄸ:や: ㄸ:ゅ: ㄸ:ゆ: ㄸ:ょ: ㄸ:よ: ㄸ:ら: ㄸ:り: ㄸ:る: ㄸ:れ: ㄸ:ろ: ㄸ:ゎ: ㄸ:わ: ㄸ:ゐ: ㄸ:ゑ: ㄸ:を: ㄸ:ん: ㄹ:$: ㄹ:%: ㄹ:₩: ㄹ:F: ㄹ:′: ㄹ:″: ㄹ:℃: ㄹ:Å: ㄹ:¢: ㄹ:£: ㄹ:¥: ㄹ:¤: ㄹ:℉: ㄹ:‰: ㄹ:€: ㄹ:㎕: ㄹ:㎖: ㄹ:㎗: ㄹ:ℓ: ㄹ:㎘: ㄹ:㏄: ㄹ:㎣: ㄹ:㎤: ㄹ:㎥: ㄹ:㎦: ㄹ:㎙: ㄹ:㎚: ㄹ:㎛: ㄹ:㎜: ㄹ:㎝: ㄹ:㎞: ㄹ:㎟: ㄹ:㎠: ㄹ:㎡: ㄹ:㎢: ㄹ:㏊: ㄹ:㎍: ㄹ:㎎: ㄹ:㎏: ㄹ:㏏: ㄹ:㎈: ㄹ:㎉: ㄹ:㏈: ㄹ:㎧: ㄹ:㎨: ㄹ:㎰: ㄹ:㎱: ㄹ:㎲: ㄹ:㎳: ㄹ:㎴: ㄹ:㎵: ㄹ:㎶: ㄹ:㎷: ㄹ:㎸: ㄹ:㎹: ㄹ:㎀: ㄹ:㎁: ㄹ:㎂: ㄹ:㎃: ㄹ:㎄: ㄹ:㎺: ㄹ:㎻: ㄹ:㎼: ㄹ:㎽: ㄹ:㎾: ㄹ:㎿: ㄹ:㎐: ㄹ:㎑: ㄹ:㎒: ㄹ:㎓: ㄹ:㎔: ㄹ:Ω: ㄹ:㏀: ㄹ:㏁: ㄹ:㎊: ㄹ:㎋: ㄹ:㎌: ㄹ:㏖: ㄹ:㏅: ㄹ:㎭: ㄹ:㎮: ㄹ:㎯: ㄹ:㏛: ㄹ:㎩: ㄹ:㎪: ㄹ:㎫: ㄹ:㎬: ㄹ:㏝: ㄹ:㏐: ㄹ:㏓: ㄹ:㏃: ㄹ:㏉: ㄹ:㏜: ㄹ:㏆: ㅁ:#: ㅁ:&: ㅁ:*: ㅁ:@: ㅁ:§: ㅁ:※: ㅁ:☆: ㅁ:★: ㅁ:○: ㅁ:●: ㅁ:◎: ㅁ:◇: ㅁ:◆: ㅁ:□: ㅁ:■: ㅁ:△: ㅁ:▲: ㅁ:▽: ㅁ:▼: ㅁ:→: ㅁ:←: ㅁ:↑: ㅁ:↓: ㅁ:↔: ㅁ:〓: ㅁ:◁: ㅁ:◀: ㅁ:▷: ㅁ:▶: ㅁ:♤: ㅁ:♠: ㅁ:♡: ㅁ:♥: ㅁ:♧: ㅁ:♣: ㅁ:⊙: ㅁ:◈: ㅁ:▣: ㅁ:◐: ㅁ:◑: ㅁ:▒: ㅁ:▤: ㅁ:▥: ㅁ:▨: ㅁ:▧: ㅁ:▦: ㅁ:▩: ㅁ:♨: ㅁ:☏: ㅁ:☎: ㅁ:☜: ㅁ:☞: ㅁ:¶: ㅁ:†: ㅁ:‡: ㅁ:↕: ㅁ:↗: ㅁ:↙: ㅁ:↖: ㅁ:↘: ㅁ:♭: ㅁ:♩: ㅁ:♪: ㅁ:♬: ㅁ:㉿: ㅁ:㈜: ㅁ:№: ㅁ:㏇: ㅁ:™: ㅁ:㏂: ㅁ:㏘: ㅁ:℡: ㅁ:®: ㅁ:ª: ㅁ:º: ㅂ:─: ㅂ:│: ㅂ:┌: ㅂ:┐: ㅂ:┘: ㅂ:└: ㅂ:├: ㅂ:┬: ㅂ:┤: ㅂ:┴: ㅂ:┼: ㅂ:━: ㅂ:┃: ㅂ:┏: ㅂ:┓: ㅂ:┛: ㅂ:┗: ㅂ:┣: ㅂ:┳: ㅂ:┫: ㅂ:┻: ㅂ:╋: ㅂ:┠: ㅂ:┯: ㅂ:┨: ㅂ:┷: ㅂ:┿: ㅂ:┝: ㅂ:┰: ㅂ:┥: ㅂ:┸: ㅂ:╂: ㅂ:┒: ㅂ:┑: ㅂ:┚: ㅂ:┙: ㅂ:┖: ㅂ:┕: ㅂ:┎: ㅂ:┍: ㅂ:┞: ㅂ:┟: ㅂ:┡: ㅂ:┢: ㅂ:┦: ㅂ:┧: ㅂ:┩: ㅂ:┪: ㅂ:┭: ㅂ:┮: ㅂ:┱: ㅂ:┲: ㅂ:┵: ㅂ:┶: ㅂ:┹: ㅂ:┺: ㅂ:┽: ㅂ:┾: ㅂ:╀: ㅂ:╁: ㅂ:╃: ㅂ:╄: ㅂ:╅: ㅂ:╆: ㅂ:╇: ㅂ:╈: ㅂ:╉: ㅂ:╊: ㅃ:ァ: ㅃ:ア: ㅃ:ィ: ㅃ:イ: ㅃ:ゥ: ㅃ:ウ: ㅃ:ェ: ㅃ:エ: ㅃ:ォ: ㅃ:オ: ㅃ:カ: ㅃ:ガ: ㅃ:キ: ㅃ:ギ: ㅃ:ク: ㅃ:グ: ㅃ:ケ: ㅃ:ゲ: ㅃ:コ: ㅃ:ゴ: ㅃ:サ: ㅃ:ザ: ㅃ:シ: ㅃ:ジ: ㅃ:ス: ㅃ:ズ: ㅃ:セ: ㅃ:ゼ: ㅃ:ソ: ㅃ:ゾ: ㅃ:タ: ㅃ:ダ: ㅃ:チ: ㅃ:ヂ: ㅃ:ッ: ㅃ:ツ: ㅃ:ヅ: ㅃ:テ: ㅃ:デ: ㅃ:ト: ㅃ:ド: ㅃ:ナ: ㅃ:ニ: ㅃ:ヌ: ㅃ:ネ: ㅃ:ノ: ㅃ:ハ: ㅃ:バ: ㅃ:パ: ㅃ:ヒ: ㅃ:ビ: ㅃ:ピ: ㅃ:フ: ㅃ:ブ: ㅃ:プ: ㅃ:ヘ: ㅃ:ベ: ㅃ:ペ: ㅃ:ホ: ㅃ:ボ: ㅃ:ポ: ㅃ:マ: ㅃ:ミ: ㅃ:ム: ㅃ:メ: ㅃ:モ: ㅃ:ャ: ㅃ:ヤ: ㅃ:ュ: ㅃ:ユ: ㅃ:ョ: ㅃ:ヨ: ㅃ:ラ: ㅃ:リ: ㅃ:ル: ㅃ:レ: ㅃ:ロ: ㅃ:ヮ: ㅃ:ワ: ㅃ:ヰ: ㅃ:ヱ: ㅃ:ヲ: ㅃ:ン: ㅃ:ヴ: ㅃ:ヵ: ㅃ:ヶ: ㅅ:㉠: ㅅ:㉡: ㅅ:㉢: ㅅ:㉣: ㅅ:㉤: ㅅ:㉥: ㅅ:㉦: ㅅ:㉧: ㅅ:㉨: ㅅ:㉩: ㅅ:㉪: ㅅ:㉫: ㅅ:㉬: ㅅ:㉭: ㅅ:㉮: ㅅ:㉯: ㅅ:㉰: ㅅ:㉱: ㅅ:㉲: ㅅ:㉳: ㅅ:㉴: ㅅ:㉵: ㅅ:㉶: ㅅ:㉷: ㅅ:㉸: ㅅ:㉹: ㅅ:㉺: ㅅ:㉻: ㅅ:㈀: ㅅ:㈁: ㅅ:㈂: ㅅ:㈃: ㅅ:㈄: ㅅ:㈅: ㅅ:㈆: ㅅ:㈇: ㅅ:㈈: ㅅ:㈉: ㅅ:㈊: ㅅ:㈋: ㅅ:㈌: ㅅ:㈍: ㅅ:㈎: ㅅ:㈏: ㅅ:㈐: ㅅ:㈑: ㅅ:㈒: ㅅ:㈓: ㅅ:㈔: ㅅ:㈕: ㅅ:㈖: ㅅ:㈗: ㅅ:㈘: ㅅ:㈙: ㅅ:㈚: ㅅ:㈛: ㅆ:А: ㅆ:Б: ㅆ:В: ㅆ:Г: ㅆ:Д: ㅆ:Е: ㅆ:Ё: ㅆ:Ж: ㅆ:З: ㅆ:И: ㅆ:Й: ㅆ:К: ㅆ:Л: ㅆ:М: ㅆ:Н: ㅆ:О: ㅆ:П: ㅆ:Р: ㅆ:С: ㅆ:Т: ㅆ:У: ㅆ:Ф: ㅆ:Х: ㅆ:Ц: ㅆ:Ч: ㅆ:Ш: ㅆ:Щ: ㅆ:Ъ: ㅆ:Ы: ㅆ:Ь: ㅆ:Э: ㅆ:Ю: ㅆ:Я: ㅆ:а: ㅆ:б: ㅆ:в: ㅆ:г: ㅆ:д: ㅆ:е: ㅆ:ё: ㅆ:ж: ㅆ:з: ㅆ:и: ㅆ:й: ㅆ:к: ㅆ:л: ㅆ:м: ㅆ:н: ㅆ:о: ㅆ:п: ㅆ:р: ㅆ:с: ㅆ:т: ㅆ:у: ㅆ:ф: ㅆ:х: ㅆ:ц: ㅆ:ч: ㅆ:ш: ㅆ:щ: ㅆ:ъ: ㅆ:ы: ㅆ:ь: ㅆ:э: ㅆ:ю: ㅆ:я: ㅇ:ⓐ: ㅇ:ⓑ: ㅇ:ⓒ: ㅇ:ⓓ: ㅇ:ⓔ: ㅇ:ⓕ: ㅇ:ⓖ: ㅇ:ⓗ: ㅇ:ⓘ: ㅇ:ⓙ: ㅇ:ⓚ: ㅇ:ⓛ: ㅇ:ⓜ: ㅇ:ⓝ: ㅇ:ⓞ: ㅇ:ⓟ: ㅇ:ⓠ: ㅇ:ⓡ: ㅇ:ⓢ: ㅇ:ⓣ: ㅇ:ⓤ: ㅇ:ⓥ: ㅇ:ⓦ: ㅇ:ⓧ: ㅇ:ⓨ: ㅇ:ⓩ: ㅇ:①: ㅇ:②: ㅇ:③: ㅇ:④: ㅇ:⑤: ㅇ:⑥: ㅇ:⑦: ㅇ:⑧: ㅇ:⑨: ㅇ:⑩: ㅇ:⑪: ㅇ:⑫: ㅇ:⑬: ㅇ:⑭: ㅇ:⑮: ㅇ:⒜: ㅇ:⒝: ㅇ:⒞: ㅇ:⒟: ㅇ:⒠: ㅇ:⒡: ㅇ:⒢: ㅇ:⒣: ㅇ:⒤: ㅇ:⒥: ㅇ:⒦: ㅇ:⒧: ㅇ:⒨: ㅇ:⒩: ㅇ:⒪: ㅇ:⒫: ㅇ:⒬: ㅇ:⒭: ㅇ:⒮: ㅇ:⒯: ㅇ:⒰: ㅇ:⒱: ㅇ:⒲: ㅇ:⒳: ㅇ:⒴: ㅇ:⒵: ㅇ:⑴: ㅇ:⑵: ㅇ:⑶: ㅇ:⑷: ㅇ:⑸: ㅇ:⑹: ㅇ:⑺: ㅇ:⑻: ㅇ:⑼: ㅇ:⑽: ㅇ:⑾: ㅇ:⑿: ㅇ:⒀: ㅇ:⒁: ㅇ:⒂: ㅈ:0: ㅈ:1: ㅈ:2: ㅈ:3: ㅈ:4: ㅈ:5: ㅈ:6: ㅈ:7: ㅈ:8: ㅈ:9: ㅈ:ⅰ: ㅈ:ⅱ: ㅈ:ⅲ: ㅈ:ⅳ: ㅈ:ⅴ: ㅈ:ⅵ: ㅈ:ⅶ: ㅈ:ⅷ: ㅈ:ⅸ: ㅈ:ⅹ: ㅈ:Ⅰ: ㅈ:Ⅱ: ㅈ:Ⅲ: ㅈ:Ⅳ: ㅈ:Ⅴ: ㅈ:Ⅵ: ㅈ:Ⅶ: ㅈ:Ⅷ: ㅈ:Ⅸ: ㅈ:Ⅹ: ㅊ:½: ㅊ:⅓: ㅊ:⅔: ㅊ:¼: ㅊ:¾: ㅊ:⅛: ㅊ:⅜: ㅊ:⅝: ㅊ:⅞: ㅊ:¹: ㅊ:²: ㅊ:³: ㅊ:⁴: ㅊ:ⁿ: ㅊ:₁: ㅊ:₂: ㅊ:₃: ㅊ:₄: ㅋ:ㄱ: ㅋ:ㄲ: ㅋ:ㄳ: ㅋ:ㄴ: ㅋ:ㄵ: ㅋ:ㄶ: ㅋ:ㄷ: ㅋ:ㄸ: ㅋ:ㄹ: ㅋ:ㄺ: ㅋ:ㄻ: ㅋ:ㄼ: ㅋ:ㄽ: ㅋ:ㄾ: ㅋ:ㄿ: ㅋ:ㅀ: ㅋ:ㅁ: ㅋ:ㅂ: ㅋ:ㅃ: ㅋ:ㅄ: ㅋ:ㅅ: ㅋ:ㅆ: ㅋ:ㅇ: ㅋ:ㅈ: ㅋ:ㅉ: ㅋ:ㅊ: ㅋ:ㅋ: ㅋ:ㅌ: ㅋ:ㅍ: ㅋ:ㅎ: ㅋ:ㅏ: ㅋ:ㅐ: ㅋ:ㅑ: ㅋ:ㅒ: ㅋ:ㅓ: ㅋ:ㅔ: ㅋ:ㅕ: ㅋ:ㅖ: ㅋ:ㅗ: ㅋ:ㅘ: ㅋ:ㅙ: ㅋ:ㅚ: ㅋ:ㅛ: ㅋ:ㅜ: ㅋ:ㅝ: ㅋ:ㅞ: ㅋ:ㅟ: ㅋ:ㅠ: ㅋ:ㅡ: ㅋ:ㅢ: ㅋ:ㅣ: ㅌ:ㅥ: ㅌ:ㅦ: ㅌ:ㅧ: ㅌ:ㅨ: ㅌ:ㅩ: ㅌ:ㅪ: ㅌ:ㅫ: ㅌ:ㅬ: ㅌ:ㅭ: ㅌ:ㅮ: ㅌ:ㅯ: ㅌ:ㅰ: ㅌ:ㅱ: ㅌ:ㅲ: ㅌ:ㅳ: ㅌ:ㅴ: ㅌ:ㅵ: ㅌ:ㅶ: ㅌ:ㅷ: ㅌ:ㅸ: ㅌ:ㅹ: ㅌ:ㅺ: ㅌ:ㅻ: ㅌ:ㅼ: ㅌ:ㅽ: ㅌ:ㅾ: ㅌ:ㅿ: ㅌ:ㆀ: ㅌ:ㆁ: ㅌ:ㆂ: ㅌ:ㆃ: ㅌ:ㆄ: ㅌ:ㆅ: ㅌ:ㆆ: ㅌ:ㆇ: ㅌ:ㆈ: ㅌ:ㆉ: ㅌ:ㆊ: ㅌ:ㆋ: ㅌ:ㆌ: ㅌ:ㆍ: ㅌ:ㆎ: ㅍ:A: ㅍ:B: ㅍ:C: ㅍ:D: ㅍ:E: ㅍ:F: ㅍ:G: ㅍ:H: ㅍ:I: ㅍ:J: ㅍ:K: ㅍ:L: ㅍ:M: ㅍ:N: ㅍ:O: ㅍ:P: ㅍ:Q: ㅍ:R: ㅍ:S: ㅍ:T: ㅍ:U: ㅍ:V: ㅍ:W: ㅍ:X: ㅍ:Y: ㅍ:Z: ㅍ:a: ㅍ:b: ㅍ:c: ㅍ:d: ㅍ:e: ㅍ:f: ㅍ:g: ㅍ:h: ㅍ:i: ㅍ:j: ㅍ:k: ㅍ:l: ㅍ:m: ㅍ:n: ㅍ:o: ㅍ:p: ㅍ:q: ㅍ:r: ㅍ:s: ㅍ:t: ㅍ:u: ㅍ:v: ㅍ:w: ㅍ:x: ㅍ:y: ㅍ:z: ㅎ:Α: ㅎ:Β: ㅎ:Γ: ㅎ:Δ: ㅎ:Ε: ㅎ:Ζ: ㅎ:Η: ㅎ:Θ: ㅎ:Ι: ㅎ:Κ: ㅎ:Λ: ㅎ:Μ: ㅎ:Ν: ㅎ:Ξ: ㅎ:Ο: ㅎ:Π: ㅎ:Ρ: ㅎ:Σ: ㅎ:Τ: ㅎ:Υ: ㅎ:Φ: ㅎ:Χ: ㅎ:Ψ: ㅎ:Ω: ㅎ:α: ㅎ:β: ㅎ:γ: ㅎ:δ: ㅎ:ε: ㅎ:ζ: ㅎ:η: ㅎ:θ: ㅎ:ι: ㅎ:κ: ㅎ:λ: ㅎ:μ: ㅎ:ν: ㅎ:ξ: ㅎ:ο: ㅎ:π: ㅎ:ρ: ㅎ:σ: ㅎ:τ: ㅎ:υ: ㅎ:φ: ㅎ:χ: ㅎ:ψ: ㅎ:ω: nabi-1.0.0/themes/0000755000175000017500000000000012100712170010676 500000000000000nabi-1.0.0/themes/Jini/0000755000175000017500000000000012100712171011570 500000000000000nabi-1.0.0/themes/Jini/README0000644000175000017500000000006611655153252012407 00000000000000Kitae Kim http://jini.kldp.net/ nabi-1.0.0/themes/Jini/english.png0000644000175000017500000005574511655153252013704 00000000000000PNG  IHDRMOsBIT|dtEXtSoftwarewww.inkscape.org< IDATxwX\߻tD,UB9e;rcǎ\~Nq8ݎ878-w[rSⒸ%n5:ݽ?VHg+ϳ$8A̙dYFEEEŖh&C QEEE¢2ij%ɶA>O*KV f'4; Ťjb"W<;2Hjxj% D~ŏ vGʼnP= Ӣ3ߵ̙ssT*,.O,Ɗ|SPp.R#Zה6@L@hD,nePQj%wE# TaqAԬj%_1s^V(;͏ڼz8cT$/fLD6ؙHL0Yde򽛄RUX\ RXR{c_J:5!"*'0(3M{D|a {U^F^Fdh4nDF{Z4bx q xxzZtpm4VZY\)#,x \IE6:gL<>IVZ ’DI3hQ}kc&J KrVL`WaIJ^y^cѸ5hhc 4P"aN2? 1*baIJ({!6qss',2DcT8ݝ¹43UDőLӚ€L,!;ژq#2&h\6Nc|dGST_eTӋm QgGGXd ژx}PZp]SR0+ADF+2: C6)h4ͺ%JKUaq!.xa6nSkcl34 sEenVr˫IžL(,yrOVAS3#8Kш>_8ToY1ZR u\Gb g1ے1Yr 8H]:"O{*Ol2Co!",vۇLʘf]{Ӎ(-U.E"84xƨˌPn2pww'flN(UZ `.__9+ z*g0'YDXSW^<T²|ݥ_W%aN2;?V\1WhwTRZT̐GIX=UXTD0̐GIX ?"4R&%^6両j%<)T@d$nd&2ۡTgo[TvHEb"a2\*,*CcUX<*-Qqyf&ŸQD)mb,60EGDTRUX8VȎ *++؟5Tlqz Ed"˲ډ4###ݛiokB?2Q_u\$s`ϧ"KSv6GN(z,yrej͍63j/c-0tFTu`-|830"[!PCfQz$o܏k$:B=3ta`3aQ侤H,u5΅z@TX'!#GKiiB$>xw;\3Y F ٘gUƣc rBC3R޶ Z$@I۠/ÛjQ=AbC=glsY\oOײ\dfBu|AA~-rNT  l9ScgFGTXiSvHe *OV9($A"KSj9TDHXepa K֡}FﷃU΋2 g\z,pMRT_] E[ܨ!Ʀr!WߚaS]uF8?33C؀SUԞ:a=t 'z,m= } XY)*,mR+AH0 63wҹZIoaSajY);Z`הi93l;bcpY2F?bʒ$of~zn\s^h&,%E/mgΆzfuzyhWZwpKl_9.vTu1c5|Gު_b|iIP=E+Qn$K߿X>;;Q3Y:+U+yۡ (%7qw0,k'H+ZthuR7@ؽQ|l.,J%&$Y7nĤ4?_}u;\XhkМÁ{0]Ȗ4x>-ޙQͅ.J 4\c !^{5fzq aaqSz^SPh4Rw܃`,-<X|n\x,..,cyS?\ k4~c#9wwqZIpcJ\]X s:%I綷,qww'fQ u;4E0KXNT,wua)9b_Ų~ۜzg$Az,p++˩4fܼ֜^`rg!aQ<K}kLo7]1?b snw6Ԕaevuߠ`fI7^ۢ̐kaC+pMjRXpi扸):&<[!.O%AB4DHĭw|od`J5 ԷZ)X݄ o\466P}Ј8εXΊ՗Y|lOXl|#\Z r^4NI).;oWW "-%44Mf${ijjږ ar+,.P}(-7F͊kmq 9_?/n-FM9Ǣ̽Mwɟ3w!6yFŚPIdf=ČPrV `7Gh+ lnm+җl\^{r9fx,L;b%v M~2~ so}"B[s54j[ 84Btrb,zPE:(U+Y>^RŮ]Xj_ #&̙;ooor۝mީ S GŮcErG טh.&3̴E#84A8n`0(fdRW:"wnx$t6>*,p`&&Dhg2+򌍹۾ܖƓlye'Gq8RK=.+xJLo9^Xn{xzMz [}Ԇ3BR=mQ %^ZDNPיM3ODtL,mѪ{߶EnjV!a QfeP6'i1hnN"-^#I拴n>YDD+^WCNr)'#2OOOnVd걌CVo%K3O굗0ͺX]ۻF534qL"C"LWjHH Ls۝إ|)L7 Ta8DXJV6iKl\<^qUlkO"aV(&U+Y޸F.[zٖ%7t'ac3%c+ ԓNC[8q`&{xxbmf[Cuu'hin77'z^~1{z;s7C:hgT!Fev|+g?f)ĢPq֖ZZii2`7n6}^c]9|6]R4 q.Dir5dX%,yrgV$N/,’b4smm 'hii/m|֢2ʧhKœdUX(hS(snٱRM4dyyxx456DKK-M &{ ³Os& j-˔aܜm1mN$-MtuFgG-JgG'[L$*I\{ κ/`x7,U+BGLT쏭Eg-H3ۇDgQ@;dIAҀqB#IYbÅGq33C)n;b&Er--T/V\RKIAN 7ɠLU?&>ww`r"',N ' 0dd Nܬ[@~nvFZ1dUXm:wMH6h {Œ0CBpp83B `֬g~ߡDh$|Y.[$%IdQ8` ͺy$)-Λl3 xzM#8$0 #88Phbbڍ;~uȖ{c] ,QDywGrɪmQ>M=*,+W|I[ֲؗhS*[m`yJNJSEqt0gGZNI]iX˭߃u#x$Iw_^8hX|Ъ 8v(7+S?ىPZK\L.:34Vo, L2gR\c!5}q߼.+)`Eb'0V <ꓜ:Y.*&Eki\{ÝV#|.njΝOV*,N>ƚ;oq<_q s/nEbM%^LZLc>l-Ic} u)cFfhNVrly2)F˔{yljX49KYu_ m ##قpMQ"tFc2e.Ӿs.M7m|/ki8+۞EQ M-t5380`NJS HrXCB[mrݟñ%6D528\X`r2C(^ ,X&]3Z!&S"($\t*,̤dݷ Ł!1$%_?nnn\sf $ˋxWm`Ĩ$Yr ٠d4+~1.$߷_b6j|%j%/Xl,,-Zsҫlrn=}Mw.fx,zT c9~XyƝ.f_\!t#l}ww'}};t:ز`9̌͜3lIhX$uB͔h$ rPnDj㈊'"2(4jfh`3aɫZRZHI(|aWFikm>b5izoã&""t* ?p=]"Veuw:APgB YI^`,<0L77 in8IsIuUPa $b.FqaۡB|HKőlShkmZgv(:U+ZlUcD(?qBs/:L!29ZtI¬AhEh\M ","0-aᑄEh5kA6VI9;l媰L.|h9.,,np,p^70"Djc "~f"3g:4 3%4U+b)';#IR$'eYnl{M%^KJ]f!eK f{OX$I1dޕe7Iso w}{(?ށqCBGyqsSVvhZߎ7]x:a`tpwi I6I?~l8zFc2˲<9iax,TW%h(2#z~N?i~?>>懏/#1qmqF4 ?0z^M7Ļ˕W^0Fw׀;I&˲q$)) IDATyI>We מ([#,,M 驸6bQ xIHXAL" `:Ӄ1#.qr-?ύpGa3sv5]ozìIT !˲ $I0N~XUsARRwר`א$IcLao68CXȽe@C)bg&*tFrJ77m,QhbE\\*ӟD?[? ~hhkO>kݖ'}QQT!c*$ޒeYwBI|VKCCCxYz 122Lnn?vFWi^է_Ht,'!dZ#7`Zrog Et,QqhHHٶ-S9Ѡ֭[?_|˖- ۷ogͶIQ%Y%I*;}z [|m^fϞ=݋Q$sb/a9,Y^[V\/c'{>#6n1$'/ $n.``_ӧO'dѢE̙3O([n{ehhF 篵t b?i<߹첯"IWttwwqB0׶w^1c"ޒeX%,Y{mP/:ow}:777HNN&))$/^4Çٹs'P__?@5fLJ/\u5H&dYf֬YsFX222y뭷عs'&*={w%,cL)կnsT0^{-̾oc#[nU~Qw^ʇD`SGww->| r-n:_E.ZgsT 6mb.u]Ug?A  lNzxx7t ~^Ovv6}}}Z o dddpqBCCh$?Aff&6)[X cKXn߀CXd4NÜ4}}}lܸu]rr2%%ƬoSSwq~Y2S#͛]9~tqJKKIMM%66Vq` [@<<<ޝ#wu!$ pfK===`˖- ]Emm-~)~;篼'SeAVUWj4|~[xx(娯'''xRRR@ ́D|||򢮮h0^eMs.$'Dp踩hHeb(++cǎq1)--=o HII'P,sssc޼y 7@HH?|v|45]UO#飸ÇGzzɬةS줮,aQVbԋ!w˲$^NPq_|%IRիW72}'~>sv8o{gGx{+3 ;;a-[Gt: ֯_O?TVVRYYI[ 2ǎNl~flZo˲B{TޒW/jdxF(bJTƝwi(ئO=rwr|PSPP@CCK.%,,&˲eˈ36r`,^lyFhN8 rsPSSCcѡoؽ;7|?}}VCw%I&˲3iPE̞0y}vǀ0'a[jv-<Ѓ+=z('--ZNǡCk1rc餤_Fңg}<7|;XsIv]2$%%a<<୷!;;Ϥ=qK U+mYx'6]eٳiix>sbb":׿5|b}{Ы޾Nvv6,YDB{{;{!22K*62ojjW_]cIONNY[UC?!44Dk⭷7ߡBⳲ,oOSX~K"Q/۾#WU&R.Ҡnnn}ٸR?*v,,4 K.e4a233g_(088HNN===OCC6mdӦK5;|:eJ,˰|xNq!Ѹqjww{T&Ǐs-PZZJxx8WWsnURR#<»kuu#2Qappq3SR\\LII +W$&F?mmmjINNF$ deeq =""4VXLP Sj9unmmzN2MII'`p3Y9v'N %%E` //*V^MDX_j=JRR ?r# 2}z AAE7a 6aixjRˏ9UޞnjN'4"ˆ -G̙Oo!))UVVR\\Lbb"W]uĉpB^ƍ{˛pKMMM555um:522±c崶A ɲtv̟̿eY+&\u`8?fw{'7tݙM__?y2?o>߸?4b0inCgO{\Yin;iyTUm?-(6lyK.hX} oEjjj8tg SPP ˖-SQ~dajkk'-X09qqƂ<ѣihhRॗ!cѱ CXuTUPWs! zCs/iӦc+6|Ǵ1HKK#2RlLkǖQ]]͢E[&R__OFFX_QTTDyyO###tuuq瞻7~KС<==EgJi1!O gZ41AݾTTT`6 rXnV $$$qFkٷo###\veg͟?X. yʂ'6X9|8!EQ`7OE=/YM6p:aq5Z1ON% qrS1b ߸AqX)--墋.ꫯ`0ɓ'Yr%ZƣW"ԯyxx,YzOQ[[KAA>/y)55u9R-/z:˽|_i*,Vi9o2*$p ~nVPPP@\\W^ypYEE̟?_MQXXHww7K,1zrQ/*// 2 `**]0/exx]2Rrm۫ر[׀;eWڮ’W/j6@(j248HݩJjήJ\ 6=0bh4~!Nݕ;ߏDNNaaa\~SZZZ$22R BT^^.)n:222j|ߘ^GK2zz,PGK0nr*ӏ1 xe $i-;K_g*WG)//رc$&&2wyǏSPP@JJ PRRܹsLXt NǏlȲe4 c>/~ /D˲<[B.,Zi/Vp]8_<$IZQP.^k֬GFTyY*'99٬3^y4xxXetVQ’K7PGy^M$I0 Ukl8f0v.MMM… XH~Xz5bCF{ 4%--$qc)~&OϘȺu >: yg8rDq8wɲ|ؒ-QM?>cyrZ$I)"ڻqx'$nFNN ɡUVUR__ϑ#GHLL744w^Z-˗/W|2wR|FbѢd/w;"# bEv?R;3xe"΄$Is1Vހ2kV<$-0Vc.YvpWz06/))ѣ|rk{zz%\"}ƍ3D"!!3XnY  Jss [kǡCe.'X9xzzk_YG$'' 2bi >@ee%Ǐ'%%) sajjjX~WUWWG~~b|ۋUҘ5xZe&p޳g?fW1聿e[G0aQC@ǧ_❑͍?p7|p ʘ={6]t϶gDGG+VѣdggpB,Xx?{'&Ʊreڙ]X83ϼ`iWcVZ*,N$I~❑ƿopw7/{IJJJ9sbko\|}}Yp$fCPPVRܒ._a͚tN_k ++Sy&t')Te$9 i~!!^>'s !%%֔SXXH__iiiBz(b =sROrǀsg|3BNN3lCB8>,xQe$cS%^>yyypB2*--%--ͬ8h.\(,F,s XdP?c)~J?kE33,gjI|xH)]#Ii&s}\9Vrss dfel HLc,3{lٳIX|ݲ,S^^Nqq1##ʉǔ9/(5 J網oEFF/e%;8I<_OS|}Ŷ = fQƖ/[̬6pi^OFF/fѢE&ѡ\ 5}z-#<ܸ&#Yy42 GK7I܁[{o~~&''FCzzPOs%33777KG dYHЪxhjrJ'gg[ȑ#TTT(W$.L"-WerjϿ޽f}M9$K.vVTa׀飳x7&0м8dggHOOw.֔ziii1m>',\ssscŊlذF Ogݺe22-<|8z^8s{N"b$I8Va暫 hc 77,Yb,`f×n3Z>c N__B2.LB`09RBss֧^xݻ ?jɲӒIn/?Fu0ttt&Ԓq<,-c`8??VkQ-L{{;'NP\ijj;Cq}XX0-c V99yAV\ܹsͪiiookz/Eɣ˓UHLB$aQ嗷'_?F۲,hŮ$}l!!߾0N״ֲc;&dˌ3[a200ٿ?}}}g`ݺu]v|dee7ߟ}kٷo;w vuu$ܭ+6odY$fUlQׁȲlQ ƕPFHQo_rku:>~+jjjعsݝ+d233Rz5}t .\xccL[p!W_}Ug[Z &'_/SfΌ*W&|ʲ%"I2=`ӦMx׿:3J/!!HD " Ctb̃BI5tziQ].AD Jmġ@RP  !39!Mg= 9{sZyg{_rRصk'O nDFF2|p*++ٶmee(//m۶98Yݜ-**"''\,Npp+fΌeĈa?~\K ljsrMϹ)z0ZΨQׯ/11W.UU.^}u٦A !\|Khժ;wo߾ql߾l^^%%Od œ9Biy=` ѻnO>7^B0KJՉ7j󶞐R{Um{gk hN׮ҥR)++#%% C=.,\8}pJJJ-Jr)▓a+{ 0SʦW_K="^z1p@[WyvGÉ':9Tvp\?LbFxxxRjm&EN੧FG~.VviӇ|ǖ?ϞMV'h(ag{vyL2Js̘9?  ]tPx<2uglxxˎ].xxo?fVL:K -팥y5lK)m8(aguu]/;uifϞtYů=bSN4;!Rrssxwhݺ5dggS]m.gCvsxdffgᣏq7/'`u⍌zFd^k[n/m9/V>TΜܛ}Lr LѪUK}1~L<*?c%33~ %%rMsrrȰsza rrIMM5%*AADFNH4+*a7>}2ݻZ)%|9-#*$)p%*P+@8\v]TePfOdI׹DDD4qtUUedddc0{3cǯԺHXX(sNcAWĐZ#.n [L݄?JX!~Wu]w" i'phEPPzrp:+9s&{X`wuyFVV̩SMG1Ù6m2ZD4SlP l߾w6K(^R:QQ%, Yt0DDDPN?=zsrXDFF^q㡪Izz:.̘͐1uN'KijcoS=nwKہ,8xy5|af8Ra %, DMdj6>'MTQrf?~4 y?\+94*233)/78p8=:S'l|__]?U̘1'xÁZ~~ê7aժM\=irQn4 Bɼҽ{wy_=qn%{eBйsgRJ\jrss-ysOoϟMn\ر^:t0sN#,L炂B~ƒRV\c7t?O!JX!D@]>!Æ ;ogtcG.20@v0gT~ohFBB{ .M?_f?턃%RJ߉ (ai`u] !&&p#vy{Y9z{@6m oV]OG3qi+>'O{)^m;v(0QJydy40BYq uҺukbbb {^Cx%޽K=nS_~͛Nx5J38N:q:,R:²e+Z{^R+U\JX!Dkpq;Ξ(^{m9۶@v 99tO@DDgϟɀ}!L-%%aut:_3W)LVC U@Ѹ`bbb ?=v 6vk׾Ǻu@L7PPVV.˽x}M5**!6ײeKƌ%0whzLmN\JۥÆ a֬Xڴ mM8}'==Jj֭֯SZzcB UBq nAAAxocIw_=ngYe->,%94*%%%SG֤#Lw\E]@OAAA<$ Z̬ٓ9u*E^250S5{%nRRN5Zvټy GvL#L:QQ(a!_}mYȬY)**bFv83ghj*;ƆizY.]g{o|؍-V'*%,׈c/0fBCC}kFl8BCCX`1%%̝;AjYY9ĉMa.%++8aC١hX\Cj?gѴi8 c.4k气UlJ' Iee徏 κu\VnDC 5r+0hl5jm۶5Omn3*%77eVrh@7au\z(aBgԙ|͛3rH&Q$*j=to=NYYǎ%;U/b͚uQ ,Ri繊넚$M(cĈt=СvEh<{6z |8F7a2gG.Pr!ޱcGw_?F|V8JHHH*wݶV)~VMYYթN`1LJX3`f͚EN ۧOOƎiQN-ɽ"Z={wap݄)dŵG uH*`X?N.7wƄ ~?4*e߾Xb5Ŗ\RZ.jQ\?(aBs8 6H{FDtbʔ A]UUMRRrQQQ:୷ֲk?L?noPgl:GqG}nݺ޳]L:biRJi.c,[Vz?/*F%E2df@MhhӦE9PtVnHugLOFK冭~QHB,hb{ lw⦛5%&%$.n͹kr`2ajԿ]AR.B88qܹMӸ^+N<{. 600N2S4j4"5@㯾 )%={ZXԩ-Y[U SG K#CJ )ͧS_iի1ey<6o[0e0}nuq"\[#.>+޾4Mw^W:kBgbڪ݄rf񢄥"X#.>+vލi[;7; P4>x6lk4SJՉƏFrb4!xC4S!.nII'Vt&˙FS!tG5K{E4=`)%k7PUe J礔:QѴPRB;}i ’ϲe+9r䘝U&L PdRC(*iwnDzs׬Y .G7aZeMUyB =gϞd}<(89",O(2 Q%RE#'"(2 QNN+EY㇢q%#JDFEcYZ[8tZIR8Q0~0X6>#df'#kcI=mBoEX'R={~5$idd#s82ǻ#kiل5>G1o|aBp0列g/#ql FT*5GyD42ƌ;ꁤFگԦKR%22r`Mo0FTjfA>gF35-?Yi",ÌV2 GR'݂1R7괒7('  N+!eӎJfĨEC1M8<=!WdY40(1 ¢JIx2}`GaĨtF>A4#$$(K2[?KI?:4XBx!f(20rT:j̍X-,_@2ф 5-8u$1bTڰOh3bT #Y'0*=Դ?Ffԑ'&@63(QT;E*28%4,ܽMIps66sH=!WDX&鴒ZoI*,zܩJxn/$$^4O?q0`<Ͽ(OG 5@zlKڌ>S'C XX$G]u:m(?:Џ(a a>I9& zT@)'Áqhp8잖*aE")e ncTZ& I)#$$>Xi",Ä nbf-8cؑoC8'8V dk lR9#s+rKԸcz;n_. U徱DaXɐǓxXaQ˚!!'āUEA1c'R K)2 SXم&ǵ5(<FZfREX"#)96 ihۢ_,,l x!OE * 4(¢0=Pea.% Þqpt<71 0܉&5-Cd",Ce+P[(0DǢ(dxAZcYijQ /j#!vHG(ɁτEISAr>9!bHJIYF )PN+im(Ir (q(%2]VeQDX?>BKSQ8Pe#*, iSvHA',iC!ad-*Aq(@Bpiб}-P?L& _5Օ4a2pQDGǠMQF BdOȥh2?c>Qolٲ}{iomf\.b"PNfx/e1Q믹@ o|뱜i]]]477LEE9Jllb6c1md $2ClX?"4ォ,t%4>dFYIOO _#,SZ0Ԅ 99y-\g[r4ِTDFőBbb2Y㘿`999Aq\ʊØLFe{ $!I*BBB '::xƏȒN'3,#Z̞?V⧗c$oZ+}GjנbXx٧ٸ[f"Dlذ9UFLbR #R̙3n: >ܷL&^ oPAT0/=:ن.Ș;?aWǁ"yBa0VX ך(6jWPp8xztJubh "DFdT II)$$;y s'++ iL&z~vmC$bC\L&LqײwE.Fo! ~[a9un$!)y v;z}m+M8c?12uTsO&7d9H1mh^|>KfOO#a',y:y:wqᠩ,f() &R?B"fNdd)x2ܫCBBHMM6οW\HmGD%0(ʻdhHe pU+yZETDhcw83B48iAX\0x<-R%xl7y?ԺEe0Pqŗ5^ e;4D'JoeV2cZKpQWW_;*!D58t貆Ldd$s8|D?UaJi Nav^ijdlCNl K4ZpJp*>222Ț HJeamSaBˆ'1%{x.\LNn.!!n`"xR mKN:Zi.z*++9.c'FcVs.ȈE@NczbנM.+$<[NdT4iT,`OapxPU~8N*++q\DGG3bNZZZhhhPC]]- X,f,fȨS#.i!,4p *NŁ@GNM2O_攩3Hjjl*dFXVwa4%p[);TnFH!ahBQTHȟnXeAƅap݉Tӎ FM&F}HJ Cܨ~ޱXT!DHBBc3g|rss9p`?!*K)ۻkr1]t%o}no0=>kB99X6@|9Eu#pf&Ob̞3^1Ӧλrۭ!jQ2hmmꯗt(5C{,\pp8r0X7& ͅ*$xOHbfϙǤI9NRAn^K/Kxq2J*s _a'xlFw?7DiGwM. $&{s sg> aᒥ[<,RB?::7|oO\& KFTGD)̙3qt8_>}ON&txRRinY>EX~ 贒i_K9 yذ~ rUml;ˑLșƽ@^^OF,'K㍰(&{Zt9FM77z^hr: EIͤSO?|SO?1Fd%;<Oo 0"CU9&33G{;xW9tp/6s Q\ڻdfOe_A _( PKv<$::zH fhx0Pa񈡪cǴȲ̆ (H5juNlC]#~;oJlIW{]I&4,Hc%*: r`!ƍ;.oDV d?Q~e$ p"8{y 0\N409/n -`ӦM+4$"q &Z:rR];>xBBI1l.Rt\ %W,XI&L<{:~u+ P!Q!l5Ȳp[,V;> Ov-Ic=n$I0_}e,LZfa3Pa<_1WR~#2!QZ}Z#wyN) _EbT*F(\ c@¢7mIdm Kee%֮$2ӜNģ=ZeqeN5WO"80,DWq8LɛǸqdo@lW^~! Y&,챔RU^hUs U#/OGL瑭$Qyv=Vy&KcJ)E;rb"<)FgM"9999Sp8<9m|3^ )^K8%Hl6tvYX$x{z˯c`g2ƌ#$D8Y YV6N9/4n:ab+kJF!c8劰fL]Bժ#Nk~\B2QQQ?HDHq(mM455"1/E-O Bs{~l01Q,>ƍl^+ٷAD<P[;sTT-? pcء<JEA_K"3C >aj+55O9ER2Bl ˑIt"kMXrZx"44^/=ԋ\V|ߤ?*,m-M]>zJsbۑ (@ %) TX Cq8BZ~466"bEO9z\Xi;%gkOMM)7ɛ劰'ǒQjh oغe1Qb#l8Q1 OT%8=hS$ukk)?\F#v\OEo;`uQ^:1w2q~;8Jp #dŒ$QSu Bk;:-q~; {,@ U97!}lxDG.VGhb-ʜE=,A4sheR^EfQGZ-9*p>(qA'u24~xFUT.D(?0Uhig6 .!Dm+ :",6=3[h@SO>g|GeE[7~Kx`<3$5('CC \uOiذk 8v~ QabIqV&he봒hDI V(Ȅe'7qnErq/na*Ýwg *ګ[ /lUTt4CQnsMQ_Gx eq~BDD+5CC_ K= tL\D IDATnn8$l [7_FbjxCݍ"qXn~n`('CC ;qH0z,aaacC&{gyʏ/qO~У"2U4 V˲/\IJLX4 *i:%X6 \ Y lq .i9<܋W_} S[5=W%lV/hpHQxMƍ 6\vlYZ7• M7,rPn$I'h$*"}\yٹOu =GEm2^muZiV v ++˯.w Qfc姯sEgP]Q+oFnӟ(S’Jb@TII4jm7>ci6@Oba3AZ_ktVݏ؋4Q%0&{p3ӧuje…?K._Ws+{g.ycY6 <t$nrsW{؀ۓPeZ`0n OlȲLSS;魢6F#.#6 ':& FIrr2#2^z)|I駹;n\tKv,dK4hq{2ɲԹ ˓"I)))0u6$I7ޠ;3.eXVJ_>_$N6 _ Id>e9 L6ٷ' |'D0Vpӟ$䮟_N:QAx6~/>OXwS vkܞeYn,C!,@%[000~S5h4̛7s9e˖qꩧɺ)_dN,2]]YE.$)5`@sgGJ%''5k OV`G~CXT_PӍ:@;:5kZ>s93 ˗/s@R՜vi>˟ӗ[8nu^}u֮].6q?KX6sD\|nlܸ+Wk׮~KѰzj-Z4 ^yn6VkWIߏt# '::gy>I|"##lڴzuaDޗe*X%,\&̯~6(ʕ+Yr%| mmm^]cqw okkc۶mlݺ۷}>eArh5<\pEHR dY.\xTX[}[L&I}?*pQrY!Znn֭[z3uuGm61/"ׯrŸE@m7r$ QO GG? _f6o̤IuFaɒ%,Yʕ+Y~=1W$Iɲݻ  86k}6(FVZʕ+YjUō+V[o ^z%^{5zvB`G-z?F IAA]]]̟?r!&/RI8p 6:З`>>KX~ #vĨtVbNcXbOoK˲իy5 )2bSͧ,SRT_^!j\s!!S%8@II :L].v"??ϭ_\\26mԣ;',RA 5h4)UFO4 p-x ^x^z"<<'|zʲ^2[u6FRq=wqM7x34 l߾1cpRnX(((`ӦMBH{;D%\BXX555l޼Yh #/I-,^UȲzC飳dB)+I/EEE]=U*'Nd̙̚5+doWai@m'Y*cJh:ö6nJtt4˖-6jjjضmf_ff3QQQ,]3@42`$I?neYh:",ÇOe~asuױdfϞc-S\֯p{(|rmpw$l6SPPfc޼y}98q\,Y1cƐJYYeee47{_Wk۷QF_ć~JCOH{$I,=_Eo:Ԋ`L9^̙##$tRn.BqyDP| (7t=wukN'EEE2k,Fn}}=֭cٌ=pogQZZJYYxVPDc5kyo5cdcI^e3SAs=, [o%f\6O5?O{+C8p{eʔ)L>ϵ-[E]gx&OLkk+6[/LRa2uQR9]VY4.= Qb~v 7J@_-,B9Cew}K.ھQsss~V/l½At#KyKZo0(,,<Ԋzf͚Evv~֭[YfM(Y հcGQ“="##KKhll⣏>?@ߧ=wAg@^nY7{!~;F|A>ǦSN9YfqUWqiy}۷sW_ /<~D)!---Ì3< miiaڵ5YfyowqwU?6;RR^SYY9^拲,OSXݥ#i@i4\eÇcZ$CxlYgɣNmۆJb֬Yl66l؀dbɒ%XYYUUUX,o.TM\\ wYw^>/WRYYI /Ul)ۼ𦸸x?x}L/^O<ΨQ'\lfX,fΜ)bϞ=3o<22innFףjE܍KJJضmz̜9sHL%SYYMee?479@Ro tE,آ04ٿ?s|e<ddvz=̜9-YX~=t:0fBj5yyym6 j4 7p5yy:'Iq#zz|.#r[ ^4T+rr7TS]QJuy)U** [)xN7g},fb1{lטf1?It.={IH5!!>3<>^תT*V GyeNÇ+9*Й}4 9_lV+5Ra*nsV:-K>=ɓsyg/8YetxTWRoF{/09݂샖#&痓3,2øq 0dǎz\vP!Z[[),,dĈuYk`ժU^TUUPUUs}rv;DSSg :U^o¢7ȲN+1"%ij;*LjHuE)m-ާۏFƌ /<ԩy `@דy(7n$==K/TŽ;p:̟?_h_|{a;.g7R\O= KU>A!ᠮ[<ʰ|껠k/gY JSS$$$pYg 5_F9#$,SRR`@ӑ$|anժUvs'ȅRRRtTԉY,Vv܃d aBɾ fʲ+UQ[]8\Pot9_Μ9v  eɒ%B`ٺu+,\D 555޽ &py%|TUݣSrߏŕe(*+Xfe}FփFXkq8J.hom9i+4.n.Ʈ~7>JRR"= -Atdb۶m8f͚%4())a̙,X@YҥK[[[ꫯlXt:q:)VXX\}G7]]& 2Ed2giէ\NjЦ=Yi9iybi~<"( >/38bZ}̜9Sx+RUUŖ-[?~<]vP0fQTTbaBseYf^w~glFuuu[SOdhwBb y)kko*>4",n6bq4Q^JMalV N4 JTTO?8s^{1m OΨQbilذX." ***6mǖ  9r$s#g׮]:th'N{{;=ϴ [nફ~tKio`˖턆z ^|JJ }#gq_P s˖c:CUGKvow} (%C-(jFx/(c9t%%%L8 /PŎ;8|0C=@OFoNtt4~Pfƶmۨ`GvEzNzdTH6FvS[}#$JKϴ=wߝGwhWd~~ hm [uZX-j*˨*?>ڪrѺa,C:>@AQTw߽\Sg1e˖ OyhlldÆ 5J8 Bt!NqԐV/t>uKw5uO^ʮ]TWͷn-^_Wf#"X `w]>qi3#`Du[~~;""{vwR3L̜9c{c)..3f0o}:#G{رc˄fLO8p99={k|W;}zB]%˲"Jf@Y}Y3|`X:}zo2h$I[P.N=u*˗?رC~IIISONw"ƍZ,X8!\ݽNx:6eGq理 ᄄ8/͈IGSXXDssP]}}>w{\% ,o%P.p}zlT< IdƗ ڻrrrXY&NVl߾Xt:WU۷o`00|X wfܸqZ֭[VeΜ9bYk*>J%1mZ.yyLLX56ס6ࡁ$@p96xEr? I&Δ رټsrTn="<]x4F7ݳzBBB?p+>e„ dgNuttbfk׮>S=4l֬S9GÇ+()9p|f { w94 K='G@s? I8VXŧ w---t:aOlB[[ ,J7)))yB[@CX`PbÇٵkǣݴT-EL#lYP!QinnIak{`p,؟c ,v؝q fG0!IH/`aLL >$g+Aq8ڵ:M&#EQQeee̞= l6tR6mDNNyyyc?P s1iN{ZNW^xxp0N|DR=_ *#$) wcBDDDOpy Ҁ NgN2e 999uGn ڏ5kE<ވ…3z$&k7]kk++VĶmB@1n/e{.$Ay H;ʴ挚P3MI04Cf?MK +MRK˲|5SW83]fʩ)fD@A r X`Z >k?{K7s}597$G333(5(M+wҥKXt)+;SRRB||<;wfذah\&јRRR0`&8ݻw#`ԨQn[JɩSHIIjuv#FgIM=+\/4\Q4nC  _l63bU2&0od2pHS)**QSUe~TNI)w n !o{Ot]S\]] ʒzKAI '$$͛7vnϟvuueܸ*:9 p|s=}<ߚW B vJf4`HJJaÆѣf97OvRuS^^Naaמsdr1!>HUYƍ`ǎ9␿]Op[J&{ѣGb96%%lÉsJ'OA*++ԕ9}47oi(((,a9 b[媨D|}}Uʑ#^st |xNJbK 4|ͬ\ChZPv;w$==sc4.3ffLN:M7ݤKjjjuU,bKEȑx;ZmS6]pVWW}tH@Jzp{CS"g`>`f{Pqwɱc?|w8q"&LPp8NXXݻk$''E^뮻46֭[U%g),,tbР}3f:tPϞ%5׳ģ^έ7K|<#OcEAA K:t(C Q yyylݺL, GfРAjZJKKCZZ۵v.ݎbmEr2lXEo^K(J) n/B^ەe˖pl6IUkqaǎ8qBճ2{i&1\OqYvܩZPɔ)S믷iDr!,-'Lԩ8v$ESRr[iħSRJ]!,-D}a=88￟\jkϫW} Z! AfsJ(/cǎݛnFmۦ:9[\\LEI䩧'00< |W_}6X,_F򶅐RZ:|fͯ9מO0Bns>腝H^=yɹxz(--gʔYӧȭnAAXVNbfV}+֐)/ERJu _90By>o~sѩKPu,Y2ozd2ѫW/Z!J:wLee%թգG?G@nnLM=!&vK>3IFKi 5cK #;wfUv҅%OͿP% ξ؛{Gfs\ѱcԽxzz2{̟>>>X,ck{}#&f 'OvVb7A .=zh 7[EEYYY\i)+WCEbܣ9EMM5ddd?BC]OHT+*|z-7YY޽5K_#*<)彆رBp σ9S,^2|J:u"$$Վkkk1Us=Y1ؾV\Gev.]y}1zYCJ*؆b¤/2 ai%>9sq>>,\4GSӟV8='$$EV+K ٧Us-榛.WK/ƩS#`ƌ{Yp>;vp7 m;xnhDr@1B<攐Lq^(=Haa/'ބ68nS[kXyG2&wNW}kSAn෿}AnGJKXz ك24JUJԏL@y5y /r!ҘG;jlV7qd21},GNg_zS:vO<}Md2a9v섣ԤnF0wZ%\b4"BQ9eL8U<ӧO뺰lN{Y[q"M7<{s?q9{tqnfvJSرYt*`XHHH[,w) IZVR]ɯA0BtN׺ZשS'f͚h<ƛl5~~~BZZ,[$ܢRJΜugR, !~krF.吞`}rB<ݺN:գ_ɦM7CT}j2lZm/z+ߢ@sV6rB|LwC̊=Gزe11kuOt'Gӵjp8dffOZ)\WWLJ~—_nݲG۠!,W!u>T;1^ۅ'ǡC_5ut=0mSR^^ARRphޥggsz#pv=j+;n?|n :_ӉKsT/[[5Ufi/ZfB So<\a݀pwk9sۑ~,^<2{eJK/F6L̘q/?>WuլVJJΑ|܆ӧϰbśdff(n<!twח3ffG}wβeK/:O---6%_~DŽeZ ZCX~!ꏡnuLJ3frsϽLEE%O? W5늼yDC.%//58~"bkfAb/H}V`L>]\g23g}äiVjj,2>rM>VsZ9UZ [Y~ n?ݺus{ݦq422]JQQ1V=ߎb¤aUeVMbڴiNM.eʔ;3fd *]EؤPYyua>]nC1a:'׍u"wkM&'OOף7Ϝ93vR\\b?v,p8tR:̚5(/< EJ!JwL&&M"445CBzwyummǏ.ij~}vܭ'<ޠɱ)mCXrˁvd2q]wѿ Ƃ/K)+MOϔRJ]vqɬZ%%紆ځ4LT;36P…%))buݐK-6}_oKmpbKA;8pk2lX\)Ĭ!?_9w=xx0aj]A \.1nֱc7kƂݮ=GjZOؼy(&L'i aiCH)W֋Z 4޵kRJvkS2y3gtUտ ,3L?1(Ni.~aaaM1WU$r]IDAT~ؙnO?O?c”b@!,m)p0tPX. })gΜeŊ5dd說 mCX(Rʏ_ˊ{p8|n0@[O0=)@!,m)B+pp7v~~11k8~GńI!,m)V!TG5Kp0|xcG̋sRJf_.xFJ CXRBBqss!rKO~VZKRR6L vr.]Uqqq8FͮXvwDuu[QLynQyB@එpذa <s}(&Lz /C(&.7&L0"4k#Z~ƦU2eHK%S(ַbcBCڌˤ0%C{K;~,pJG+0-;_ B`hMCKmرJR#QL]QDbc+D1x 47z| NIENDB`nabi-1.0.0/themes/Jini/none.png0000644000175000017500000010314611655153252013177 00000000000000PNG  IHDRMOsBIT|dtEXtSoftwarewww.inkscape.org< IDATxw|[s5,ٲvBh̄@B@i@ 4ePVe2&UF Id˖%[xeGc'x=9#Kgbpqqyťq KN5,...kX\\\:װt:aqqqt\xx (F<M+-37!"_LNßqx.=װ2DD2גoЁ(\K/c@hF``ʲ~lP.=װ";V=e@z^#r驸K^BEfeD\^bmn:0;c%x nQIJO_orѸ3^5yt1lK/t-7*C q3(+ӲjR+ ҹ#tɸ"YDE5V~t|T.װXdP5eV伝emrbۚ-yp\osjug,.J@[㢄/^u\zaչq ЪA>0VDd֞n&0\҃B +tD+j8tyz?ҏ˃p,,>xEݼb˘HIl6xkXz4P$*϶A4| E8aid ƈ%#ϰ]za!TXSWX="ѽi>Pm憎]VS囄u)װ*P p{鳛_7*@jH.ؗh `ť \3ȌtKqpʀƐ *_V.(-iWװkX9Vh$[[^ֳ LF흖pfhi3K!q?NQ +T^mGWR;[ Fu' Z\RSa~dSxKQQǓ `@x bK!p Kd? + hZ^r) װtS*]>HEfK 6=sD\KrKz ǫ"5˗/u/NLDYۥyڿmɱۀ+jLJ?y5GTbImer$Pny]nI{6Sܴ(Ay޻E[y/GE$/7`z Ms\\= hoK.]Zwÿ\`ߤ꧖ 3Kɦy}VhxFAd¤vKىDND%/alR@5L4 ޽dؖ!Гf^[w K^\=P@Nw"A6G%?ʈe߯7~װ5,ݓ^aFeXA.+u-]~ "ƏckcqɋkX' cwUX> _^=Ʋ/6m|yӤ&K^ֻa yǿ[?,O y;az',]w4hb>@`W+' <p/zua+h4 @}u)]r>Srm| y^jQ])i+JP IN&׬O/;m{ڎNgpYj;X0%CWV7;vtkT\ a}Xa3Z M&v/ZW#0}:M)Q]2Jb[{R -I~ "ŹoA8˙nʤ U> 6 Y/%L3ȅ*4~4,:J8*Z*6JRpEGJhn`no3c]WuTVvwes6&GDoڳ)ε:ZfO""aO(vB K%['݄ſ%wrrqoX鳜/ɟpn\O %WAz^4,af%N,#w u[|uTc5_'p2KJJ3w<״ VѯȞ%>V(K/fh2y,Y1jleTch}v {NjEhHLEv[kѿÄ_ tde?La3ϔf׬o1-¸a}+?IwB0Cg/Cd%?&qyT(HL-bFQ-|HrTAu#v &$t^o+RmG +& v4Ra^rgYλrַa7f!NV+BMY1rLtL$y,(KY,UZGYW4Ql" 8i{rEumaύh⍕ zs"yڎcn0^eR8ͥ^SS!_bb:U!BϺez5GTĊ_r^ȋ#[I4-GA%պ$&YZcao쐧,Ln0dO?~"nqhr #BS#P61Iqτ<~GK/[Qd/>cF4*mI-? [%Kˬ'R>Rl'eb&^hbAD7䪕dӞ*NȆ0,b$)ө# 'N oJh}l|GB+}3k# c1,( &&٢w5xVig&Y$*7f]z J^6"waqQ;iҁ ׬&V  Z\yUmCQcD4Wus5lWے2,ŹfpTl-D4X/hnrʙ fȋ\-(ҎWX.]zvs&!jM&~K0TǼ=ۜmwi'+=x8OYWHh_DoUh5IC(G#x8[m|}0hy}rﭔLԥM\r!u\nYNTkC:z[d`lHAɬm&uNGҍ tL )D#"|k4o ¾>RrGr?rȒ~GD]A6P-J|@+/w?2*@Ag8{0u>,*:^3,dbÝZvrZr9 O  }$X ,SSE_ ӢvM jf(QeT2)S&Ņ8JFd04lo5'^GWpex%n"rxw7j;jWqvtj;D0S^n-M&8_N;hMC֩QgDo} z71xEKlqbj]D&jmlvS-E2O񵹄p6 UR#?)encM^mq.x: aĴh2z6z"uf/^@smٹAy. +$ @_ ^,Q`cwT]3TDpË ]wX}k P*[ZG"/$Zjg)y{S-Ohӈ&VL?t7ʁ-{<5/dIJKmO/]Qd< 1 rԠɇ^Lh2&zl>ܸH˶iHtlw~F_띌 @xv0~?XCRY֯Vk?h5Z?BCȮ%a 5K7Nm&LlTќLDũp| ӼM C,#A3nXDG{%>Z`k6跍>^Gb.,]^G }$}$f):{^g' \eѺg#vXQ=yJPdNoDMor<԰S֫jn \':tkd@<_᳃˗F ˄(g!̂i}"xLfnߗ(rx(dj7ЖIåW$ SU{)6֮65fzտWRMJ{t^ !KZʶj^-ڑHUkħE:`%"% WӾ Y>O$s'+& Z)I2N[丼vKG5,ZN\ZVJ9Bd6t6FG4~yDch5;BL^_V7џ`4K:b 7lBVh#ZDyZbw951,EM`A}o!Hd%{gtY@<]z]fWRoţM /ZpHe(Pjw 'I+Z-,r$>O]^:N';qe8uMG/'Dx|#5wC7UYZEo/ )œ] cq|~86_$V$olL[ɪkCBR'( IDAT-n8xpO&/(胶znRA)U c߁bo si; TU=,) 2`qD#bIcMZҭ4Q* zM@&5h<}\z]ưGT%O1aKmDz0\'$6'!-bp};  !tۢe }T$JSr/e5F㙍>zgQ`(AD(^?ea? ,h^R/,d&z̪vΞ;4hrVv^BW2,TLsF lks Edi射?Q9ge[Vx ͋&{-JQ?L!|6>Ni_԰E4qifi(hZ9aBLR& V,) e_Gՠɜ ..+l_ yƮIiX0Y,b#_a zR&l{5&[} +f~P/%Ill J婙N{8&,aoz/_foe_`E-qw\ XFU+Wom^~>gZWRt7ш$P"HZu!Nxh{4B5&8KfǢade0f~oSUp]Yp7, (E<e.9>1Y`)E8 0=ĩXyɐPU~Yu&89qZ&2FM Pa({|v^Òh?4T#8PAhqԨ(5꣧ 3Q{;n>rMтX1J5oZu,쵑17Lq l$lPi[Ź_t^'*pwL =}μ&& y`XoIsD+'T~TVdVU`ogMl兌ϥgӥ Jy1;C`*Hx!'2޴UdA팗GLaKHעa6 ݴQ/ZTUnnDo9S[b^;SenG;Mh׻r@.rhJ.An9P1YqkHX\pMW9϶r-rPODvXmwcݚl- hA II|ǡKԂ.Iƹk[dYN~y2`'? fT q2,fݰK! XF>Ȳ&{QYYm.11F U9=EroH0.\.:cidhCcW?rB? &KE0`oCl@e uݻvU1.YB[t̒⩘sRoJ.,ܤc"p* C>~SWTe?|Mv$sܥ% CeU W+ 8* |QE|6]y=PU6%c;U`̱`*w/˩M[Yԣe1rfq[H&g/vbPa-1pT}SqZa{Ϥ[7%V<:~Hs_:y}3ǍwMΘrB$K;(zЫ? ־M:]z]yی&"a u6c LKY9J^U%ۮJ@GP8/0Z+$ gPLBt8?1=iF%ٖ~xC y_G:S'ĔYuL ٛ.ݝ.mX,y&6$40) &)ٔ%).jfтFUgw\" J_Y⠝ 0*Z{gۧJ/qkv$6c,"2e@Z S p [Mťk.9S7FTV$(+^]ZR:7z,~<9R#T* r1@&6˳b G}L+?IW%8t4yܘV,4E7jd-u;\K̠FYm]>IhzdPॶG7O a*9[D2_atUrp+ҧ{af3]:>ּ$q6z>|([5 YƋK/[hlB8D?Ԉ}.UQ+&k[/ƛ.hB(kB"d/ `EIC,Y/OkFU JѹymÑi^ߤC`4'3?e<  gr@u\iEt)Ò2(ɻ6KR+|&JHlnLS ?壁qP9cc5*ɜEqfXF?:~Hs\(O?1yܘBa=D u̎U5*1cɤW&=/&U5O=΅y>wDa_yllzq>|z;ތe86v6G5,"fs2r[U_b֥q3r_ّBcN4*`]pv"{En uXddXyvu 1tc(3YJ"SvSg| &cY~S :~vqR@_O7"r+a~-mYl>R~\=ưw'-pʪƚx|+)%"n%0ڶTG~ϲ "m]L+RqRlLNjV;P ?1,yDui{]Ip[Y.ekOn9 )O ऻSJ^yj,j[?ˏNX ʎ~`oopŔW[ha**`Jd".t濐"QIZWlw_vy(☪j #-rTf{ܽW`H338?uƭ{<uM91bUuڰMF`ׯ*/Ҥ&/-џ JёlǼ7?phfEMXdWm.,}/-C= K&yQ@<h당Ai>n9g1aYÁvR?yR;DgVF?^@p *h ^q9ﻣAs&N&2ŀx8b3fjc[`3/v9XEdfI6MU/^ʥKm &9.u"nH=b1߻;w]E3 xsh.Tѻ1<8jY0@2}"^Ƹݧވq BkaFr0'EdU @m%%ip Άeùײ*s 38.RfAQOa#1|LY+#rQfM^xLI 9M.󖜘 RAfg('""_MwtgK?sڽ_Gv8N dIӏ N-F,CL犎FdR~ߠ0_tj_4DQ#%;36yTUթ\.ٰ8xIJ,T+;WvCr_Y%GJ?}17)Єr?޸ :u'p='; |kQР;043$R""cd~vT@IIeC[Pf㫹AUu].6@W-# &uF[%=Uj-"$]*x7h39 Z^S赮@l-nSy8[{NFfr_Y9&QF=]8Ɂ}HزԿJ`;Y{c5{ɍrKP&eX%-7A5t* *mw,B.=nkX}e;9Y20 yK"/\pH8r~eAKDqC+^(Px>f*dKDeZÎϻaw55x-n$úeo ĉv6*{I-g]z0ݰd3 '{5#{1^sxQNR`]ĉ6@(|@y <~t#A aBeL,|1[&xh4zU.=nX*ɯea/T_QUFfyRlx61kV [~ 6.;>ޠ_fXajTNO3Œ)NU5m8jf'"70N܎!zaohsZDJ 9]V(D)PXou~ "7bfF1նYb`v ~rdv̚wy>dr'~}ޞD2,徲?M"xi\fjɚy #ė2!O4P4Z3sٖ@i\@(h %f7`"tdّ9xn=&~^Ump'`PGnܧOo{7\b fΜ)oدbb xnJdJGES)"{"k~ɶ &?Is,Fg噂s!ˋ C_l4 {KD] HNDn`7Q0L M$9/|/ug[30ٖuA^koVB%L|#7\jjjz< o& 륪cyW]}n6@dd$a/T {sVm2ŭ8bZTCB7!&w';& }^yޜ~Cr{s7 ,}zZ)HߪA@5?VTjdcᵴ-0L5!HDZSV#o;|)JJ\kv|@\| NX߷ 'FD,sr ** 8 $J)S=@4TGxR\6 e W_RDYYs9XZc2ػw/~)vNÃ/Ngr ,zlVs{QtU>='>]u%*SMg3E@C| X @lU=.2䵾~ki..2mWM@h~b&]-'ǻǭRʵtCS҇iB\?S>_8dK);? !Qwc[4OHٱ@4:fTw???^y%-qiXee%g̘1i#f(jldA3+)+.yXzM ma `m,gyBw~>:LJ)as7I t^!TjZ$J% *-cj)?p@N{&LE^"`EDt4Qc'zzuF6#YPi9'fx_JF$Kq3*v)-6&q;q&|||x?qM79Z,bccc֬Yk[DeeeIF2۷/: ##h.)[iB~t9o @roq@0t>kB|귱= 6%T`y=Ye{1ABd˫??߻HVv+BnR~8[zz)׵9$#]'99֫۫ Bt\+"ll;ҥ㛯uzE=H)f=o mMxyyOswAx0##tLСJbZ9t LJGEEK?L(ADyX.s3ӯ7'yVb3nOC6Šnĉu;&'%Py?KNSO=w߃TXQQqqq >t:FXJ$ ??? ٿ?%%]үhBU~(_B`մ ZT<[3ъWOUSVfvK'@OK7`ߪC~}^E0OHjޭ}³8y2kLW`l'J8oXTїÏh!O*UL VNK#2V(RjKmXu^^PV6yh/dM;t+꺽 cRn"..F/ϻFiƾU:ԛ?ճlmI/y`4{{!ĕb@#?=O3ghWm6j2|N!''J "ArQ ǃ."-RJ)p6bjn,ʠ8MN-mwzs"[cO|%bJl!&<> @ [/_z#B/\dp\X!x-EPh-B\ (\W.|Ius9`XHJJSrᅎwtOL6aÆc0&''L'A^^: ()Q ygݻ#ٲ|7uɱ{| +26GBGh]R.}zKKuaoAUz?MP1 b$փVmx/ |@6-=v_!dͫ'v]#$jusRb*ssm? |յ%VKY0ɊLᓷ\#ZZS@JK7Nu6k!J>MJmBLGNSX m~oEEE3|p.]E$##Nʈ#5t+ j`.&u t+[l%;[sRJ_B`yf 贡m+@磄(TF zK ~p7س.|kiodp,gDV1utپ FJK1 uli+X+}8qt:SN{wܦ&gaK#999`4ĉNу@Y /vy%>>-[}w;p'*{|K,Q*m6O(磨NC5QM4{r_B / z Mz]ŞOV\lDpqkavLLi-GW!'u2ɼ񨀲NjΛ7W_; v>uh$""yTҘ9s&C8UꟐ7nBV+ĐIåDD1cdzv]j;vc {r@{tu`  Q '׏}zjגwF['Bw`ts`Z$[Cν ۝u:3"]A'jf̘kʐ!io2HHHu.RRRBTT#F`ʔ)9ˋɓ'-WLJUnbd555'HK;\WgSV-*9ߓk3,SiP~ҁeN ^4Hinݻ=,zy*xX-O*^Y"x!HTf:48e$֭[Eikk)?~8'Ofڴ444,YB@":Jjj*eeeѫ֥^zqWpBnJ||ݱ:F#Æi[Y,rs9vd045ݧ%X_ iR pA5TpoQ tp[B:`N/liXnZ5 /,3/ٽds~(ة͐qlذQI)9rdsV+ 1{lצ Ç;v,'3Haa!۷o'''__ wo}UUzRScX۬4 NK (`AqWj^MTsRT-E@[8X 2?xDHq[͏^;x`GACӻ 3ZE';/dcCК!55#GrWkdffHhh(_z +PSSÎ;HHHg d2qH+|fmhity`:^&׶mU}z^ 0lN_)pM@hJ>:Xo3Hݓ=A!NV=:iOl}s.M60qd"4h/vz 8x޽ <˗kc4ILLb0k,M[%PoH"##ill9C_{va5]Ww-4\Tj`)yJT1ʰTl_JHݍK%ܞL$s>yaݾ?pT/~VB{QRwT<Yr`}g{tö1`=A:G<+~u"`bݥ7=_+sl_$I^MﶡDiv|)~.3},jbccedTVV2gzRXXHJJ \r j+g۶m8˳]8a8~SRJ ִ:vݻm"[ѻGξm>.w|m^ʫhڧ4ͮn{`Ϟ_/¡}kO}DDDhފpFEhhdnSSIIIFœV ^_P0ǏM8g-Æ<jZ^Yr#ss: e^dzۻj@0,7Hiαň`"+8[K9zi7E{(Nivޝ5k΢E*߷AXXh+DGGӳgOf̘)pQ4iSɄ_~̘1NѣG9tYYY'L&;vuxUx㲓yyƻԢn]%XB[wP,] wnq \o.ʈ!sMI R^Ss (Zmϫҥסi (-ۗl&N53۷̙i699#F0j(Msjjjd21o<Vt:}u]x{k+--%.. /I&iZ5̀Д0aMaa! 8iӦm0X,=zÇUi}k ٱC8~HӱlUUn 7^ `?LnSvx /w}PO$Z(fv42O!V}+A~h^ y:PQ<ڄS{W{^'66nݺh̞=ۦ-ILLdȐ!3F Quu5QQQXV̙N]Ws=ɐ!zvܣ)T]]oOd^c?`2ϕIgE` P@!W]W WA[.Qq!nx BGV%<*Γ\yZ=y:Տ秽F:uf$LLL eee̞= .ЖS'>>L鄥X;ٳ544ıc iNCJILLz}5~~Ο'2r/oRLKסoV \).B )+`%*8ΐ Ҹ38i6ZDq` 

R:pXB :)1]iܬރQwݤTC !娀2կ񗿼h߶(egg3vX.A)V+dgg3c  r֓yj^zz:%%%L2ESDzj%%%C1eʔhiF_ֽ{7̉`S<ӏj5***fÆ7IMMw:}RJ{`!) Nϛs(Q';m n{!lQvZ_~Z\VVGaȑZn8##$BBB7Ζ߼m HKKc̘1K󉎎fذaL: l&-- cǎdڴI&;wѬGt7x xRJyںOK` Ӏm0ith,;g*`AAlE1P.̙ūA"//T9BQQgСL2Es` >>>}0aMz=?̝;iHR|{كs1pfŴ|+VRRڵVz6pr;]KU o/xT1+7s3H=ӱѫ:wy  -UԩYÆ/,,$))Ai~sٻw/ݻwgƌ ILLd2iE`49p%%%̝;iV)~{L0 'Owٵ+=I,l߾͛?+S+*k}Х%X?nizik| 0&ÚԹmP 3fuhv3pug:rŗ4Khh{Pd{ٳgM֥EC/Pz0Ǝ0J񏒞CW ͛ƅ9y$*+ JKXn))n'gTK%~][ 탅T.3HcƢ2a.Y 7?[ 4H-v A_G'ǎƍ=zK$..={2eǿrqqq1k,XHIIaȑO 8ӧ;}ë`o@L4ɓǟ\ DF'0P[7||xx3n%Y\+Z7/k hZc(ic~j߶mDnGmr XjU gZ>!p=SGiƏҥZl. ӬJ<--ÇbrK TPV__OTT\zNO\pA/͛F>jo_ Fc-`YY9׿Arrӱ6H@R~Vh+gJɵ|GQ2vc@u_%4 vXnFrϣzz:eG:t6mIaPN8All,:p<-%\ĉ55)YȆ4ݷE%==3f0r(-^^:&0q☓I钒2bc5Rv{}N]JCgO Q#17JT~PT/jqgqiN㭮l;"m|}8__ODt\ (DDDE{`߾qzf͚+r0-xx{{3k,RpK.Ѽ]!22ʼy&:iԩ?*+77=?y j*B}ɑ3ᙦ+GV ¿?e&Suv4pCk=ڍiNbPB {6g;qzͻT=zTUU1e+8``.M߾}Yp|EK"8++ٳgk*СCNv ܹS T+&vWSPbÆ7Ot:;nM>tv2j+dl)?mEվ#X?rٰIulFEgB~({``` r)f:DII &MrAT"))MƐ!HHH`ʔ)۷c2ydxz>L>1cN:>|O~qouu.R+-t6\f+-`ῑ½fV\l'i|B\xxNfͫ,^Dm8qC#{໢1 QZzvM@@su{`ذA̙qrER_=њ^gƷq+Z93B,3o@ *ޤ7%(yV_Pre{'3=yi,,oTf4ޥuE{oP<חW_}k]}Kr4''qƹtۂ%999ddd)((`VU$&&:o1kV_vRJSԜp޳'zZ/v$G(<<  V+vv5'|_(v20qύ"Sڕl/Ȋ7|ѣG5jGv*>KNNfN_[sabcc t\J).XȑØ93줴P޽5'z6*VvB=-Je(w۷ ӴUx gWU{^#zޮwsssIKK㢋.r* ` wKA֭سg{f֬YN$-Jq1xn̙aZ//mȽt`E}8>+8 rҐR lZ` eX]I{(ߤN<X^>-I 2,й&#,,L_ o>***?{-8\1`̘>}WZZN\\UJuu56˾}nud<|3l ,xs9FWzu%Nz\;O>}ݏ+V~"!!~i.oM!Wzz%-"OjFRJRRRHJJ"<<\*Oܚ̝;Al&:VԼۻw?6Bz)V5܅ںh% U Diy.@)@mnxчxGwMӪx>޹KLppO͛F~j7Dd>VpdӦw0n6?Sz)6Y\TBxs=pxgwSGqjjjCIS=DGGr ~Kҭ_|Ai___&L455Bvv ! KX+I)9z4M`/z}~)ڥ\T'w&\=MW{ q뉍l6ɖ=)X,R^^R[ |-\bƌ,X5̼yӸ7ϥmqlEHMEg;rB GPoEpkY /޽+xw J𳳳>}K%pm.HJJbNpꈈT/ !4t,:UFYYOmmowi|;RsjZ.Fq+JSmW]u%Kk>MMM$&& $h wKA%8p[0UUU|df:NԊ N/MW/aY6lx*9xxt* xK" I'.t>+ #Lrr2L<;pL ~]] 2i$OZ?@iim߆NgyHHhX,⒨PWWǻ~ΝP(@)sz!fP9s:*wynjj*yyyE#K/^R ~KP!,,̭_|%%[hjjC^djY3p`?ΝJϞ媬$5$֯JTR|\t ,]*@ssd SXv ÇVjuk.233c.3go999dee1aZCC}111NS^^nhllX|}}6mcǪܹdXfY__{}߻)R~sO`:\JD 4>=n]v~Zc\verVr233 r9)))2x` l̶m4%g)--u8h4Ȝ9tﮎ IK;,)׿TR|\t> ,](-QVΗ:VFǏlPZR?p1V\id2Ctt4z'2~vȢ"mFNNF3g2fjZGFFӱ*يh4ˬYa9Pe{ T4oG pkw&/x]bt{;p}X!6afqp9~8;wȑ#W^r-m4Lؿ?{jcܹv;`ȵ^4@Y,صkluu5ee-Zo~H)%''ߥCRYnee_#RJ1E!~2@@@oe˖؜k6KꬴUk.5,YqMLLSӫ`-ZDhh׬V+gΝ448 eҥ6z]MΖ(7n4O?]4zqh4y'l߾CVK)pg'tB%,^+lٯl~bQ+)=Ů]8z󽔪5ÇsW_ݦuuuۗkdpr59)))lf؃XҥHO?JIIK䩩]:v )ҭD'tM%zru6+l\M/(..| zB8 -QYYPM=2d&MbررCsrj'-W`jjNfq(P+>_}柵R]K"&!G5w&al0rwÈطoCu)7hyFNLIKsnbnXD>ʤIX,'S]]RPb͚ ?^yN+H)JX!8MBBB7o#/}:]ۣᴴ#sϯcذa.)L&'Na0ݻ7C2~Zu+7޸ ooo**Tv%fl>-"Plqu/ O`b,[ᮻ:2x?p;ާUU,Y СC]@>]X,jkk)**tJ3vAmM&ii̝;a2K袊F^^><5%p9.FqgϞԥ_ y;X\zғ/:|ڞRJNz[~ jjj(..I-Ԁx≇9s*2-pehX_LsRzQ)'N% ,]"d6>(([nMul޽y;OV|=f߿V]A]]UUT؜ѣGwjkm{Λhl$&&ŵKaaklQ6؆*vs ?yHOjrssۼVYUڵP] (*]RR9pzJJTu `pZJXX(&w'˨.)%_} >[wCJy'grBI߯_?Pnx;ٷ /@ vڎBsj=f7q]nw^<Ƚ\ye7ېKUVVΚ5IM(&: , !D a_M ??VJ套^yrѭ[7 ֥& |ͫѣG2aB[~?:B/{s=cZȶ?^j Ž;y5-W'z'&wl2l0,](Nn~ɦ~/ÇqbH~~>&fppK\iwd4y|cQ1c.'aOW]]CllˆiUUz֯D50u:҃&<4lZC;Qܲ 7Ϟ̿3VF 8Xl sg_~[Szŵ.Fa6[HO?bҹ*eOѼƻaZaD;R\>rB2'ѣY`,[ /OeB0dRJL&\l2e"W?}tzr.h(^^:]Hj:W6R}wl oxIDAT.׫PR:ÙX~f,:u]G߾}^&d _|;"L(&Nfi<BJ9l‰?qJDVVkl1V{D<CJPiXVBBB쎩W/fgO?ʧnuG%=x9~j2qDo0vnϱcFݪ7Je.r"Wsp7-** ʤI}&fV/O>R]Xa[ˀ+{j2eM...a͚>|ԝG%gO`9ǑRnB,E)9]ڿ?V֊msRJf| ηI~-Չ/<<@JW(5:=j2uWN ֭Drr;#:x1KIENDB`nabi-1.0.0/themes/Jini/english.svg0000644000175000017500000023623211655153252013707 00000000000000 image/svg+xml nabi-1.0.0/themes/Jini/hangul.svg0000644000175000017500000031066511655153252013537 00000000000000 image/svg+xml nabi-1.0.0/themes/Jini/none.svg0000644000175000017500000027621111655153252013216 00000000000000 image/svg+xml nabi-1.0.0/themes/KingSejong/0000755000175000017500000000000012100712171012735 500000000000000nabi-1.0.0/themes/KingSejong/README0000644000175000017500000000012211655153252013545 00000000000000이 테마는 성현 신 님이 보내주신 것입니다. nabi-1.0.0/themes/KingSejong/english.png0000644000175000017500000000303211655153252015027 00000000000000PNG  IHDR szzbKGDJ`Zn pHYs  ~tIME(IDATx_]Wk}ν3ɤ6 )mu і-:-mhbP|胐b!} &D-ՎN)ff0ɽ^>;Οl} g⃏cILLL|sjj/N:yO~9uĉjm#Nnŏ,9rd|hh跗gZ/n~c̮0v';ʢ/>]b CIUU2qw₁a:;ԁr SLvǁsL1SC.UE$}'QLsxqέlwqW"!DBH 3I5!%C L^9~ ge:yf^VUEiUQR1^S^sڜoB"b jpPgos UE(+"z/7g '9p^*8t] 0B,HY"'CTϰ~p*x'^31[9*`b* ߴ1{j |h B f,KO23; ޱ6U$5#85$K`T*ڻx-ӗxeص kUmNdW[moJjeND8^ w\!wӯJiY;ni;G ɮ wv#w y =o=-ĩ;0gdž}מ|o=G^$iy_];:Y#Ub?~Dvg%H3㭷/^;O?61 -jF'bŕy,S\,9@@DOf)'B*0tZ`>@֢*BF-@*9uj)E**t~&KvD qŧ \@~Èe@v;vlۓm @aX03juX">e y)(;IENDB`nabi-1.0.0/themes/KingSejong/hangul.png0000644000175000017500000010443611655153252014666 00000000000000PNG  IHDRxHw pHYs  ~tIME -^A IDATxT[mYv&˜kwDk*++fl#[64ۀFCKh!_ T۔]Y׮TfU^O9'Nľ5c0WDBGq"vc}&'_^%"i"f46<Ϫz<ζ."T#"K))%UJ>CiL uګ4M|l&9d""L"#n AQ l:h0b wl/@ɋ-KMyI33QJRQJZsӠRZ)<"`[k̒RZE̘ՅYU͌ܣVwWyLDHDiZ.8OZ3LDJ)QJ9YbNiX"31d#4g@D˲(1 % * E{,33E{9XD¼MDa3UѯL;'hΧZU5"zED;3o/Hp88N':y5Lx<{y=jVlsr\,  #bBHSVGҬNJ `=+A[k DØ}p [Y#<"pܛAfDDpw811D ],"Jk.ªpV!Q)nFDDԗ/3Ś7 }faֈ9sJ K){;4ZD ˺iZ;"" ax;` DBՈ " iH0EI((Z 333f"D"rZJRNP29][=rέs-7^kZk(3{ό52W͸iVR^I4YRZe =ob 033S"gB<ģ)oFfS2pb̍EI3 E"D,"ui}|-$%` &@ 3S"rRqdUy)Г֣У882ϽADU[k։xn=WZk< M ""Z5Pfo @j Yc.j  pQDTʽ{߀H ~JXKD0 XZ"Vvnwsuy9MR_\\89֢YD,ZR^I...tOvy7Z #p dڼ 4YI<40%-s B rԉAà bq,_=0%%U f yx #`k f/3UT̬Q i"fׅ!m[w!"N$6Dl8 yeF#4LD4cz~~^Jf2 fP`cvJ!IJ9ѱ0ɴm%$ww&eu(!! zrm"n@ ,;rDG)Q8M<Дp:\y)173Dج  Xj Dms~an՚#sRN,,ͩբI%3'՛G'Ͷ,) dm/YNf.9SNJ-Éb(ÙaUN@U33!Fhn",qsd1nLY3֘HH;qZoNfDZcʹ|<rέV"˭W.U%B":973"ҬUqrΙ5q8,( T8DEksasb,0HI|?&YYD[X!tliDPd`@D;"pVcvM@NJP̔XD#"xq?^:y4|:{QuAUMJ_^˘XwBU:¹cJ)k9^͔ҦY!Np[%:yǑthU<9ekY8x|~eV]D  53P Vź{s-"R"P "bͧnˢeY$HEDj/CA)i_Tr~q%Ax}ʻ;g yvl阬JqQ9f)WR^V|9==`IcXc֎.Zܙ^AE賄cL^7 "0EDxzZh_}/yDZg-LYZ+}oU">7ga_o,[4j"e%"D 1E=<2uMDdKw0nAXn2RE  1E[$ =M~߷ꇪ&65"1N#D'`O~~$ikP/fmZbfcRP n=~o0^ةn0yYvT_xeCwa;K+Ab (ߩ#a0 7SOn"J)ps9~y)V nliP;O'{y/~%]*Vjqt0:X1(P[HxȣcA H9AffN 9ijWtj gyf)%'t:0n=ckMu~$Ip jĔK? 067~Kgwp&`"~z|.9#_-A)px%!",AФKYBɘmՍ`(c IBDJ ^$IS&&sqڔRDt:SA4 0*kRZӜ:C)6qap8LۍE&MIIXx@HY^m2ab=?>y<-mwqsOqs5 |s<*;=y<~Ú yS;|u7q*W#Lh=TUT-UQ%LSʃ"+sm-%q AmͣJRVnYkfΪ: c]ܿ"b^5q_AJ*Q,- o"a\ʜ7V:syH"]e`!׀m6#qBHYgxxcsD{QFd[J$_Ui4}7}5*uuFqySJya6<"XėZ`D`6 D9.RV 83!ByHfT<;3UuJ7 I8a9u^t}`f7[Z^Q;EPlq${54M̙[33 '{=kqL}amr?ܽqٟ_{vO$ʐiwzo~$MB aZ$lf@P+YȜ`k,ɼQ V%PE)&)Y+npNy9kJ,fB CSUQ,ׇvC>~zͬAx,捤F([d0۰_~H;1q(GUy +u?z'Ky ^TbCX5z5S,ɎO8o<)KX$AJiԣ xnNﻮ &VQwb%VfH< 4YDj pOaxIsr ̽Dč½֚snnshGYY1`^:'S3I+ZiᏟӹȹ5y{z|p}'_V\88jbeA<,y͘5L)IhcfV=Zphih]2""[)S>ZlFoEkh5j+o 0I-mZVTysWM fvZXyKYtᡎa~wҎuA8%*cg\}_RUhۖJAxl-XZҎQ_y*cjm,$ܢyʹ3z}< w.x"FS V+{UdLY50%nRa&IVSX?0s֍R%gDg tፄlO"li{ U-ҔX,<'(y?S4 sA_N(yq}˟ۈ[QOqڒCU u}/8}x9`քVaTꜳ.iƔ1el6x "Zuk04@(Jwp)sDtZ, vӌaIS "BLvf; ܝ!XU=,ɽ ."U2ciTܵrNj%;Ϯf:C8f ,p'I%S?ߠ^ώWyn/.Z fYxj@4c_Y^̆a!/r尊[U0?1u# ѧ;jeIIRbpq֬U*}p]<"ZW8NCVU vwT]&m7z#ߵa)hܘ&c%Hb1+~ZOO@ /?oo]_kFlƉ!Sҡe%;F4>Mɹ]?|g=+[or~zK{ޝyE:소f!:g~F$ERJy4"ԖyhD3 YngX!ePBD[7U*Auw67 CW害T;Y^V hQZW}GD}r}XN%zkVk;-1mbζӯ/LW_x5ʲɽmt};Y7 RTGJTReA{+fZKP7i@d:)V y@7*3AWwn7I$VC@0#p $?g~E{^g($JNחݻWO|? %_執QηyZ(OCsihJ3fgKKY?hƌi5$0 UC{x@A`joZ#R #`&&GֶHG+ƾfDd͆!TK2 yܴ2)".KDx1N GQa!V2݉y[Wigp8#ެn<5'o_M8'2j) %UfqCa3i_#AdfJL"rӛ1p3"‡a@{ŬֺOo[ ):% jtxLB!%Nx&m>;@/̜3>ޙg0 s) HєV;Χ?oe$l/%?fnGeYYăpWc);auʀ45q8#,Cr80FJ*9H^9)n[{iֺ34";fsv3v;c;n`5 !P}Ջy8 ̪״QtKALYD,ꐙƣE0ڈ`F"]o@É J>q՝BP=jfBspe !̘VZYȣ55Fy:ԛ&ޭH}jg̽UjnnQLU2tO3! 8`88`TtogmTuHVkDh1ifD0nnDnEDr뉾uR^JCVkEGވ"[WUK-zq5YuG-xvyG!noLwxdGUPw. XWrLtje;}&`v]6q΢or[QO(8@Ve_8`a!}n֎kV9,4&rFxXk63INF̱5[))*w*U5) 䒴D=(Y0/J^X rHrXNl$%p~#e0*-!B4@4]-Vn[7w8j]UP8 ;D QFGRYkPu)ɄAN021qΰʬHX.-=@`II@ŏ ӀR(t3A<&ZkpF75j-U,)rK?޻RѤT8lX6u/!%[-VVH` a zVb IDAT X=nǤR33 xuO` 0Q8@r/50H09rH%qm½4'vyzgʯ!Th %D0E""hԽfZkefaZݺ/"[E8H@J rh͊[gTYY/dZ{,Nn inBj-9 &gxhu ஆy9 Zh4l>v6|ێcy<-ް|P-p~ 0>-(DDN})W/J7j͏&Bg0 .<'F#fPHHsbz4EB}VlHF0Y:<+G[4պb9fUi?BN}Trw>z,ƈY,5(ul`;@`ROU[Y"e/ L*  < y$V*bEĬ"V*S){W$ZZNbtYn.PyH)47K+Ew2gy/";,ץRp=rVI{Ŏ $On@goM-ZҴ.PG9V }YM0nH]Xa5օY@&g"k8@ A_Y4[P0*tvuVM-:p:qLYɣ0Q&w1|<}[0ϳrulN]}ZA;@@,9u#;sΫ֌e- ` riDD(w(N3d`#"Df Bp &Zs &֕~ty4])̳d 6J(Bؽ kd,bż3;Z GadXea4em&Z'8TXOܵV(F?gs4O ݸ@ a; BJ䞰Z* ],iB 1hff 0cكcޣ -z٥m Ͽp4n 7ޚvldLWfz0ƌ1ok S,?E "ηU}BStRrw2z&V3H;Ҕ +K X㆓uV0&;_?~ʶrLw{~ ;gVNQB<5˵m>6pM;n6+J}λO_;:7wti~gr:88ʱDtB#A(:tB*݌#p**.K|њspxMXG=Z,7asY~6o^z _W_z}Wnp!@zF֎?O ݴ]gvZarxxҖ˨WϞ1_zٟ?敗90/aC5 8:eFDz@s0P(G@>_KTfT#u k68ƒoBw N h=\X J\S˳_—_x_8z~iBDBDQیm!gHx(K0e=mh򨉗_7K_o?~~g{y6?OEvvP㓺hD(굹y a}8FaJM ڲ,iЈf RB[ M4,T$)><~./' j}?kwf3\Ptt9{Ͽm>ܗ_哏!}7z㫯РX"n;pxtnmh,捻" N`Xսz$/B^эõ$ kt>f h!IN ܁n Xkm&POݢ[N,T2dE?zw<Ҵf+U_6wi'O_/ùfQㄦoo|;_|ᣯ+S;K^Hϑcnx5lq 5V~0z@ _n-bf]a MQ,B[[)i[YHV˝ԖEUi@k)hT‘J gt5N<-h6[`Gi.Φ/} WG\R~ᕏ~r{#&\?zmniS>y?f܍G[^n[z7 ZyڕO>ٸ !#ܶcc!2BlSm߾9{r}*i?0xתkUNc|7Z?pEj ƒ ͼӅ!a[zlU^y}{/,"14)6#XBHidzPk&4,unYm:5@6H' 㽣Բ:9[yگUar[' DU g4l2JfzsqqfHkho3T}K'_g u^f"F =[~m{)}HB!F bbbw 9K=0(19e:mZ}dt+*"J&:uzffdIp3ϩ;m1{ުk ؑDGжTz#FHYm}F%V[0ה&uj0np7Ʋzpp[//$?ttGݫ:W^*}_VW~oCA)f3}}}vu㗿O #wwyd~K郳h٬Q81n4ƨq( ptN׉Qp["ɬ&Ҷڰ}3I 14A)|dg$Y_.G).pNJ2r⭕j:B2m|Ha&lG )eSK:HE:$ ;%f:Bn"6tqrB;i]J!^zݯs_t LN>p^DϽpvd{{Az'sf(A5 fq494-M8\mn9F" *A'hpQTZ^ڹ&5Ƥ}o &F:33XwT"VZE;[s{OZPLZa',"98G@k(J]E=#TMYz:!p_ԸNm` t"5`uұ(O˅2u!B#D脳,WX,U`" ,`5i/15.b/\pNpŮʺnCDβCuJm1"P#iM[Zc,:x;'T!or!% `43ĉ( B+rNg *b>Vuv8>1[la\_ҁR4.pv-,nl_m2]"d E؜*ؠG ZSڮ6(ޓRf"BT]Ʈ|W1HI)JsOx1^˹%H/_ 1Fͼq1CXmHcTсݪN#hۛ{xקG{w<z(2p<Ϋ=B, mjfD9Hk&q2:5͓ØW${?؋b6'[{=6%6h ܡ[뜇b~5oU[~E~m3d4!^#-1:<%"qKo82m[b"Eu]he B N a Lk]l۷،~uɧ3j×sI99?jsvViSLԵ/APi Vu mn1f8m@w.R ٮ'ސYlᴲˎ+i=!Ra3Tz~ϱl@z%Jk}[Ij^/#ZCĤgO/.Nn}(OQ<+{AF9<'+ɾ "N2#I2b3/fD~Bl˿ۊ"5wP_(gUx_pFQFbA`I =3 zs$عC$AM)xQր@ `~xtxйf2 B{LۅuU4-p?;<.\$dCn7፷YQYq}Q.ѷ/8ʉx87 G&xbJ{?nWx^Y33^!fV̻䆨w13,{U< 8K7* Dy.3C<L&?vtnIY9~XtVO}Ʃ;>Zvu?MgG?O^޾tO"!r 6 `xȠ> ADR LU =;?;b$YB=><;vPEY)"&^Hgu$`r>BdjGHQI\/9*HzLUCt)H#Iƒ%|GGצj\[ IDAT:9"/0;D!xmV|:ͨ\7Sxו&=$P@d)z,"L/kH[  a=VA:aq~f+=?'p "`F Ͱwm:Q?IATd!*0my9g>O.wH+&hJ Ǩc55Q㸓*.%0`0It6$\ꇐk:_B P'FqJ"nAsNb>*K_)B?%pA9,#< Jzî{҂"`H /.- u<;du 7Q60C]U2~Z$d8;>D#@EމJ)(墚 fğ~?z[.uAM۞2RMP$ Y׮^iZ\/g<}w~m"$ܒ40Š@FK$D"Azm愨!,4Ҷở?xܜ~voR:!HTGg&<Ӄ˯r^Il{I:Tnd7~YOtpHB@)D]v4 FG}>BީCpz5/.lA瞔AD=$ x~mlU =@G>5DTSzso0e[{ZEjDS\+| g{7OouPFmmRP w5iUї H_v' (U -+ l`d׌}>؏;³'?(nn=AY]m$If"! B@#0\k=]SWǃ¤H  xwa1 DTO~rw~ä կq}8{m~Q BF6bb7H@Bi! amg菏;!+FG?NsD#ސGY#ıǚ-0OW^z'~1WuqS8%T1-ɷs+Efq@~( &}E+0-Vx+ 'v"/3R&PϟnҤv+EB,Pm[mS!BK[3I@-pDͱ J9ɻlã?)V䙩֘b_-6Wns݁"#8V,'9u`jlM|xhrK:t'cV$ƢQ ttT4BL1ؾH$.m;߶y=} }t/Jg6%2 Hn zh641!0LFҪeW<9&/}sN>OxU(VvH$'ޫ端~zV rӬ]1ќ$*iɇ;;?ZR0:5b*I\>^*tFlxYoh (y1bZ>a1\(W^eBӶ&Q#Hd0E 0aos\rGǿOo[GA+]~`oQHte {p;˯\5׍M iB]MIMUp(ŭ\<'V6 2:MQqbJN@w~}^{@} xB,$ELQO{G:O~3.d|j/W-DQT[Uet8̞޻ל]%qyV?lޮb(}XW*,;i8[ƩT~{ZkmRݣ{sNKCHiQ[w 3m{%~a>0e @veA=@o@ A{H A:k?.Oʹ1Fb2z^jo?dt(=ڭˋ>j?6-]ۦS]86?ޗLH{̓8ڟy`S`R8rݥi8A)^xkίO+|1]I{ m.,%*Ք!h2Zec 7H*-.;bzΒ`+$BܳkWH` )R}w~ P"bhX7zuɣ[~N6IS$.WNtWK{GǬw~׾c(hNlx(M|<=9{O+|cmG>e#̒mc~vU΋fhW/d +{ }Wc?609ؼQ &Tz.-$ac41GTֱsY7&O $ɱQF-@)nZ "1%Kp;3HZQf[[BǶm _S;#ugݧ~d5yZ74Rt`F+AuQ$+3PefjSf/Wεf[/W9$ J cGW:ԓVv4nI7 2iH࣏q6;;y‹Ml5a)~[ѓw?n^Nl*!j >S"/[.zj^""ջ!HrD%c9hs7uMoa1{{cTΥuW:M4Mu皲$zVF=ZO]:*bpDtF'\?Xwn63o޾<щ`:G ]́y/FbƶU6Rҵmٖ7oݙ(֠xm\"LF9M6t#uetKr"X'`Tج*3J9Άyj*F?ԩj'ghGH3E ClG E_~'1!!מ?>UYkN-+W*=;9G "-4V6ɘDԠU^gnKj(va12>Zpbt)>)7oݼ6[._ӋLЅvpiQ*QC!m6U nQ㡞.W1UW6rxʌ UwǗ2 >{T#ϣ9 (O4W{wMa1$^ۯ|~e94[f.E6]0>rV,Fa;o6To;;ŪE;(TaP$]SLD,#ԍVHʚC@;xBQN O uS&c|:%h*81Z\e@H3 EHR %G|05(æ+^>wy8{+Ut9IW!"C B=9peu)ߛ_>@ϪwGG<,YTZ}:%>Rh<˴RIb7^s 1h".r=ulLBfjYlX(r^A<iDmb~(*JrINR֋qyuIAGǮ4eX)tY],_piB,+%2YnH|tw?zӬ]bR%dهNƯGgُn %k6 BZ[TwrAP<@͛;M+_KOg3ڔjyKHflhRt*u5޷Ű1.X64bQ\5(-))D|[johu\)wlfPXE3oyZʢ,oݓ{Okw0Pz脙+bwo.Ӵ:nOnݏ_2n]3WX%Y]~kCSX=sy\mP5&6r3(ꆵAies1g"t:EZk97MIb-z;r Qp? h˺t,f_-s&]Uo(@7nph-%t>z.kGɷ*뵗 Carz1{VW:M6>ܸyû| oV-Cu?Y~)kp{TK oLqj_g?6lx/uaR/o_^;CS+G)ʫ*tgij]MZkוf&T(6{wb̦m"#cNDS]lEgøneSS] mG&`SGMӬ^b8z&hu4ɳ*VA8";ɰ ]y4&Me]iVI-D(fntcBmj\x:}w|Mf7^?zOhxhc=Xlbh/:h/]9[*誽17^: 횣fCGR(E]?;93֧4&dh}VI jB4B.r0K]Ӎ:%FZRiF5*MEk@̳Q9Pٴ</LEҜ1&zi]눮udE r=O2rEtlJ1*;)~+fw||Ri.6z4\poFn;hY6뺒Lb*êfAuo#rrt6ܛQ7k/MrAS"@[3ڛoC{۟ˌԯO o^ݿtՍ5^Y&ѱd rzӧW?b::Fl0:ڐBدVf&M%zsݺ4&mMmlBհ Fٔ:;hv!&!(x(Vkc9 IR7F%כ[W_yiOgKVUӮխ߸Ϟ~&!o"_wnn]\n2:"ZK"tz:^/;74xԝw+7HCtRʴmD!Q]ֵ1wnaY +01kJwL]kZ]9evQX 7ڀb;,%ܦVNg(c&hs^vӧzY^n9Im6kN >k|tt{:Kfկ}՗޹uY7IPG'vWIUmX̻`%iybTq~gBt~raiӄmO.'./&:?齓PQdhR/8EM'8B$F9sB!ٞ+WtܭWʦT&Z]gC("M@<z YvUo:,6DDpjJVu}3Ept4p>zzOѲ ^>)/3IRlIb߉1;\}gD5MnT5\Vs͓] lFHYX}}-2e jU9y {> a"XP5"@3qƑVqAQ4J1&@I@- `GD 'ƉA `$I0{"A ǁƖ JXb^VPؓ)H "BƉLC o)=7;_i!U3͝VKbDt&4a$ KSĵWpYF|Jl<`ĆAN$4y lAAO  agRJ1 洧Io[(FyLӉlQA"ihLP,Ip ܩ89(a$$NpBX|_9$1 ,bY "8.˲?bAAHQuq]EE8a 8D Nb~ L CHX`VoПfwl[$|V#i^TNSwdAume iT K/ˎQ8:p:hne p\Mw<:mf#_u\N! s1EKp-LAH"1yqp%i$H|:Gq0,(\N' 0Dq I0!Ir<7bS! 1Y9<aA8#5jhx8Y0K0fٙɀ3 M@t ZN8\x|p2SWs3as[\X:>ȇ" ey]G ø>47 19Of}qO/p%x@ i,(a i(8{&Q @x h:jU<1ZQ@4y`ZbΜ^P)GtZ T1'qlyR\.;W' * -A"Ŏgw C@ .f |#nye6Qit?=nz4( M7cA8N~r{O_>}6LG__$$w,osei1ü`2  ,+NbNQAz.N`b >by p|76nO[G}dzz/4'3t0tyQyF.C@5$Ͷl87ĀL0HX}ߕv'Z:g,% 1hr>9P/*rl93|)7bJiY-2#ソޘooίE+bz$ei#@$9!PhqA "i 0NSBwisY,SFB.v mݼ{Aa[iKEķNzkbj&lϯ@^z`d| 4d%U<$1c$K0#&`,`,A[S(3Wn`Q;ƞ8qah<} &A V>9? vЌ뗋3_w"@|qh?z3А2QgߥI djN `iJQjE1Sd4b,al-+"'n&a>L>qk._oly'6}ᚼTbˬ <+v&`"MЏn4>{D?a,|( ! BS$ `8L@H11/ Rrpz`uTXJۧNM 0])M_y7l)QoWsk󛫻{+{OTk^21a[@ g.uw:Nv qsZ1I$c I&\,Bʋ`ШmotF4p9sN~s,Pl)y3saZJ~jiak Jn, ~Ŷc1w8:WoRTYCLyD@c(ƈq0N$/UӇ߾:ITemۊb.ə^P1eQ-TgNsPL1?oW޿Y~J$9gvݫ.~w7nN:9!z޻ #[cq,DQa$qEV@1Q"S AV[ow=R8V9c8^Wd͟k*"o-xNdJHt` ݋yhr^r>l:5pnm`&1Λ 8R@0hIptNg߼ر\}.0z;h0ܾs7.GhÊSj9!ZY0u¹ӓ7򧊚_lR(,_|vuðJj[_KgSBt2E ∑0QĀaxR *bVsrv2ZX(ݼ2#L94Y;>6{d鳳7gZEtq}v;xs 'R-X߼y|ʚkGNdQ3+LL`8#L FE ę, ʛ Wk¥׏{gg҇|W;4 l:|淟}7~ڶB/5k+~/?Ƶ)EVմ:`* \V+GoImq& b; B~Z?D> ^GgmXS) MǶV/l2EHw8[XB*U[ O`I7O7f6IX>זkJA~|X?`1I!~Ɠ֩[.NrO_ǟ|B줜˥W7_&,.s+nO퐰l#MHA‚ H ( Ä,($W?xszGk7#]y$DaȽ:JN41!ehz߻<I/,s7.N1{Q:I+i^V_'Mn6 qp{ ,%HE140 Γ#AOR; /\)tᠣSs /Tף;ӏ?)@c~YZ[Zq4ט999 y4ɴ{FP~SeKw*BM/]~U¸b6+))j,%AB$TS3;~4:=+9/n%H0Wxi>< GŹVocK3Ke=WiiOzf ND˜,>n+^NSī<;E&)PĀD$ ( KSOn䛝kOtLJqX?.{6זx` )jƘ;78`lQ"ƄHoܽm$˗w˗rNɹf@9IzX4k6cTOA60D<I4SLj?\^p)@ŌZl791=SHka Eޤ7]|?/TM4Ч Kk=7P+ڒݣp\rZζK$MXuS(1cBKgKp۸|i:Hn! S)6xIq2&`ム%M<=6 2P; twyJovjzmbHʶ&JAGpnieN"N$!fpFqvR!4 s),ɥ]]Y{h-3z"_&(%f'(F^HK_lzShpuK˾=~؟/@k_jk_zu$;\Cq"f$b!5C$frhh_<`fȥOn &'yU.~/_AQ BꜢ3L! DԔToL{~ob:j'\zc9IDAT[TJj 뚢4uUSƅjJJcfz\QW/?ull񈢀ģJʌ|gTQ 鏞qD4J9t^1qJg:yrbfup0$U-zs+jcIs Jh<:  t1Z n^%Yn,*Ä*ڹDm~xAΐ[n?;~^UL!:$5)YdN!W!( -ΖÓr2a=مڒ ÃוPT\6U[w'ià KӇS.N{60EMO$;JPL;곱4?|xׯވISJp`#A85Oڹܕӎ31[[akJaw{|&BDfucjCwm1&cLw|KA \Y2_ .lỎ_gō(*W5Qڙt.7;#XOU$@vc58.!\7/?`~yw`h vdp>:uo#n\\P3;lpj`[~՗O^=9{*6 G_X?iԳ LMsII[~fyD(O*l6pW_Xgz 1^8|1+Vrr%|9,ATxR^\LH„ **8%8ND?z홏>~lS>A\&$gYl}}uY3T[^0ƌ3 L3zd8\>:c(M idL-sBiig%]ԗ&qؕtQU|ZJEQRk[k6O ,jO( W/a9TY{7c oj"JQ}hi6[sY5s/=/eݼv\*<>./޼5$Ѥf?b1~ۧw<{UVrJV*Ս\nZYw<ݢ#S4T)tav@h,g ٽ*1-D b5ޣJrcF>w{X@ļ edR:q5 cub&l{o,Inܺx~;}ߒ;;̓cØ4JxWt]mn^SSt|i! _~H"5Be`?29^s`} D:LXB`b/<u i%W>z9{-U6ϯ{se9+~w7rjsAgNR::H`1IkefsW5/nBf2?t'[ WO-T)q1$AjPDR,L8=/tˍ2VZ;x}9w?tƹl^_`ᅮ_Fc6nu\?\iriJpMTT%Kf ٹnj1S<ΗRFK-.f%brc><* U^v?pMw3\hB\]^^DXd/{9=͋C#W #'_\߼G>|%QRAϛj:_BZ+om^da'qF0W“>N0M8iH\BZ\YE$l̗7/72_?n5?$AIENDB`nabi-1.0.0/themes/KingSejong/none.png0000644000175000017500000003611611655153252014346 00000000000000PNG  IHDR>agAMA abKGD pHYs  #utIME ,mM< IDATxyYVY{w;wTƮ馠1 (%Š&NA)bE(ȶ;ah P5tMo~i>x}%;{9뻦Zk8S9S9S9S9S9S9S9S9S9S9S9S9S9S9S9S9S9oӏEiR,Աyq)ٔ L#ŭ׳xª]t8'I+]#QWX3>>ζ' }ڏNڳvVݚ6$wK+Yj˦)wy?cCnCrߚ{}x ?A2{3]g~zfN(cCъ9*=Y[?kK[Y&b7GlE} F PSdѰ!?; 7.aTM{S$?L3Ox~_~>/-m~Ю/`c; Xb ` !b{2)' ڡܦ݅F޴/GyCkO s {hW֓ b$bKlfrCb(E2uo!orPR#FC/:o8ON?zǏS2'gόSmwoOg83 ~"Lo3Zw%^at!y :M-X6H!d Ո"P_&TTn">fK3.o48G*Sb=mIS||Ob9۵ 1٢%{cD*]#_| 0 !#ڰ I ڀ֠-H͑G<, bm-0 b71ycD`:l%×oY'~w{7_^?]g7~$?ECt =h=c⿢#Dk A"g"h#@]\YPn#K+] ?D%Z c\Kݣ*ONre^]s7߲|֮;u-s% GԻctF+ &3PUuIs5%Gʗ$<7p~HoAL 5g{M}w~xN6rKm7~侀t>ז 2PeR_ dԋw@.%u iR:բbu054&O3(S50௾N45vuL; 6f:3 AV|ݞp{ʅL~7n%4 !CڼGl#QPM[$sT:h6Y59hH&H! m8b0eI*GELH ۍ6Hupe}y1ͭV/K;]aL&aRDD&V1c#9/|F3Er6 !$@ iS5HU\'H RFI81 QAr z`r.h 1A',w3;&oŸQq|7[[Z0fʯ~\61(,h[%E`L@ S;.Yz(A} UԙTuӵB&[n| ]x@#GCD~NyJ]}W4g?}1Ϟyﺇ?t Ҽԯa3MtaNR^)"(*mAUirn 4JSea2Ȉ`\@<%Ȣ\ := <@3b4tLU˛Vt:k #]{8'Lv}&88bap^1z *1vыHҎuHv%s(#fRSw'5I!8Ac FKFbq<߉^Bf4+Decst/[EgbSKOKlf|?&a@20RH*h M  H B;SDA  A !60Ӕ,E#0dh%0B8)2J2q^cϮ=v EUYG2 9Gԓ ~vƳ|}ǩ;#wO|[ ?O: ~i+ty$)CA:8mh[b0B*DM!VP*hT0hДP6)Ѐ) RݖXyz=E6 ꯣ o"(Z?7}/`g4s~rO=?J_)‹_^XrI1C43 fo1AdJ<,MH bV;+h06rA$"Xv1TI^%J~8i=@e:|.ELR14}q]L bE@VlWYŐ:zK[$: j 4JQElD0牓X r 4+@"vR e,̺A1uL^4T j:%l %1.Ɏ}[LBqQ 7z C[ Ɉuu:A ٠e7 $ "mӣٸ5BR|Whf)9cE#)TF{?DJCS5k~C jaAgQyKWoP3WOn#nn"&Ut쑝k~Yb*=nӪ+yK)/hϢй8=O B17pu߆!v hwi͈E YW@x%*:FR*+RXkP 6Sd`ʠvÐ_'tR;Տ3M?.}˒g7DqL_E7~3{aƈJ.-7\qA&"(lWW-04|8bz^Cthv'I %bl/#ph0P!Lb-nO;?jn 17W563*Z!0}%D?7͈3޾E堎+Ooѻoqoh9hLz# y" N"DJFY &u4MrrtE^oh}?7>$/S/1n^m>9&W8輁ٔl9#O~i 31![|[$8b ާ_D}I ͛l|ڊDGwKXzfHU]/]G4E & ]a *>q FرHfk0gwӣ97OKnu Ǖ,w=?"OS˒HΏ ` .bb V;dg~i(υ˄!vku}_,_dELse$Lf[҂1 A>ޤqT%zJD5 MjYyG0Av!jr̈́4nhzb}>mރ#yo(L?[OLjZ!6m퐟YuMjH/)PD j rŗ7q۸soҹI3O&g>Ic2{7Pܜz>Ec)!wÀD_ Pjr˰C%[SH@$RzDn"ykbQ38 {ah;@VaoR>4J3nC;G@\pٜ4-IbVD>-Y}?M=~9m_˟64k4/n¬ƚN3J@.ߢQI&E#h[Q1_jc׺ = b Vpp;Wၠ.Ox+icJwov~l0|ȷΈkF!.D kbJ;NXYcUi}>yd)rڃ12u2"YWn Y]GVb} aw>ΫT+~S/ގ]|7wYڶEMa~v{_dqʣm|amLw ~p৊4ˁWOAƎM'ؾn2U!+2@k:V j8luF_ۇ&3Yd 4'BlS7mT1.uM Ddl#˫HC=jS-U}ǀRqw73m=?Y,mQюv)_mPui`0NuH^JQ--CfF~tROpP!֑ap$ |+FPUO]Q:-"Wd646ѿH;q1JL/m̐!2#䐺͘FF۞`P]p ;!סMG#5bYbqh]6)qjfAB= D\n `Ϭ! 2x` ՖvvH.HqGP2 "f5V_cmƗ=b5# oիeC/t0ޅi]3T Rlf0&tqw`h3&4~>Uūa u}w)/][ǟ'OO?_MAJ,Q^!561]l!b$=a֗7GXc1B7pjF]}!FH#mNFV !Qh4Lيc~6aZBD5fvDGg| ~}Rl@,%ot^ v'&qGi@]=A zL6M˛ 6z iīvhUA0s/~;b*:_gRRT!D_O(`t1iGP:`,Di/KEE 0%D08,=`\іXhB5Vn6+(aNƃE[')}GNTڄŢ#ƀYG*NsDiHӎ BH(K;j0B f N+ַ[XZA3 ͍/wQKլ?뫴Uxń5npi{%OƐu#lW>ͫ hl`0%<Õt^@j!ÚF#Ǭ&>]@q%[8 э5e. < p{?Mg@\n#P@)ZīvRKC')J[p4E@}@sc:{'Z W-R8FBPH*E=sۿDs4wzBX~> M@ІŒi'Lw81h%ZG]Ȣ 0,YަDz}=ܳ9dޭ=d{ZW[Hg lÌ+_E`| @b0Y`>-MbI{BCI?9~<`{/[tϟE-lM ɣBp`Dk,:`!F(R >e#fg%FzHwT#s Y^j(D}us-N<ÇUp/&:gN]%B:NmH[(h;G#-]p`|Fbk0YSEk JxPפ!L2&N"/9AYդ*EUlBPЄh%92L=&D~hRa}q8pX 60>-չCzW}n{_Ĕ~mYueLEsc{=3I6 [ptIc1k Q|Cf6%- GB^RFhnbeڀpm6$``0b̡1Ȋsئ۴W6#,5o[ qIDATkBSc\DrNut:Worf͕|jDAsOv+7?-ν\Zd(5!4C]A˰p\&M>Kܲ)\YDghl{MgMϲFֺb\9=ɓuS!>XP ?-h]ɬb>m14X1ۇlٰ;T!P+ꩢMp qq$0 bݹi,[;^HA!QmzQZIݿ*gaqS*LјAA\*{ti LiXC6mkAmG/DA ¼Eeqjם"S*ѧ+_*1 yEl +6"1ŝP> ,P~ KO Q Z^A4h4]% t YKg82cc wf f;5}<7fJ`zVwY;W9~R"(Hux; `ǡ:ۼݗL8siu wh!̔@Tk!j]fD{AdeX,r.,Z8iO2CA R7i6t ŮYA tO"qc:E끱dٜFY y$rOuiXB:ʗL;bK"~rGn | :-Vvn{v&ypB4¼m,>V}wP;q'] 벀Nڐ(&%-x0"a: e$i햠u ey(V,4՗IDeB v%pf~" ":y B,+¨%m M |5( ]{V;A*ZFkv8ְs2¸UZV Wu8:9}s`]~ugom8lhet25s^d((P[û6m0M6`nmQ7:ֿL~w2AF;opA4b"=,5g|Pl}g* b6J&M/Hq5y$Bg mAæ Ulݒonb/}sx@=Aۚ4A怌i&mn29\1ΜIai%4>xgh㾗w1o4NI̿x>o_m+ç#-Bi*ԅSQ̊#yդB\R z(6# A0YH'e$ XğǭeHr `a!K<4A2G}? ,?M,ha -gXA5etuv#oMSs0 [ p"Fj|'XI׽@m,[߅'QI wҵ䚏<3s GS Y֡|ʼni&Ċ)fGl!}Mj:,jG  +4ѯaRQyx4L f2X|9y"s!qq4%.hɍ}^׾|[36(f(W[]a[׹]gu@V>|Z?bϙ5%B}C61Y@ K!~T&*&[OBkѮu$[ˉ4=1(,ѳk_Y'?cO=`,֋%4c=޼Ƶyu/؟Ԍ0BlU{3*Jnf5 ? չڝ fl^..)&7N9ڪH h!냳lc@(q}]‚`ml笠8fo.܏1y9voGmvqȕkSnUL@ BeRq'X| 'xpWX9{6w毳wB#k'wLm"b뜡wIFz+^-1z杺@ 1%f BL{y,t[<fG}9A\s-=!1%VQd7en~+/NyƔiӱ>lW!^(, ~< J~<1 '`_Zg|l6FD.BeQE3~wiO Z@aWu YIୠb@v]MziȲ#Nq}l#Ab?ߣlo͊?3^#K?|%o!dSTnQ\8v*549"i{x# WH>`2!5MV#2?N#Ib3!sFX4GGL^}Wv.s}fb4j)R!Dk0'Ii`6}{ʛqc یr`x~ nэbcSlK9zgZg{[cԇL:K #P6έíyM =Cd|޹qqsΙݵc;v4є"H'w$ x)6mkw3;saN:H{wז1uJHPcYF~:11'>7rs|Wg'`7X,9GdDBvy0|ړYL}]ʹ$56mWOoegqoch-8_:3dRhdi+B?ZjA:ޮ3~]") A%xQR%HS^!!@c!x GJ>N/q1ժ<*C/\X[/ \JG4NիsH`sKGyuRy_Dr]*{Uw9~`@tLu¥7BzKgrA|B8fx3sdz9;|f *Px(#w<̋i^H!Ǵy}EMsu5|- "d`(/"zROx'f8KkzL6]\J h駨d\'9"$ǸL 3\^ڦ~[\ ~?_7 ! !rm_'Yd;ugJ cŇqIЇ`  b y`N nU7K0+B!6?}AЁG'Ggs.>.I I8;g,D#!+ Ӗs㓼=G~) srB4<*Hdԓ-.sH]'Y;I`vgr(-uYGFG:UH@h`_'YWo͉/J^Kyp{rO%2b]aK{ ]l9D (>D[VkyݗWhU{\%S"`$!&rm>(+!W>#n)WsW.}pQGb+ے[7һ]UfK`hO`;(AiD5^D-A|%Po{@QՑ* ]Dh7:UbmѣXɹ%:I K 'M놎Џu21:j:$W~vM̶m; kL'ѵ]KZ׷:[5djMܱ}e&I6W U=Ò5u5OcRS\uC۴hTۤ_E]!*L1U̼XCG@ #ջnWUPk?*CHL47Il#F̶+qD6sV=_[t1`LLtp[3bW*o_"-ͮ:xc _뒠LEBȮǢCY:@W4"Mi0m{wK.@lLb4-X1ɿ3kB\ߺ]C$=Z H;̃GCG./`(D)D'H|g >A Xz3lϱѥGp![$__6,4.o@qomgk)oy=$Cߒi$0 dMH@'<iH< 41/Md*C|0P+ _ڶ0 yu4P':&`ý4p Ěo5/3 n轉ᆈʁ9999999999w!xIENDB`nabi-1.0.0/themes/KingSejong2/0000755000175000017500000000000012100712171013017 500000000000000nabi-1.0.0/themes/KingSejong2/README0000644000175000017500000000023511655153252013634 00000000000000이 테마는 크래머 스테판 님이 만든 테마입니다. 한글: 세종대왕 (世宗大王) 로마자: Gaius Iulius Caesar nabi-1.0.0/themes/KingSejong2/english.png0000644000175000017500000001675011655153252015124 00000000000000PNG  IHDRi7@bKGD̿ pHYs  tIME yIDATxIu;p;<1$$HmR,ORfʕDrRlERURI"Q*[*Y!$%R 1D7z7cϮFt t{yy{??p :G8kG1=#]r9Cj\sMK9?Emߕȼld1s!r.cWP E='zrFmS0r ڷid`"uǷmOj\v[eSgfئ?)m8Pzc~}soT{uܦBoҙۗ=LidJ)/3vڻq?=]0p(`b)B&֩ dkzǧ l۵|ik .T -%rԡijnj͵2"N"s5w? IRY[ 92DJ-hmivﮯX8K7Kv144H4zJg-Ug9߶ v–睖 (޳qEdlm"HUfF"D$Va)Zn EczSijy΁#*ud $RD15T2Zki(xE Jd{^{~.E761G3I{R\"rU8^X(MU+C?tqCW+Osrw?M%8+D,EbinSK4"ȑP%Uz]^\V4~6V:_}"ZbhimJ*Ekԋt"GzZi XSy+^g5qO<(-m F-kSH'QT2Fee?r;Θ `W|9usw]݉pbGjj-6H5"Hg6r]kO2HǴ/ cxۖkN|?sTX;-VMU̬TDs{*/y[γ[cg5.8RYiH9!^nJlZZ6-J8ek 3 o׼E#.)!Rp~I~qh#Joz w}EM<#O:Nر248YMlrig}`?%w5ZyhUbֆyN킱Jq(Q)u"KN_瞋.8p'o>jLTKXiZ-r-6lE:Ff`m!6[۶4Y"w˞yM"Љ8)ujHYHi5bTkPYXZZŎ)?y-\v>| n:-Ћu:1Zvͬ%rDgmh=O}οt:~Yo_iYe'OMCdvg&Vtb֮EhkBmOenRBPtԖW[.йW, ,:{y̡V ʡJ-D+ y_Z{~Ԥ kvu  *S{z)GVbK ^/5 "jl`-yK55s;3=.-% B:Cge+"CSSΘ[7v^lhbgmNZMMUbO6Ξ(_m#Pڴԡ__qm# \qLi.Sc[o`me&қy07DO+PcfnO7ԹSn۳ga-wP-XT\ng'' #4{eįD .+1oS*vH?uVNgY90 *K>oO+k%Nِb(1bJ0`m3zp)pϦ]ݑ9ce=j1Uz(ɴzڏHx5*ne*J3;-mJL-L,ՁR+Uj`lڦs򾩹XQӪ֖rB=K3FR##ȎT g5e m+%׻c%,eZwO2uEme/xQ$ErGe׾)C2Zmb*_),u$6T:+.w`fK: ZYB?K?=gLXd(vNH=922rNЛ=cĮ 3}JSơ=֖2\le-kI;g)id̍zr#{n"}gmX VJs-C4vM"\lGiK44J,n*u斶fb7BzԶ\$ӟ`ݱ4ku5xddDc,Hidl+p%'01wI"D-(LfRR&3S!cM۶*t}N-R  Zo?0r SMεzc#XcSD$H%֪O*LP;mԚ["ȕR;"ecY-κ }MڷUf2#XdCmm e,$ RPT L|'~aOYk,-1ˌ,%Z'l;XԘiU&"koK'[xݟY$"sXn.JTrKy8߅-+ۖ"MR J"74ke kUbZ˜: g@@, سfǶ8g;t(t2`mHP0K°U \0\g.2Q)"(,Hbg\4JZ&4BS*Z'lgh}bce ,|_lGlFN@nC+W' Ze"aRR!jĨliBmGZ*tFb̏ ?P66 EFؔrmSʡBV¾V7ag- }JƁZZٲ) gSSCLmN(mq,~zsmR/6RVVV&:6yvYlK4V6 --sBkfm(l&4>-8BZY#aIX<#Іl+J#{r4RNKVZ3{aDTbxTl<}bD4"[?xffZEXr,<#H/77*zF 4IgLZ$Db3 Za}y+B@,׭dyX83a}L S;J.KZJj%b^Gi Z5xbR449V"ӊE2V֋ eZ"WTb;Z2UDrP"ݯǖru[0z 4ƖJkVT RUn)eΨZ#ޑu3:6F$lXRX)V agJSZ4 ICP Tb%jڰy!њ b)5?f 5)&D&ax%҉L$"?^5JHmaXR'34 ϭ}Ç} tjE,7/D^laHpc3N+ 22k5JKYhzq C*U?[] @! ~RZJ$9RYzI;:4M'`4m@ыz9f*C8tu%8:*ڙ^q(Bj珉*Lbo z qPlj u_x0.=V7-ЪD*Y}G얘.P2ujL/ ӧwma'mf*bH?KЋtFt<ȹ^u*(>>Q HFchbo*Vk"ks 7H"?:J4uBR"׈\UJDz:HDMrlER3⾠ކb+3iŸSh·`FwoҋA߭Da24GQ83pR2M:&:[k"uVx*&a|``m^0lIDV2nmr#^9Pn A&RCmV. Ta, ig{TD!ib]N|"B@|iV V*<恕"wuhXoa7YjtmPJe2(dֺ 檥pЇ`Z)MK(DZ\j<҄#JkR ȶ J&Qڷx@Cp*l=.SL#2 ^ctC&۶% 5jdz+SH >W8ž]=O* U*CkEXRyR™SeA ^A 6Q.K(>C$J4<ېUj@mVV;<0UZ<^q @\@bfxQZ% 3|ӗjRJ"\mX/eR @o*3?NHc.X>| lS[ ~x)?Ah6HZY4[RP6U"XB$ٰbO9|9w֎L wqvHݟ NަNcj27u'Yv8tAm# pZ0Xlɱ[Jb4dD0~) ZfLkd~ǮڥO<t0 Z8abKGD pHYs  tIME  6$y IDATxڌI-YvDgVV2K@$%SlB"E[LxgyJyb0x,lÖeEHV,VY{۝6xwĉs"pp=4^k905!\WWL'c9GU1FmRDV)D!)C8J(H]1 p??D4ZD"1F!+"mk>E!P'<9{n\>,͔1? ) o _}ΞSK !bU7(Z㽧k1L&ڶ%wDG|px1NEzM۶ !s_q u iL) -' ]C -ε)1 R(iQ#DbVB@DBipuF!B !] b6-7*B$=y@J6S L A1t1?(Y4튓;q|U],ԗTULj9`S #Π 4hmֆdL:Bx1 1Q!]OH Bѓ.A@)V P@ FB\}CDQApՈ(|L Z"Rh wmu6-! tSP*-BL.ߟbFD@r|S\|lu 1"rrۼD|2Ɣa 9Dطpu5b"%GwO9uyzyIiGrĴ-fjRw^B^nM/kG\]][A'-!@ Q,OUU}/J/x"{Jҿ7=v#rWzkKLUG"JI#=uS!$+"'\`"1xTH_޻鹴sI AQ|Cڼ%AHkX5[K9U;ߛ|b~]_Z<']>˰_僟߻oPi%i2tՀVHhv%-&7TBP:-zgAՂ֊#>3be Qο`zP*b(q!c58`ʙG2QT <-*Prh٬J9y|gP"ٰUHSRgM hOUDJhdiT1)%ppQǼQ``98~N).MC"P__o5T-yen.i 9(,J (Bl1FӮ TUE  >**mV >/ﭟBlܬ /?t>mA J:z,u\ !F\(D. ٽ'ѷYc0+H_>孷|/7ܻuV{8[YT{xO?o~ e fꪥu ..@ZlaRi' Ff|O1c[% T -xʃsrŧ@G ۴!{ ?|fβv+ĐfmE" (EމPFPʠ$W@^:i/'z."x$h-! MܒƨQbPB6EQ(Kqs:e5@G@B> AE(1$yW(:x~߬X(~!xMɷZ^{s#.*L, `G3hav>{'. SKa&8kr`\S$H.BN@MJ@THeAߙ1pg+1'`'ԉZ4" AUDQ"#!$Hɥ t'}r#5YYnN'0!\ܒR4(0 qO>|9N^e<pd":k{AZ~G|3ssoL(혃Y8?wD.a3GZǬ̗ɐB|^ZT*!6w.>è`7hԋBId HѡETȖ+(b0H*Q 4%ATFJŜd?G$b y4PJ xѠy e ;zMXL[V!xzC#UuEZ>~t:xNƞzϟo0LvF UB!`9t]>Gb2؁8B>"Cb? iShkWBKB:H:@!TƢ{cT(rW2 D2AzDTXd(t5$TW ޷QX:m.8B|>?zMEl NZ&C-(Gc#71j6e F<6w٤SJB Wdb hR&/1s6o$A֟L忥',P [7& Ob{Ayk$2 1O9&KSI"E5{]$Yo nF%KQ(=ؗI(E3(0>ӿ᳊z5S%]RQтFXw;Ѵ]Q)inN^:_LMHhBh"ĴuB-Zm6LEI+v!8 ŧ΃d,yl31Dӆ64˟Ql)a- Q2- ʍi1qŭJ{tSD[Mhb@ſw?5^ +g(g[.lB:E[aW0K/ݢ,TՆウ}O>?[P)(:MetIn&(>!SyN@!@2ɟZ2/T1SQt E18ZO%-Q-(%H*)+Ob1hkE'"NŹKpZ' $:pm2D ]`,PcCkC5=幼̿++*s|Ͼ`d4{s\\?wryasqWo$8&6s jҴp އ|z& . GI6λ4(C_>AؗZr^$HZh+ Xʟ>;!>R>}˷ r | .UZ ;i0җ 1FaZ0&`J0^UTgcCP "u bYR Ӈ<֖oExb( kk5QLo6>sL,pU?zu(m2\SNy,]?aF8Sfe^y5x/ц珿 hlq|zuS'% pZj4ZUa dxW:wuX -xzQw<[I0E!tb3Ƥ'V)b&nTbBЛ]icN,rZ2֥(g,_dͦG8?j>/Z,Zn8ut>Qϰ/}br`cj8{6g{PGx>_sg\` U./(^Lt P/։SQ{:3wG0`f8пXepXo=A2Q%(҂\|)hgǞPOP FQ11hZq>õ M u8>ȪJo0G{fSZ8}5N9?яJe {LJӒ=`l=`CiZ-'%]u#ZJp6.Z|a%a4䍴 u7F#fƁt#tM`Zhqe9(B^ŷ6ƠG!£}/J]`,&(zƧ $zVsxpzrjASh*Gi0fu2CS9R 7.Mjkǖ; 8D0t;5Q_ZwMRn.̼ȫЅ`0nT]T;>jzBUTZe8O=JؾWei#Er  BG66~r mSJʲGh ޷sB 6gKFڵKl1]omi>B4*+6Lww&?*ܔX߹5vw2=V E;Q1XDP4>,_zKNG<|pWx0i84 =(sɝuk6ƠܟN*u#&H Pm^GCX8Ng4NMB150$^]?"Bt\OҮɻu@vs7LePq%{D5.bIPJKTx@7$a*$duVtLǧADHDhIL>h6l=N'Uc]RX- ߻m mmi7 k,蔸jhr]BдIB-w}K݀w;`:Ew)TĨHY;BE  %יqmK.#&5GO ) ֨, .5MdV#5`"PD")hW`Jłu]8|jj6a96=Z F j m(GM*D%cP'An$"r2e Rc -R)AzBB׿v N@z( ).S45%&Z"2P!*Y>KrJ:z٨B^ϑK 'ѐկ;x{Sl*taQV b]2#;p._$'nxH78Q,NʞEmw+TJ6, m,mvOhPR$Qd=\r}׾"[ZЂ17আ<%>$I+6K6Oh68Z3"uk|RK@9+PBaJ+pMj¦cl(CƉ*{ʮ@=| ; BM/1n]q*ka01po9!wW"אH$]hRBȶlI .&7KJ*cAef4, McMc[:EauSMMh֖j<'a\C O5ŌMIjj[kXlX8uzQ݀*k%u΅}Kw [}U<;{L/O( CLDQi56Nĵ({#)1us$ zkWpr9*#h[fz~=Loi]',W9o[h&oڹH}hp5*T'p92ÊQ^`3|uK0k w#snQ4&LH [PńR7RWp1o}0D-ZR-7:9eƌՈGs>{ ?m)eY_.OrͭuZst،.Z*OVӕױ.WHJkrwe%V ZǤu*R7H?-b}z"#D^#y17~ &d~Uх @%[hm,eL;}7^{ =xg'1>?_S]=E)ƴ/h{cye\.Vۖr@MaobZPu9 = < !dn+RUO%mGKJ 9bAwF' /zmԛU_wuGfr )O&hv>O ؽug_r:S՜&Sڦl؛y^pF>ϟg S`5alm$7ð>x$sw3CH(Tޱ]d0My`WiP\;4WniG]ٺ_U UXEٙ2a<SVUj"O3sUbZc4(i_ՒW<3&1GG'5W%>G/xf?|Ə{|{ߣm=+ ;foZbRz.*Ҳ]&Ԫ/n|Ѓ`6G;즁dsFVqSGm14}Awdj ;ӯzAK˻&!dIyNis~ow88=6Fp =cQ] wof4*Ǽկ>K=yx\W`o4ý~1_>s_\αVc7mEUymFァMvm[ƒ+TFѶ-Z[k!m\k G!zgOJ(ӻۻH0}b^T-_B0㘧Z1)u DO%9=٤u3Z(ePe$G%ҴSMJg`Xpy_{7xe7f,Z`2S ?e G4ӓ}kRͶ6~vYSާ }|?k-7yĬ|3+3ܕ]ufA (F`#^$f tQ2h6LS7iΑĠPrit>BS;.;& />@p-(V9W( C[ս 㝯hՊS&qggA`\_+bFGPk:j@t*{ݖɆ z$+Ǻ2yP#m_Ҳ\΁WpS5i^%5bϟF8?ȽجLQhGYkhޤ Z;NPo-~vӨ+t C7D8;TwDMO! A"K# .Rk9@H/&hRM`M)tFۭWKv&DkcK˪PeJǺZЄ 4M:#kPkh"ں?C%{{^'˳@O ޻/ t )MQ]IWvѸQK&4.eVq|xÆۜovI@Ř-:' ji4.Q*]@gh]$\!:ZhcPNƌ#ʉnVjX9(Xl6-mQ*PojzC9˷{X)lf$|CM =׉c7Te9`9?,[kmvbroc cǏFW ?ɺM%kxt$õF"4> ^`V#!ur: e`hZ a6cQm6\Hh٬ܻʑ&Ow49\~k =,]hty}WaN%I7F#_x=H!Om^1ױ`n1PЃBJm*JBEY V`KB0CĖ;҈Vsڶa4#x~vAYqv('h]R&U &gPZEϿ`T&2d(@HA cJ^okmJL]7N\͝:ZsqG *$ܼȯV ܥq_2cwЛz8:b5*'R)@ixZ>M&L,+rmcOWQ1p՗bPF^l8p6a9i[i7=rvr1^ pnT66ܼ2t3Lo絻;E ~w!rCF"n6}^I\^T]O,/ګDω#jY!2b/ΰeCh(Giq.`̈́۷^86y krxhM 9+F=v֎=M[ۊ^Tdd U5Ocd;6tt9ȥs>b?m8FO׆v~No9VTLʖ M: Ɉc}߮Fzz;۹nhC.gH-(stLBiTuKa'4SOG2O9::`٠M[>:dtbhe;ꆺZTeSTUY׀nB ZBh@S7>n{+wcumI)ȹ>zi;)n^#qa)9c >lqs!( Ĕ1S&S7OYlj8?8w|cx䥗1PSw'ox%Ɩ*EQmdvGeg@&Q]? !ޅk$-gWIwowU?B]7mͅ˻v%>#)cT=vjީY}lZ4ChOzګ+ZpDUU,UvE{hey1qph88cK.,/Ƽ}fGBRTX.TU/0lÀ,ӽ//ifPȢ׮"u-~tw{'VJԼn!fH5۾BsMs q.@w\ѱ:d]v0q|Cgw}$tMSHԵPLlfԕ g*sϨ񜞞kR eihd#>s꛼r GSX}CbSyjzsP-r\j[us{>[fJ8ĥax}竡 CEw׊ISgױWLw3!s򈦿U\;h4t=#Qyf%-2(AEO\ԍ}=ڶ kD)}D;bywO/x [j~L12ds $ą^nȝ)JFJQX=H!Q=BS7^oUA#9/^5t jؖk½7 4_<Ç6+fɭ³9vRX/[3s˧ܿgo8P鑺ӝ}Zn{AK aӦi@Q 9t$0LȺ{jcҍ|wʜTj /3>"IN ss&t{%1pxr%WA1>|LqdftW^{ɸpՆ'}6#0 WhXX͟P&bC32<;oFsQ/5x9iښ9(EmhDA P^ m |$ Q4yܾ7VJwYͭ:YKTuNp%hؼema`,ǖkOV7|~}̄~Jt2#4s3bYsz>F&/~xl|˧L'ZM2&xY,Z zL9c:Ьkˊֶ/||A9~]>z P5-#Z'rBb mm $v:P, O4IZM4ƌcVV!2]?6Ũ5. YBp_Wn]Qt:8$T΍*pprVO#ܘOZo5E~Y-VܿwQMAG0p1/ ''Nz'L垕Y+P@a{7HJTG#RFRH/|c{li$4(M4ƎB Wy|8Y @DH)R/O xI̟;ǩ^ds{;̨)A?Q6͕>;v -Lq!vb f\/ c$WWo F>&;N#]DYiYg?ym',&yY0cǫ9bעܙs+@(W| zCNh-Op a+<\TB G)BG5' k2;4 T&AY|+"tVX_ TlR!i8)*V9V:@+qRu٘J걁T_,HhL&GڱVbF?2'G8Rzs+ո?ϒMF~4 aZ!j u<_߇,*>_(d ePkAJMb%) '(<`RD0[,mP:YT?==46$N961:?H@ FYlO7«_edgh18;m5f4s{]J 0egm2 c.l|U>~S/ )d# #Gч0,˫82ukEz<뷟D9%5 ٘.\RsbLެzԊԚOqĚV8.:Ϡ٘}Ng[$^cku n#G^fu+&$1ΫmjRP)Whڄɭ\B@9qtNO2LLFv4~׿d\Ġk%fYcӥ>`fFi擬Oő i؜H I  /S11X)$t)jp LwS U6O26WhCY2р@):;[,=)4 XzfHFIƣ5WAWS'G(@d q3R(}DLMrLjPuR͋ 8N3i i3\&'b?Bxڸ"#&5c+`?&%DmڇC`sy5 Tf'i!p'kMAcj`1n.B@Y]FhəV9$Xfgh˸&cGhkK+&iwdKk P663ssԦɆaH K%P$q#iBZȫsEP*EqWb|@46sd~|{Z{yu]u5LZk>c>A;dk8EIh3j E[L2Ӳ,. )ի,op1!s(O4eKGNkovCQd*WDFs83vq-GS"S o;\$'kMT% #6V3Ua9CdP =Q#dl IJ^@OCO?OVK:z4X|2~J[)PJ(9 (k.Ҩ.0;q@Ըmm6,Tg"vo%LUxZaLJgwOj|c:% C:.߼Co&}1׉S(L 3Jb2ih6'h֛z $ Esy/ᥛؘLJ"Lkvxt :79d0q}67Vo3CJkXDUMff.IR:߯3Oӵ%ǧM}0'Z~=p36*t,'Ve=M\J@ynp%n1܃z哤 %/8QĤ/iorV`[/=MT6vXir~j,E(h=٠R+sH(0eiB۷q]SJhg5D.)0}h)v67Xʡ3-Vn/RT^|č1]N, EhLd]za$)K4h~'۝pC<"bH:Wd'Dsc>W1$iJP* 1V4s׾c@A &\6`,KIb8Md)t@'@*M!18pp"p5RzwqJߡ.T *vLZ.sS @2 Lh k+>^ S8aNC$\#R&O#B5ʵ&r'KO83+gѺ~W{±x(zʤ :=t汽c2 ^ =0cuv9ssF}>R ǚbҟ8Np=MĤ&aJ!t識s41+Ƥc3e:HG8VsЁ)Ial_y t:s ~J{86Y"U#efɓ'mL桊M4#]m趢<,q̛,(EvZLK>_ӄK")8ă(̣;wj/Ḽ{wЮfuundNsrް.Kk<}b{ ϹDklYѨx$cPR5z턡3E.3ufa\ehǭ]2e>4`399MCjA I! ah1u=#IS27(VH"}Rc!͇d_od6Z8O OxA y@%0ֹ1['S#"high(7Hq鹓.iu@:HU@I7WDy ' h90{+ ѹk2DǡOkW鱚g)8RМy *D|C~{n_/>+lݽ-V*=I'lkBt!I4Vhkl DFP,k4fgתvڴ:16b֍%RIfRZ0q#Q`Q.~fwa-Jڽql(T0#FขgnzHvT}g#>QT/d~(5?b{{%u{WY[ƽN&A1$$  kSbe) ܂`>)xL,TO!N m%~wn>av_{i6I~g)I٦488cc#&OiJAaq}x*ODaLR RkhJ&#!;CCC}N7Q (8~voE8HFA{H8 ҐM;'4&,`IEc4h6Ncog,~oȳys(ѦZ&)HbyHQcLNo&M1cUт:5Z (dž檓XO)!usH$2`"?߿u\ʀSss7V:,7 ᠅ `o0`mu3(JJGm^4YȊAUl r ,2$vzDfyIPǚp˜`DQǑ](=րhW(U!y  ){;tKׯqdlgjąs|s/WQ 7nqg4.eAS d6uRoWA{^^G_mŽz"6hsdT"D6o6/LHgr@N<eax/]f2%s0)z3SӬolR =Lu;GxZ1D!h` QVdkUt("}<&)Q'j;d&;6~7GQP4ԫ4$5Q8㦯BPFq L;jjwn,s哜8=OIv66p?tIܹͨ[K1/>i܆`Z =O2qU'؃7~۰Yz0-QZM]NqY 9^9w3`u717@d`%hg4P(FfhG܂nAj8e ÐJɥxIW8^]Z>O9z6(3GC&eN>#n߽p/WxݎFFAlI2(HgD֎u簸QI#sa %Zy}*A T'="An߯3UZWߏ?4f9QmұS;N\>t0y|pkU$aHF(!ynL}XLPPiw {DYT(eԥMh@$&?n QDirpq D!INt]vcvv9tdt٩2YҥXrcſd(fcZl9Ji2+$FQ(I  ~0 "_,qno| 2z161ڱ=M IdVR3H;5W9wS)M+u^4F=d/Lԑ |Rrv nʹ1=р$Ez PHo>IȬ!\\t. Al x^I jҥ"5ʤ"biw8 |!PM2C5)Ć;D ٳ3y]VG堐,8c8G}4hl 'N&f94[Jy~K?+Qƣ5\vz;l,? 0TkU "Ū(J+ym q\< ,g"K;R,Ȥ  fW_}?O]arf ?gem8VqQ\/a <9V#~M.Rz<{,kkpUF!NY5)$K1)((iI 2 M65dQx8y (&%S!<f$?䁅( Jbd%.8֐hI7)bv0ܹ;osmן]?wjA_d{m=,R;7n'Ưay&iNWyÍ <ܹE0)3s6Qfk;dyGK8Z x1͌1)}iBb n8xʡJ!EF*2%qЮF2pF$J!+-VWtQxʙXL! x >q8b.r #$!`>A  "a)uY L"fNe,'yx{񵯱pnh=YeabnH0?N'd)i0Ỉc(KꅄI_h{5L*0inJ2ƀؐXA!(bNMl2R8'qco=!zCX|f_{g/D݂ fe?|ͷʅYtN%fzmsT G9TpOKPaKNFT$ b0J\#LJ{w-2a2AI7lRUlmR.O> H)6ʈGRᰍyLDe$vY&04lvzڲ1cX_$3.xHQE2KyoRdb+w o1=Yㄽ=Mѥ<~/ܳtzklvQzfxO:a+J_Qox~J?'(H& '[߻N~//yN>^:3@mv#~ExWeΜ:C]6R+4 S+0(NFl-n(I3F'X8| 71ķ߼?}C8uSg\_c/sEFF=6o֝5^~s,4;IwK& [8=KD93X#ɯ|X`DTG؏p3EE6Ȳʡ GFQv=c}I$5tH*#aP8ڐ7,%dFP72TBCWQ {{m~> _Ya5NH]_fvi-/S,a8 ewok8|t\8%jn^޼ė^"_emӇìDcKܺUG2٣R˝4gKWz.5?}]F"c<2'2ߺKcQm 3A E+ģ*( IDAT݌ ^zylPq}?_(*zZMT.9uK6F!F -[k4f&0u8*hQw |NDdJf0D*7˸Xl8$3Y% 25ZhEs쭵x$½Gq&ګ\s# ,>4[,oɉ<;OيP>Il!͸@cAcFs +XQѨ›?CÅ,Kc3gO#\K?ǝ[#d*dem ;=ȃ͓%lpvJ<{3>쬴 |WcENM5[cvr[gnYcȀdCXh6t%3i\#11chHPcЏ1aFB%xȨ;$&,EJ&#G2Ck@')*5V;.Y+E!A/9z)Ks"WQ?`ۣ15OcFm>_arzV0hp)MVW6+v;_7)j.SNS>;|;Џ){z$N.b R׉~zܺy'U R̸y_\v2{`>kTj\DsnSgN! Ȣ.^^Ro.rxJ@$It/L(7 ߻Gh!#MvVKtȡA´ NP%L4AgŘ#PhR2HJ.%˒MFwyŬg˃>d\ǝu%blBT*0qO64d_h d&C<K# (TH#XHԎγ7 Orwk!KYz³/$2kYhGcgc WѐfmZmJ^qbe7$'f8x_Kot#vvv9r(RK~!,>{iLK2ۛ=>S,:Ńk)76)VD )ZBD6_w9}B6&޻yG{[D!kyTe/ dI̗1~Έ!mAV)\"OMY[ ;~/xr@B'c3X),U lB:aZ.r0&0R O$QiI0A]*3r,6 n 7osw lt SΝGr";dqoΞj075E+ʣ%ڻۜ<02SXeU:-8vhhGWϽ vrMFQ/]:dn'᭟6GLq"tC揝ƭ{!ν@l,Nol1;;.Vge}M0:v|szf antJP跺BnCV%LS2WD{6;"SO VaʭTf7Qx'=s*h ?~Dc(x,XJbH|N2 3aQLgA; Ns=58'N:n/k:זS/".T6}VJ8"^QH(*1iB2 c%*1,0Y]1Dn]cSNSxs { ؔ3h4&HLH>O66k+-Ngoa B9Өse6 '8xs1hw:hWs+;oï~W_8K < Kw0SopamST :a\* gOSX^yړ>3S춸y J lPP@++x'0%HQʌ.),r?~/C}f p+ǧU΀/^xAOɓ?eQ\.·1y0GNĹSY޻qJp0b:IN𵏒 ØjqQHǧT,*nߺ^m?_ӏW߰+>W ǎ"Kb6X_ J"gO10S(LquVWu/` ]e{So\xY')7ߺʹgO0wMD`!'u ^}9&x"%c١Y/k?yj*N]olʠ㫗xwhXΟ?Ư}un_4g'j 6LRk龾> 7b+vQB)$%YdGŒ'yI9I!>)α}WYTdv$@$@tl_l3;>y{,LD])!'5 5MO`~zͣ X86mnWmzz BOn|N߱z{hTLNy烏qi},̢bȧ,* bꈪUTT"h6"d" jɷRF'hC\`#jDu4H#(bbS' QA$G,"HF=l6#}HRXF4cecH"iW{ t^Ήj}HbVVhJ͌1?ÿD-ЫDtl,. YBr$g{xg0$ܻm.fDZ+"#6* zz?2ԔURf7^a9|ğ5"e8~ -anme8V-d-2 '?9f3z`7pI|78;03?g}c ezz3QzzT(TRj;ۇO X:TJZFgΣ5\.NAUQ#FRFMJs xΞ8N.i%Js _^\_Yeae?^Fa6(dK%2Kح˯$4:'"bEG(4FWh³jl2^/dp2:F1 :mpC9#F{W7G4lA^!Kg,֫b z]DC*#V.i)e=ayj̈́ Jxg25^{#cT"x@8VI<;5 :[^Ln{;.ۿᰗ\z)M_|p?ć7n i5)4+bhH4MDB"&'ie9tĵX}݇ ;= \-JTBL'ޅd!ko~(\c8NbhAW[ǯ{9ZyVW6+4|ѧzXXZP*Hĵ/>ƭ]d 1rHՃiFQ!(4E#y6wpLNy `6I+\6Q~7Pf. E4TiO*b iY DY+'α(?5T*Hib!j;bj G%9{r!lF%Yn:݄d+eVW_"OϳMQ_W$9&+z~;DBiN2Bd6)A(W-V*4RlYG Wfu=J.W9o|2&wdԡRkx&#ӽCkqjFVQU۵LL 3}$V[' s˴8Z4KhjVwpPQEclorbj?HR#LpI64L݂Ղ&YK"$V g?D2#SX˝9/"RF 'pjkITT)M Va.SS,lPQ:ϗK+ܞZVݡbAh1p8m}>R-rDx76qU$~\6l.bTBgx2$=#ܻ@*f|xGX-8JhuѨlU4 ~p"=P#Ju YQ l {ۂZ/O̙t&d*ݍh◟"7{>?sr T>RJwr!A"-aК72;W[4JOkGn/d A7x^-*P(JCks-P*$ ۰yG\bD.&W.Rt:gfdLb1FFU"4, vH{z uo+kCf71<:T˗NZݼa0rYv-|Q$M?ݝ.džXZ^ 63B{B>D*qLVf7Q,U8;(Uj5A6'F0ꕘ DB8R adrcvg`b_fRAgБYy^x$RZLKN"f-[ƒ_jtO((PXb(vnFYB!!$YD*[Cdyq Ijh.ʇ}L1 an#QR?F!9L±v~S/"a~ˆBCNAD\*U:FgW^ckc@ωKVppZ317UL6|ăѨ)j[]-ʲ  {tasC*(qoVDrrtwQ'/I%eGb9,'Z?bbx,I'CN&T+nX) WHq:lmЬ6tw½;; 7ExO7$Oai{ R`K1P@QSަ'VLS3|~MQǿO0LN rvJE}tN3׍TRV͢WQ), Z%LQKo\J:~Rui|ykխ8|u{/sCfv}diǫ,<8@%3Ie7%,nha=_IоmD".MSAWP"o`ai}^or}{ .^3Z?t)m*N SSmS.$(Y1LHYJ^&Z6L lih`3~`K/g?2o?_rvx-£Y]}/c~v6X*LJVCQ1I%Lv rx6Hų p"TFoP.fNR(.Q1d e*=BVL`VYZ ֛; yOj ~𣟓_ N>`ljy|~t.M(ˏ#Z nNIh*G)ish׾ [L$" 2>6lyFG(%@fF6󳴰RjF&xxD.K|ߐ&~|u&#ghkTr,J)BQJTGAh2&ywȟ;pB7G[T(zLR"7X^- zhlv*;Inz=lzYoF@^ajj^~|eJ([z_ޘx.a64?FcD$)LiǦQŴ8GwIT*8;18Q>MSn\a DPD$161@,o1jIמ?Alsfrl2K0F6Ջ/[HbG>viS{!/ostRDDH&`bhMC&ENRݤbQ m>/<'ܸKzt t!Z@>y\ZR*P.(W+ .\>Mp+SWNM*kL {w0itleaCȷZKROs9L6W7y%xx@E*&À@8*|AIR$c< cl8r_;[9őOOG'&ʓ5Hf-(u"}Glo3h uC#tvu")d EL.OTd`YH3\z2l&#)`P˛hU*&'Orlk\kL ˧om(%V(-F ΎA[%WmW:H҈'\\)7@P`f:xvF\t:R)l!X )XH&P ijeVvΑ/isH"nIgjgNvO,4(ITj;{]㳻!.Jl=RVbqQHbVGN.~\%#Ͽt2:f揸ta\2˃+hF&uIţ$ TM-tJ!Ca'iƗ7,-a1ɥ8-v kS( tVE|$Ύ^'|| H Z |b~ q@"*HhGg E 8j`ٕ=̞cy7)U 8/&B*Ve1I9?B.cV\JX`.ᥨ7!\9dquoF=*f FOoj8<-YƹZWe}w5Rs3\Y?I6КT\6Sk TA]MhL\D=fAPPVZQg8v].X][E$ }aB,ba2U_?Rt3w {a!)o՘QiL"'DLcL}2ˏ4M Qz. 0vPdֳP)%31ȣ5Xx3t␏?xaG4O:Дͩ3'qv^F<١"HPⷞ{v:-vg ;ܾC,@$+6E6Xܸ;QH-EibYwPמ*d^\VpsMFpyfY[#vchdL dyEZk衻m/MQN3D3"yx{kDH L*mXtJ2>FAg8wvV;qm'7}?7q9z8>2KE bܹ%bD4Ӯ嗞3'晋)C 9 G#DMw2Os|۸m?`ue@-)QIx`<5M(K+9zٹR2dW_9ʼnnR#GTZPx)\*EVN0j2Ⱛ5Ҙ 3Fތłnl5#UHƳVZsoO:uF.ifyWa߿GΟclbۿbiqt&ŃC&ܽl TLYkX}lF$l.CR:&BӨ`R()%㤣>{臯sjbBW~'¢Q"xa⠜.2s.--Dl"Th >ѣij>QC:BҨ+)3L;K+ Tr%-#2nHhQiS($e ,llmr{hzr =l3%_,Dȫx")?J EI +9=j4D#%rzbOMxײL HD"\v'd2i5VK`ޏD]gl8w~*R JYj2[`p`gfv&&_'zA=qb[=D#q(e\ {KA]g_!Сjw9 KH3zV$zC_P.,Z [[mV"1Fq1w/_,U]XHTh}m*"$eFDkK+fn1b6Q$Mnr@2R(6(tvW%C;n`S(YXo/)/ e]G)O]8ˇ{{LOMo+v7xlj'O1s3nѧQi2B JN<.U1ȵT D'bDQ,xGZ =R kwdy*m:# :Qj\;ԕa pHYs  gAMA|Q cHRMz%u0`:o_F$IDATxb?( F`dM#h FĂKq( 3a#XĆ,5e$bHΥeQ(,t  >0p ߟhϟϟ?}#>}~s}=d@1љ3yXm\=߿%=¯W @Zg_/#X ~ω?~. a1KJ I8‑'܏ 3(x 0Z0a`E6>˘٠ /xߓg6Rb;X,h($p$t K$03,e/; _2~O?~@_ `?l`1feE@߿}9o DK xP% ˌ8c$҅fpAM}w߿(E?@ hP& x`Bt~{o |.^Y B,1 *483W;s@?o^fP} ~FwHE:,(w4Q"A%+,!#%Z ߳?}tw^"%?]= SG|zrP?~a7k /2'` )ꁑ)ک&X|&P"`@M 0;߿Oqg&A R5 C7{%e5@Eo` bx!vw9vPNH'"1KD-@إ|~󗎄O@ Ư8J&9fS33k͟7 QO1 5`}PvN!PB*lXrxb;`D Mt`@ݹ|bsA_9 ώ0=G:+$8!KPB`% hcX-|笠'AhBA4 \gW bc?~P׏n`Pxs~(E<A,,ȇ?z{ϧЄ\u z'PgʫĒ>dxٓ 61ͰXFV6p_6|ZR~h?Zx z&Vyew 70<ܿC7 &"m@~ϟ|VPJ;@+0-3Xl}6s= 0(pH;j>k?h"U@#MxEv ~ex\O9|s=1~gڙA#X8yw /_#=s>E# @ʠ4Y~n3JIDw ļE&ܼ»~g/>3>|g&0{tF>pP7T 20a22*03U 1h܄-DU s>( mf3p}7{vu ff`bf4\C_2~MCh"|4 T@{5 a@HL5;}C"AlNV~7E|%ب!f"xß$XODޞu?|_~fx ,Au6x9x}ف95g>,iOnJd0vaGJ_(Ix j& c' `C] ov ȇE@MK|P"%P Xz/ }?̬? /r,Z *EJ`x;9F Uo e%J'e8"%@QzI0k6h݇7Wke#^w@"9VX{4[P 1%7.gr a ZOpk~`|P1/ @ .܉:@U33$|@= JޗQ4Zdۯ` b7]7ܦU{@ 3 TT%# [Mt"9>4>m._.?_enPE>@$%Nn'R eĐ 8IDI`rfeO?u>hA`bzbP܃6 J,,Xfc`ndb(F>/U@~)y?i0hg ?ot>*L f L hU) @& Q?|/ &Pwo>?v* *%_`UJzDnA ;@CAVp:PDK,/ lzB#R IL3["sGsEy{Or#&Xϔ! 䁖DDFga_//88hrP,0!%`̋33x@#R HML>1ӜYa˸A>?Жl0`pQ 'x)i 32xAs>7)@1yw@V~6@c˼0hy1(wKlRA>ZpAi@}#@=@E`JذcFĘ0cdp|.(&8.@L$~f~P6)j, A6?Ir vF"X)@`t HI,,l7A%(!~p {p[P{ ,H`bp|Njg)@&&;VeA?G^O 5H#8XP.R)+[4$_mN4a-Ġ xB@XجA?JiR4 Zo 9`T pk 1 Ⱦa'vȍH^=b(BE4pUDTsu`A(WR+%vȐPuP %piaDz;`d/wFmD@f :#4 8h? # Frga4#Ra&j  Z~3ɀ~As_s hWH~(a9!l@W@sc̀6]Dch 3l׀@1s ڂѬ`(LjJ$|2r?FC % ,cԁ_hS&$e@1d @)P`$ *A%7tX/뿌.!hTf@A)@g5G_#|b| 0@ILPb/)"'@Lc,2P@API02 JQ /$FIB(o߀@43# Жl~5$%d:@ LFhW *1Dp4>}7 Wd.+PJb!+OwEb ]E5b?3Ļ]gs1(8?fBJ( JĀF 1Fqu?+.C3#<|д A.Ԁ& H q@3D48Ŧ0$Jt񣈏 f~g(aEV䣃E5Ti E %)@Qx Cv7IfPiR ' @USfQi@?=^D &b $ew*4@Jr =Xs(%@Lbk.E5+vqa( @x%(J)p>VPK>+D9jY` IZeA:mqj &8>J$K䣴P[=@r(춂(R`` @@L JUG!O&xa0n4/fO~#gz?!@1J2&PDP;meS!5p%?o;"# FFA+>(z΁)@s ?× Xr?J 됮 ' :xWcJ41T5_* $"xl-x3@Eb.4yDjxK~ %_o~ HC2T%ѫ-@L_MG>ƵD|? 6Nh#.z/7Q 7gA@OĠUT-?n# DJ8 @ߟ4DᝂFa.8b {@ otIPqXVݕ?w. 0@W|<w(mă4-hz:^0~PZf ʓ?g`#H&Z@  B#0Ϳxtgl* DX"1+RR AJ!e`Xc\  !}](Z&x @]7)13/2qPbGK_ >"_ 8n! B րӾ ~oeg؄@n ?ڿ>/_`"5_z8~P"`g0m$_!X;H>jHOT"g{8'eߦ>|ݞ|( s?(D4>`w|GX~_H @$Aejm&wn@K? 2z=>~sٖJcX #6@{@/ʁSDa- F(瓚a>No1 KI @$P@*/_W߸@UQ`">[ y<O!04<D|ò L$u@h[ pڟߠQ? (=#A r[ּzaI1#2r> I"'d~T_@śǶuK34?C3_b~ Jr?tWt2bq"-KR(AуadX $]("(C2;%1;,/χz!w_/a;(%:g t- /4XW)wvi[`VA?G*a~@s{ ~ o~Xr"@J /'$^U/$p,C"GOA tMEk, L1|5a#}bR·5H'DkS`MLbEJrLܜ 2Ldΰꐮ@}/=E/q%qDr@Q; 4 %І8,H}u@NF>F w:W[3@"LqV.li\ \*a m >~ZD hV/7"QE>zUw?Pw"PGND-@18k0&r 1j^FfIцV L4 #IxȾ}PC?S`ajͮP7s’?RZcKDء)Q>,D,&sv1>&!"#:E=rănCVgx2wbV9O>U"9r"`F:4!0R#UfX4F N`i, aUy>~_-GR9Y Z M"g@9>6գJ#'G@R"j=؍ڈ%IXf"?/* /* (* H'5hl 2ص- G<߼{EcM|P+{L[5!tXÎRtP74AT惺tPvP?v=ТY}V>l.V.;@ T@`]E.8|%Z3euf4F+P ؁U' 1v+%ZfPb`z l/4@NAso ZD`QG0IENDB`nabi-1.0.0/themes/Onion/0000755000175000017500000000000012100712170011760 500000000000000nabi-1.0.0/themes/Onion/README0000644000175000017500000000007111655153252012574 00000000000000 theme by onion from ROK nabi-1.0.0/themes/Onion/english.png0000644000175000017500000007502111655153252014062 00000000000000PNG  IHDRL\ pHYs  gAMA|Q cHRMz%u0`:o_FyIDATxb` h 0@,5Axwf  V/XE-xόòL׌t:OLD)%d1m{1$dsA]SCb-aJ?C-=3C3f8NUU}_%`n (>zǤ UY!L&9%hhQPDQ%<YX~E,Ub.RR+>{_ab}>uM1vn]F*Qù,K]} 'vd˶=ZC^:x @"$K1˕Wgџ ( `bjɈ# gkwM)}r֑O|tq"Ҳ,L3jycquS޶ cFU3]Û "bD+T!l#Br8`Ghu㼞pW;Y[tLs3)Lyta=9w @B6Qt ^kKg Bgp=XJS{&ϙZɷy'gu}mSs!Ed8*WhKW,1nLþ,w~~pC>2Q9ޕ}{J_Mئ5Fg1Z1IڜY¼o%cɉOQ-' J8e4c4汊QwbDtvjb_"pA @h2BΥZ[?L=wR$B2uyO&6M7֍|#Ω:]1u-Ör_PRsq LRԨB jH,VэM@[5.^&|l[F쭑;0c,]H@CnVE1%"j)0iv/H.6'2׌rz x R QTq2>Yapa;$fy\WaL؂/|Y[8hgb"#;fLًtbYs08nBiR]%ѹץ3* Ε{i=#䇡 &jWŊF1۶IPNC~SҮ#`%B'L%80 AO"(AE4&ig[q6ccvΓI~[W_1\6-[G )%S =1ǹ9,190u\wЂUU(d9Mh{l#q_MCF,p}rg\2_Vl2>dJmtݡ-lH{2iZs>+2?-q.E5 àULA.l+PB #`4J-+OhA j)T!vf^uufk0FDz/FiU@{`&s#Ug:OQܮ׺ڶDF)(8O2<-$Y;oyP YX?jNi&v1Lm#Z 3w>_p"9F"6 a]?C-V$n]O'zQ q;-) ZxLpbfd1,*բ8T-t c CQ-jbC C TĀ0&Ҿ9P;M ЗyQ@g&)0V|.E *V xQHFx SV# .<~L` ^@ca9 OxNb{N)(aخm۾.7gmLd123gzt/C!7M *$ .HN -Dғ GŐd/,HCB u`YN0` . dA.9 7̀1%{ctҐƒK՝rs1N e^~ 9#a`fȢȰGO Xm:s>pN\J*h>' {_P/m=FAnNXקd !H;lߦfļoX3'1 >WBDS{W\; kTCkI^bW V0BUG`u $ (L# +vfggm9,SjQjtm+sxP}(G; Cu,s/xB#ͯi[ _W?J"I6#ħ7NO|$jS2F9t6`1f>if` IΗI<]9UXFE*4m4zI /e N~ *|SOdA 8hX$Qn (*Q@w׫tATuOs{rNCmHƉԷ/l: p#Nr|!4P.Ҕo7|*+|_}u;X],X%tUl7WŪ|t#GckmM0P N@ŹpZYEJX~h^`1^{Ҋ=Vۉms:p}(0_Cs=ܼƈ2 =# 沂 ao.}lӅZ"EoO.D\| !F,MdĠسѐ2૪X{326RN]u@Q}̺ Uج8aY6tKlq Za^HYÿ܇JpCir"1nj|Hq(6MbY5u@$ ŵ/g)r?/L0^@Hhm R jx[/p l(*MS c*bC`Pm5 %fH=E_W@ӱ8>@\aFXNM\ZlO}h~[> јe*te; -5q EOUy<RSuM+MXlH &g4a(J R@k_E&C(`Ұw; 5ú8ybΫCm8O5r-3 |;ƾ0f?l1B#a|4 #WM1VRRz#'Gcʥe|j)%}Xݨ3v"X$~%yδB*6Y У㓳p$[6rb pxsKͮ фK܄i @& Qԏ$y*T;ĢEOϵU=s> LY|8^NiV {,6hעͺQޒAD~8 㘶eyk1`,/\(@$nN%+mcqh;X4+TJ]aɻLkd<SKh߄2?1./Wt-OxT] G9Cډ @ CA|DR[1](){f?*Ygsga$0 LtJᰀ(mZpͬMG(5;Llb99RO[탊A)]p."L4l( R3 /ݨq\{\sgQ;49ߔSJ}9qpvәޖr'8E\)cjv,`F Au*XF 24Ђq}02x??>/K%, &y)Ib7SػJdI4/ tƞszy;`JBWA6= .U7;']kۮ xY'Qf0 C$CeJe"*0¾i9~G)Lӗ/xkK)>T<f )(:{62DTB06( *,Cmr}`c &]0_Y)e\XWm{ {SJ&}0=L:4tOK/ 4 A8ӤuZ  (p(UP{(juF|3S"Ps&~īS;4gOև HUpw/xp ,|Suo7y >? c\8&"MLS*YS)L[wҥ6ӺYD:W VLuy&׍ިuK-H:KvE3 𦸿6@MqZ:OvL?VϏ3dۻv٨mW828GaPϘWIEE/78qb|рc? @0APB5Ld7`rRDōz:=MXEE=JY9 %o !0JmB(cX7 𴶭ǥN8FiK(E?w"yzo1!4\=,$қCc^>JZ⽪Һ6!wߣiii r0{)T\jX;KJnV-]2B1X3)}a4cձ傇u[k+Q沛0 Q84-%t%)e]!"NMX33>!홓1 a5{P7eY(LMJ*`S;yv<ޅI\m]Y#!.NFF؃1Z$[Ou]c2@b׾ "Ƅ8e'0 Kgb܁a05f<8h+QQA! R/&%XAWvy3;((xA2f X s*[Mea,_p8?X,2}DϦˮ8< d?kj4+X䭐9:kjk1wg 홦yvV*.RPe5HrY)1m|r|UUB3 Б0ɻ(:I>on~!3oFjmf \z j\Ɖ7*BBGq)zwYϿ'L_޷~yvJㆎ# _: ^d~G743?]D#[w:s;Cb>=VdYPmi,:"EIlq WKGoo (1=NKuqR.+A1*D,<:klGE3qw3@..OMl}N=3GkK);>)wB?{6_hba(@ 82ᦋX :T\{ao;ݻtcU% ?oYM(L2ZZ)B4ݪB3c"s+ ˱,I ;ʒ:!F+mH =)p՞zڶ'ctO'˕rwx#HUtADRXf#a>#ʎ eU9 >C0bL&2f:j 4 CјĮRZ l o`gmڎ͹Ē!s|+lVt)ODA&{oE.Xz{bȝ:f#SQ:ګFa2Cvw(ꢍ4:%ˣE߿w}?f:,QkMVpBPE]b,=3N^p,;ʃ&Mj9}wgg!!(Vo/ht L[*KX(FDZ @\SA }(z?'{PHhf۝&,APKzD1 57JA+`0IQAjEv^9$hc9Z񹍱4LuWE|#MӞj2~EwCiE7hvS폨>W#`>4 2cpSbMCHn:LT ˲u]G+%r.[`?Cٜ}\v Qy̫Rw+_e-{X Ji6c~#j<۰.-셝Ɗ-X5ѺvSbHĮ~9 澍p{:チ~~ȸcC/ 8,+T%j~s PMz{~yupyfѓB , AjlSށwfkwiX-XU7Itg3GI5X/* (ǗX)^ȡ,Kc %YBX+j#[y;'Vӂ Du7 ׃Av;x.D) hHițAv߼Y:B"!qN&*`>%A᫘4gH)YH[)1`+l(V2M3# |cTY{@lv?Z ʅܹ.y&(麾m!wΧ#m{_P"F7͵n}?~1T9-U;.O9`KC: hs@so({\o~WϾ뺪Y{m 4P ^i\X<<¼{{g d@Uh|]vL 6Ь}'wateR+}]}rbǸMRdG Ath\|\N\`ƅ j^03zĭ4]8|Bz:+ɂNҘi, % )f4Hk IP;b} ]dCD r3i_?c4vkg,6 HH}X6$isyE9W,`=,-^,K ؊9k|fPUꟿjZh>K"bm޻ zn6d|ҋ!3f޻<\(Kn,qCtQdXOd(S'HIVUGEZA/B!Kgr ܐ7^[m'a&O We)&\ye)(.dō~Hi;(—r ;LZTV| n6s&*P&-0l: FӼ0uݹ6h6b,q|xf biph@Q}X\i RMZ"k說0*\H o3RsNrr32JѴm%;@TW=Ĩ"*moJL<ȉC:-׈$a@PHih)<*MG;>s,g"mk(t9ADB+ܭ;=4{ $DKƸsUl ؐ* 7oΛ7oe}Z',4bB- ضT-1Q*X5 d29c\̀˵ }oQ.2}7:lG1}Ŭ/܌~&'`< Mٶ 4g)L ;\|;%ⅅIz O)%gvņ 16臻U]\6 &[K/s?lڰ%okA%}$ 73 &4jpv#KƱw{0 w/G=8XP>*Fy(8%UhϠ{@l @?V,f =PŃm鐢޲'/w}to:^/^Ngρ kd VMBUm7;h. b9F(q<`$މq_GI?Rͼd[&(ȁLtf `UGeA*E!)G~ïp 0jHԣ7Pevfv!Ak3iȗ=.b˛eޒ]J$[JӃi,K/+)c/V{ hZ\x(v{-Bp>_UJѰŀ##j!2 3ZWuыWU1 1s"iA3yS<$'c0TsS_a(\J8q\1о$am~x 7ɲ=;O:[n[ 2Υ4PК2$Y@|:0iֆ4CMq,XڮL6fF(c !c&XL8tbX^y[׋w|WV_GAi,yNd{~yj iTiPn!˫^ٔ)"ĝ܏ ;"g}o8h׽d %0˲?%;e+i{.P @ `ӡ2( o p(kzۥ_*iu]w,SU-Ǽ^BJ}lPAB(8L^u(3R `r4_[i\ a hBW:_.jc)&ۮL1t2`L` i!CJT!'Sj T -Y 2IZ/I)aC_lk¥r&b:Mr|lٖSlXې{݀˞y fT@rdXTNF;:aE(2  A?ѵ:Vͪ,Pyctx }Nj^TܥEAhio.Y,yYƮ4ZXaȃw]>u9{yՙ-@ڌ4lOh "Fbi.cgp4]4=£T1Ȥ3=!$"Jt8u-S; und?m8Q&‚ {x /@hBg-ZYm&3f˄ݷ6I'8y袙a(B(A#"%) cL".˓E3+\'3' X`)9l@d,FM(+D_{/D:d;ҹ"W!IY28 7 F~ރ+ɾ!ˀdJ@;N&cDPK)]y|'-t')h~z΄1 37~̹ po,MX*|NiGG*iAnhҔtبZ ʾAis;ެ᯻dFϳ} );DC}ڛ,xtХl'U@g0%׀v=E >2TnV_$5&rchh"׷IQ&'@ƥPF}K1XeCLЙyIY= DQeu UE-РH . >Z4s|0ɎY`q>o иbӮK|:6 J;%msϡu/ߗVuLZzN=l6T½~jM'7[k;|8QBX0 WBVqfU\]xT߲ ґM,ϧv9+H86 Fa AnY($ @Jy(NRzaφ-f0 DaǦ%ADAT-PH[%t{DmMgp߀ĎY}7 Gg(7y W][) eP4m?7"~8_"7EH. |!zXAb:`6ӱ&lH|@K%""H'W w0|>}^۽{*8x")#Npd9ӆJl-t'k-*v$K uPe@C]{xO&-MWb,gbgqColx6xP_ a6~";Ds7 PDOVPٙzB&3SP?R *y0 dexkoY 060UIs#qg񀗏bj7\+p@ Ġ8y߿ɰw]7I3]mga3XuDqYУQ&-Q$#Ě"-d 8q-+ AP'1 {YV/w/ ^?!',{!yFyL骩/=, P!c1y݃$&l]zJdz4~88|2'PknIms;SWGUU`XTA?_ȮW4춛w NtJf \䵵sp$ oN]uMAd=c$6!0'8%zZ Jp?f H][рl\1@ j@C"3iam+jAeIBY.cfvwߨ0z: dpk{|DE_rDTKSytpD_%n]/UU\G8ey/CKj?OU<_-& Ѣ8uTk2&3. b 1uolI z>sHĻ֗v(\}!Mg7\^T xKd听j ߌc,H1`x7vcժ4GAX|Ǎ+mTyp9SJu u @ǵ -EE)<E/7BA(Ԙt{v!d2t yQ!Ip9g {G "n4?JR(d=<=g*q [$x:_S@6'2㨛ͿwA8@1Ļf,'xXw|Wk0 rA 1`ؓ>WrsCGcRY4l\N0f[-`Yv'Dl9ݗ0kz4n$ XZ1Lzuf8W#c(__H[["C{Ҷ2_L+ 5mWVj{{E$5Yr`6tdAU~ez󘽫 #*?>;kTlUeHEyֻ;ɿy~u}ILcb2QCW2b(8?0x>Y}XeLHrP><ǤWm*fS6b[β`4 jy;mgo@ova(Zb.~~ɡt\ RIT1zNB> $$s=unT¹B%-ӃC՘9S0GLyn7@0W@ֆV'(P{Z9}ɐir4Lݴq$fgɋ2*Q[/+^a㰷ۼENB^,?59M:.R.iA@D1a$CXJ҉-4y~UdYkR+,xp)e>q; 04I]h/74&@ca|gMHՒYaw—KQ$G ލ?&M@G+k=ȳ^l>Eb .; cp^W+gE$j*rs _S&'n0:]\OL_)^?qUjuJu{3zL&*̶Dc; kTbd[qٵsSava$B,jNxX-7@u $ qJNaH6ǷI*Shޏl\ `ЅT(G{^%|L%jh%;S.?xw`U,;gDM0]bG0]h2^i&I?dzG~ hdKN\Ub;]s~wt2>nqtr6=c~ *ˊ/8 >Z(V2cr "&\ƒ u8[jv$HDuLbIAfMn="P|ˊܚ|C'+ג0 cVʊ.qX Q` Ԉ4mI0-eol.= pƗX!k6ba$ ٲGTDk1ǒ"[.r"cj˰//qNIΒ26RD{[ Րov~vXěYD=MZ:A(ks \+4M{xy{ 'Y^'< j]cP%f*.Q8x}{I693Ac*!TY_ @g^pX@/#W C!DJH "}.~. 1זpahzkah%^Z`88c&HTíTy~*߂_XEVw2 =?,_,I$sP#xZUvv_EvY0?˿K0Ve8O(5Dy*Ux WsT)ˡ:qQ b޳b'@WZ-rA֊Q "-'W0 D& )&~:V| (BR*v\x/5)wݽ_WNv7(tG H3Ϊ{LȽ't^A SćOF%9tH{޼l+ "@# X%@Q)u1ȭB*qUpx}8*FywlᰳLW*?*uz@NGd/{[חs嬲ޝyhH "ӴWZkN[g$J@9a<3@gv A&Ҟ? L qpC7ϻ=f, Ϛ\'"4WȒ:H;v _|Q^m}I`:h <qؚhis[nBV 5w!ةv}Y@} /Ah-J<@:%a:m*%."#*vp.#3Tp4.DBBb;Uݱ~oތX=Ӓ;gRί.\0{s{gl`oFP^V %~ wyM"<.HN$AD)lKy HAz:~*tE{D54h_=rgʮ8fY⴮[V4+ ',MS=W/ozUx#J\baT?bDڋ jX+.ۛ[Oآv`=ӚTd2.67 IӁ'ge}9eAFFP28AiJ)8\Ġa]xcC㊑C#%Ca_h 6 #0DqVƔ$ LNtChU]a$-q<9׏bPIGSՃd6w8get#ݡY0IҹPA|GSFӈgl~Szh"]"uqJ+)+a!#b$V#kA+l쌚sة^xO`bai$&FuyM,vag޼ *\1+bq"MDC4^ai7-|"S=diII\Ĕ lOr(C< <-CI+IAk +A`"囌 k.^1R:Ɂט'&񃝓3x-Ih 4|ψ)ƚ NaogC>]tx _~)pC |,x'Los_? -M:1ct"//:/xO g a [B|C_X)1јЉD;.=ՅĨZqh<7 D֙?0@iM^7ǫucQ< R5~7Fs<`[x4 ,kV6F+p=_ݣP r=P>:3k]B~ʶ fpQ)U|'MDUO,qL' yvˣ8N|1sx+A^=,Iyz`".!o())YXxADC{Ѡc=m. !GG| |;P=0F;s-`ڱ ފuk7{x= SN7ߊK|׿?e'2OkCf8d> r 88X>x &*#&&CUI@kAE*%$('POƥ9w&Q :o+Mf$lX^ZhŦ\i47Ȃ~8N!:Ibwm ]vㄠW>ORRReMMt]u2^&f^Mͱp&BFC\,!#DE7韮is(+oײ0ʿߐh"'IODgw_B‰%vg` "坽ZX)}.;Ղ-yv(zpRBfŇ_Hkk &5x걵@SB#-ϗ?Rz];Yn<ݓۢ4MbYE+UgOFRn BVB!a?CSw@壌1Z$ !0b eLsqs F޽g:z3سgϡLAK\e jAۯ i@Ogcgv^XXA'lZ4R2 Ӻc!+-fH:t  ] R~X#`ii@ǿQLJՋo_y1?pu2BChի(4IJVNX޼W/[XAWwe6  a6AqRV}/_g0 &NC)!]Iĉ4i`>tAi )[J[b{Ty0d2 -+{ PM8gWQ6w| +ZlF4.3h cԧRdMX vWMѣbΗSL TQԨj&F(18> D`?CCNySiN}!J)w^2B 'h86U%Va VhҴjEWՓ#??$EAiLS/^B{3Ɩ}kz>Eꧼܮy!sb)\eS-!O:9D(S'Z jVVҪfw5 $E=d8VXgeh$$JDžFScf}X3r 21I+ngngQ_ A&6!H簠" "EW7k?n{"@Qx;(u[ZZ/l0-mBB@k kfu`'6>' $a=_5YCyx ]ЕX@Ak@'.9C7n<`okSicRV cG( > j @wݳ0 QRRr Z%: 2 ]璛0 $ teK&nj8D8~mDOU|k@H'9V |oF0|{`Ys'o߽$Lp+l+:Gn~2ZY/h eulx h%hq*x 0]pڄޛтr[;-);X cp_?~l22~ h 7d?b}4wVp:ŋ+.)coh|W/A_p5&^Gu; 0NDѺAaB[q C]t.\sK/_@f1[0:UHZݕʞozz~)\&)wt)5`ZYn-JXC4i04$Ftak:T{Ǭ)R^:0;n2{l-2m] srY~^@m~v<Հo ~Wqw!McHz_S8@'rrsnQ5ݻRKU4aBp8A .a/_? S"dȔ*lr&HX$ffg7[όAWfށ ^ =O $%E1?}`o 4[ v{u5= Atw:-m@0 ."ģ_ 59ξ7*-b&N I%${..߲,Aw`&;rEYy~>UO<5pãd4')0":ڎ_{v[9=*BDY47dl U+48)ۛûa :ŭb6x}W5;͖e9+g9Ŋ폦ڙ%X5Nd.Zy^aiL~BN~DVti` $* W/]b_, ! c`׽{/؁A8eW^N|4 vH6v,PNN_yЬ& +0G>{ N@3.n2Ν$d$%u&>s#7!qb2K`%g(E.gHfH`;AMϿ?}W~!P`;u- CA:y\`Ǣ nO𛄮BnFAy@7B> $3L9iV(eo=A1A t:ze*ǕdInC* d:̌Qx8-Vo 9nPvPiUY2^'j @Ϣk Okł8:1~Wfڨ31IP@%ccl:18xe<"So`RRSĹtgҏ?w6d]E̠ak@ 7 O` {{u|i?Nyt=j@gN!l0i҇!r@aWvٕ47BE ef(z0TT^/}ֻO"vY_rS*]0ryE_B\tF.sFmWR&n0%Dq3$8f,|M?سl}1w<?Gs5C7Q̃A )׺Q=h| @-A=OyK:e,D^`/_{yx=;uSmF}G%@YVF hiGqE5s-kDW/q!eWjhnE..QiE%y+ND +`+f>qt"#0Xmhu֕+E>>V_*+W-\AB'(`nzUdƚu>Ss! °( rF,[9HXE#†j+ZYKLCEWey 'EagZBEIFH`W3JxnQ y 1wz_)g͋jY-Kf \f6w$р[cҥ3ٙhPZr_O bN{62 ?3}wzC84{]i2&tlE`Yp0<9)ϻhdפhL55[(Gy DA6}Np74*$*;o 1>(Yu" r7{?61)yOOϟC^\ 5+ALwR -.C!AAA##ׯfg|굖3e9˗~~Ӱ{㠍?> &ୠ߰#Jtt?"|oH|>*褅5 9_2qŵxeKP&fPOGKw3  c߿ec@,::CAΟL^j] 7._3Is&&F m3̖{6''72dݳgO? /AP]̬GddFig_p O}cFB̈A| 6AxtD 3+~GY_@g+w h`4?r1ƿ?v>}sgϐKWn Dcgys2}۷_,,j>H |q_`!ft>%g@FveyxyR@/\oqD|/_ȡ,;pskA(- ĘxŃh+*BKN;۝&vlj N!M,Ox t^H<=\/k.#iZD1Vϗѿ\$ۃSW)PQԳ?&`GE*j]'4FX[eḴ8UK"h4YE/Da[m5D?tx \/gQRVlQ||0h zh C7w_?@u(?j?8u |5h03h%3&` > 4\ 4ԵE]BXCgp UP燁CHӇI.P۞[Hx:ڇr?%hLH_Wkw-; L_'N( Zq4ݦ:t : rdf>w00V( MET(B"%lL6Yfnɰ7?.aMBiLo0(Q%*:G R?jp*8t4kCxc!mޙ\s\KQ}*Wi'9!a=zoXMkIQ'pl^o=)E"n>g0!>PѲIDy'`D7f)V܊i:~ʲ璾4K?O*0d{ @ӵ CAJbn8 oKb`ab3Ӹ!aA+y?;-BE`Xb!*XM0S +ux/L@YӋmJ#6>ݣ0Yi>67&E𫈧- #&^*җ+MZZ|5<{ -žk)y'Kdx\&F:Ϣκ$Pe!wPr$D0x9NUO]a&MBL@ 1Фm9sHw5|,IY]\0ҥD<Q_(~cp"Ks j‡=yǯ(@em@gٱ=]N$cg,6" x,Ԕ F3^]lI[DW,.o NIFC.+pb^'[W>D){V|d v1} "X*|#E_*Pש%g1 @Ե A(-(7xU_b1(Tc•v;;;>ڵgX_cKr5xY "ZBӤu墱pn" 8XO^'9Ɛ<.H=$ {N#7saIQhnC qәtz?d! lԧE*T. X@^c}Kin ɵ cb L1 L$cnpo'(lkx Xiy嫿ә: P4@T]?OjUIS޽V`a<M$8=Vq)yY4j2aS$ە\-˘qE9i-SK2Ɍ9ag(&)sT$lɲ9k6a{r$U:)jI|.%qY4TE4ݰ/}oty> ,~oZ&'fۅ ꛘp}@!/xs[z!^BSIIǪ:a((X{c\8K%4QjR-),+xl]ce?N3P] JrVϣ&h>qm)a&ȇ #yJP]o{ gybeՕԦ} մ(t ԆH4p;On*bSZ-Q1adbgtFRpoRѰ$D?E*Kgp1+S׮0!ߗFE&JB; SS0}`[qn9]o;.hl%^3sЁFp9Ay&66)Lk.4hKH,C cpH_1?BOS^2jhĭ9Ta5č:t SHÈDM0D zFR#鼲^ H?}bgj18Z+3VYM󀁍!kkoMe^'SW @Tb;XOfigхl`?F=8!7::i6v24|,~s%[_u+{B0M;*sxt6agݺ >IM<,sz@,gVZOo3Q jF9=ȑp0+#򶼝@|,MT_W&!D^`Ƌ]u {`60HoHhB4TA[/#Qg0BX&"*R!Cz6V9k =kG)XA+zY@ _,J$'JH8:Ġ0mvS*noNJғQ/eH\L"ʟ49Ir5xFwcG {p&k6ju<] 0 ܲM-(m kv~@MrI;/ q8+I9fJG!'$sa2 y Qkxpn!N"eA{k 6t)zŒ8Lq-lWOVf F ڪIbKt8Ͳ|x:稖']v:ɺLaw8muW^w>*P:F)є[dAnr 1V &-zB3EA,TNoQ#>+Abƈ`L$s^E'x9=kv4u'9 :QS&FctN0r{Y=2u:T%RJTr;ujma[Fl"tmu+aILԬ+kdQh!qWYÜh.@ALm^nGEhM0Ty޾OWQ`$,$ :4& &}C.~ r~}юEF$mMkZ-Ϳ@[x=Pkj/7<<)"ƙ~cL[a}5e do9<:a ;BLЃ$q`{Bpm_ا 7)ʘ&MG-HK'`a+!- X{5WFFYb1zŕ#Gm*J||Z70u90 r"ݖɓ$ٶ˯0c|Rvj0 l<&}3l>m D kF#);<Fcg9?ĥ4e>dua1b.ΰhI D05ZƓz;cPh+qWJU[Du?X^;P؝`„s+"OP\D] 4viuT]2"Lb|?gE OI1qu׊yEcˎMaͪ NNOd3"6`aiwR(7 PY>r<@6ogr3#P@6 Ng/N%6`K`I) tr -r#%b)/"'.\?dQ>B~g74}Tv=xXm+wZ7"H+Sg BcKmoѝy&ճB"μC&avAṱ@lŠpt piDSF,I7 D+_;onziSz.F0ȸoXȑ7y(&PQ0 yD@ץ^c0um90l} 4H7%vhډ}}&$s31ŵ,$Q~Ny8#쾈=*ww̵7xUDѥopűG䐢€aJ( GZbZ^3S^fCfF9LQ nr1۽REJG%L+S0BAlMچ7@1E~oC]=?@h#koppV #^3U.X7D[]$7K3rҦrM~Vi:I1==V4g>eX>MM ! T5j|,}c*|>%1صxyt<t:00& K !_bceR inUSs|u(dGVE\QqO džA҇=tIң2T\E-^Hi+˺\a8Р P(.͊I ƅmQCf7 Ғ<w9.Q,,3t9 a[1BEė"*WH#M$6P[y\Ƶe}%[.V]Am N}wt*¤]7QKT|dwy1#Ah\HcnFНHB/v-}AHAzu R/$[hh?aƱ1󥉺ƒߜu.0УjNY۳gm Ù ]#N&O]xȓW5& h]촀r"!pjٙ5Ioʁk@@$;3bY!E0Jֻ َր&+z? Mc>ըl~s-#,P &ʘGGs@.S$/a Gu|ft;_eDuc'\\SU{ACXQG4t_^$90=TAìʖ, J(t] +Sg AIG.$UT:lwu !&?iP7ɘ젯(Dl2F!|ӷ]4K9_'bp~?$N( HUW?>Dhq19. IDLP!pZHY|'(\g yAg$VE|"}( t9Uu>}Iغ,g!T̍ㄘ\_2ihNI- $:HH/`vR@ƍx W N?؄C׆jbGd>_:e6RYYg@SP 8v~-N H1M0w}J6Mn$+E*Yf8kv8HŏՌxƦQ">NH1Edκ 3JҒ5y1 gɺ p&9_ު=lV+FSg~yU(#f!q`R"$I*<JX]. Zƻ? z0 -At&n?Ҹ,K9-mzuzq}Nx=8տ_W 8fpPFRk=esήf\Xc{ R6ޢ\fE X 鏗E#%S҈&$m2ꞟ=? qmw64/$lR||tiv^䥁]Oc.*GYzTE}A|U0zCǩNjHy(Z) XAM3JULd'n# aH44~x#ն(!xEyf}X6 @bEC }'t2>@fv ٿ!S[#`."ŧa/`rxFsQ&0B$|*[O! 0MjUST֯gԧټsk+?|q"sckEQ0CTЖ8Jz1D*9_τɺ\^,f̩yiP"WʄQE>lEuMw:{Pw<:MpvtNF}/Mr&+e! FQ&3.m( }(OmTuLz|lO&e;hl^;SPviagOg0nrI"ϊ2Q Ht~|~u=H"p+hQ~$D*`_iU7eY/3u-Cyj3{ӕX~vD(!fD7q :6`iM.s1a-d#*A+y8(㈏Fk#e,iz{H2nQ;oSk-buF2Uca) @b,5CQ4P Qtn+#ڕ+WlE&<޻3<>=WIqGa5\BAe!e(ٿcŢR(8+pDX/]=HDwhi婇@ ۙ˲̋Ͷ`Aɂt6W'EhR!9m0/(i򴘧L)I}~jj8j)!Qf.=I'KbNenwH3`l{(RPe1L5fnRhK<_ psWHRuuUZ7}vƺzPDuu? vG=,o|o3;?~ ьAZt'2>4.02ne\U]+c 1GqwD(,{o[@&ÀfozF/Gv@>6)8{WT}"$25^]\5"wB.lpDZ%mu_?h<ዺ+UUfA54j4Ϭ RWpR',fE'% $ٷm$0Jh.a(LF(1dfEcҖ.{ D;;Id,84c2׷<8<_Bv˳K]/\ע(% T! c@wl|3ͻ`5n`Vmzp,'Nu\X)rdye6ckyMG JGa튾^,gađ0Fr'T']Xe}~0F]vtqB#}-wrөw(rMj(M!IR@qPmy`JuI&rνMJKﻝ0J{1BEdOτh1ȲˑIo%&|dsUGXOʼne^ <1"M%zVKdt8~ {Ma!SGm7(2nO(AS e2  m os#%iY+|Mˑ 2ʻ)DvAx+ )hP6c&(2ѼFG6Y߻pk?]@{]= .H6CATGHM]UyH]D%Qr __K|rbdMo6jlӌKmoD} 7IMS1/y\X" dl0n~DJ²ڜ$ci(i(?<5Fғ$%{D]2s*J_1q_[vWZ=do4yWbx"d !`˂tmM\6{nNu4s:"[N-`^X2$U 'z!@CݠEHSEb;T"9?x(OY}5#+7.ڿ)Sw7u ۾nvG~=} ƈ- - Y\&q |#GiԇaMI^bچ>rI!8CVD z>[dW~6ө!|V,݇kq\G?7AN>cu@iGP!N -s FI/׉j&&>1nѧ71Xjb"] x.ܹ93O7Z3LI<ݪ?[ ,7ϳF$IS6Ouz+Yȕd&; 7Zds{XD TyL\t-1*7(eW`t"5` Ypyu}zv~wcb\) ~uyBY lBZSTf=_g&n6qv_FZmZT}WeDiXQ4@-3Xh;v&e@.Eįp+~Ew~n AfDM$Iq)݅&w{/&|qy?L֜&[7(]i,=p8 %ž^ R*oÝnM3G!pcFi1[ 6&) ^~~8f) b) L Lp@mlsQR5v{y@=>=O5]R>L$(R$:t5 CNch$N9!&,CVۦmN4e!daP<+iٙ}QLq\~[wEMkl1q6G??8$X54(Eu i{ kѻnUյ# 3"|AH #ݠ ΖhH'F堟9%6'>/F#Z& F休BPbԒ989Y=a)1<.3mt4rjS$µn^gx A0 F" Fza@ޠVZpeЦ~@ҹ75uTĘL} ,Ke_Wm&)XTg_zvnx/]wQrMmj["{}zl"鈡5+6_~БD98`?2"9Rþj$ _Z4 kafE`@霮U֏:<ڔhPڑJx O+ֈ\庈r}` L P Riu:Sio@;oanY+J|XfO]Uw8$}rmЕk{n^+ q.aP1jczi[ʻDA1юn][?L<{҅VȌ2Ò JrONIɖE,/LUD 9GK fбiz' HcqK]/q.t<ZG%LUκV_4( 3VDCuƤ1~?QSv$,83gۜ8 P@^ZD`~,Zb>!͠ŧKw/VdX,eyL&.1DgGkom@ZyHreհ~¹-::ԼAS+c񻝪1|i0V 5]%7"ePXa:jFd佊휞t XQR*5׸&Ѥo >вWC^}ن~::BCF~29Pz4)C`Zv J0b&hSBqfC].:0I%3 Ii0Os"Or8 :@t L hG~w 5 UUS;Vr*o1(L-ȋHiJVsTtnb_ V"[@Om3݋E ծh_B \6QBF3W)$Aq]Vb91  Ky.F 2&ݜRn+҃ RAKC_&>7z&vwg:K@YT޹& 1M$eBT\a ݮy\&sTz 9_.V?kCxtBh+-V޵SOd?Ml4끺&(Bot@N2۲s1C2XLz=6i"zM2OdӨ"3ɍ҂g3F SvN!fX 5+wL~GmA %S 5v?ӧ~:L QaݴOݳ'\z2MZ]s?~i,>vNNvmYX 4DB\DXHPC]E^Nؿhuu޽lHrT<`q)`ad~:ӫWo^1\QQ4?D&PZL%2F@z+<j*&Au\cMjt1B Y?`?ZtYAz !@ǰrss< h0@k V݌Y(T$"ZDqv .m-mL@\|9gSAt ڇfQ M{[{݌'#U|#,'un֫b8fϟL沏"x Hg:A-3)~M؂*=ZNG mhP1Ɯap q*@mHa LaB˅6wA0mCA<+Ƅz7ތ5{/6^|7dH1T׺YS?( 6+ t ]y:fDĜ>?[n$vUH6llsfjc*#P8E޴[rB:D'Db>T`vJDy"*4{U 3 J^K@@Cy?8y@+X sf`5l+vN7/^fK?ݽ5ׯ^8o'DK 4i)9pdŠ+1yD,@~8xyx>es%Dz܃ I{~Ev@$55bG Vi%*v<],go}лy|Iѵ͘8ǥg= 1Y\'H 2vkzl¦DMIbW+ϋ0Sx_jqt3 ^XgVu(nN`U T!_c+VC0D۪v}4TEң_M\8 mI˦Jٯ]/K`Ϫ2#DEB|L@B2%Nl^ͭۨrsXs2sj"vt6t H !,qr_c>eLJ9 j^,)d2ؒ917 D4# @ "j #]%,$6{7#1AH§T~<9CDOJQi$:*>mkA1R^D/!σ4љ?l#lq6z(5̧Yۗ(XC…ۗ+~DJcHT4)Mm4fӬ~TsŻ&/etgnY-׍8EBX.ɡ%/XD H3H6 ێQv"ZIysࠄ9xTCM`T$@vG4{ XO0ɳ*1MD5WO}(xm7>q%; @/,$jH Nϥg>JAJyS8W{yyq@iE]s١v2k0 vez]hl^ uDz?ja( axШN/*YR"]-#=7A=0)R:܅Ih\S>/ɰJtySLDe4 Gyu˒y6 @Tcթy:V$g lB+7LE +ćp^,k$JpQn[2`7A B eM &ACGy'0F@JI+R`ٝf̼)hpT`1]4Ѵnۯ@'8~(=i*Z G4U~0K)IAirNF%%Fr6I/*こH:6|K-W_,L^ppohot)ؒ{&*pRr$T[r(F] (dѶU~u4{fη)"J;Aա(>@IQ N_`ZXMV|B)K=(׽vṫrOa%Z au;k->:"J|OHagL^C"6zA'v*42z0\FZ^$gyվ%  ߋem$T|2Ѱ^h0TUL7G=t"ӿ%+s͔lڣ{=sBzJ"p H=<\aZ3+.Ѱ#8ג}  A/xT($vgVƿ1V~ 6ApJKrmvffi򶹎qZ$!EM) KnZ!$ lMәͪE!3t\4/˾/uقza0"޻5jWRΗ u,:1 GVxP{PռIMR1c,gPxgG}s_ h&$]GeAVj:1@I{nvwgf65'|Mlm_V1/p d3Hi%чUvپiǽYˍ}<@=04U}:](yM"e,[^z9c1Θ>p7BC#NK.k=/I eLˆx3_uAԣ M<'aQ(?VJR Ae/(a ϐkA.6ăFO_ƣ?hhD%a;E=?at:]c)=h2o7kb5ÞX|Zpq+a Gm|4;f\6I%yl/޵*ktyp)e*uYh b*&/f \YY2DP (y*jKrј)ACɊza:/)9BGBW-,FO1FG\ 0fDD zg%~s3Gp]wϹ z-_(\ģ9+3+9Rt`L l05[1 UgZ˪6mܪ OK/k9`9>h>^ŬayZcA..h#~+OdƑФPcwӣ0ePd(jR.,<殡uI2)G6eAB &FѯibMD+RgEPwZ-dvE-6eˆ2fD CdiZ Ifl޺XT$G,VsQ>/Z)*x_Fk0nK&)@Un{|Y̎1 w^*^vYvC ЍpCi C]B7=u-5T bջFI3OR|8aԻ(S* GuQOȸva D)MQaᣙaDbt$y4Xrmlϗo2wWFhQt]s4r\bh< B{ րq@ȇuܬ;y W2u "qM5w[%L\%@׼*SeJH}0t|^2[7дb Y*@qfT9{ZDzY@Ĥ`eF5XD U-F@V q-K@J)88W >LS]l7#yU6K8m$>ΌB[  n[Pn*>&SPUv0p$ cځXji\o?;u>Q~1(Ngì$P`=]*cocipEnmì?l@$u"QB"C+l:v,Eq69-ײ e'gߡW?SH@ʣ,z{ewf9*/4gbuU)[i~/0N!{8fFC؃kj<6_.&O2+"Fu$Xc$)?n!<@B ~O`R:Yx|aY9ABjy}y2N߱)zig[`8IA;`C jZ I wr \3WmabBG?PPba 4Մe ,W/1o+uZXu-eE$$l ]ŃX]aL?@qy {$[6DظZE]FN Tz$*?B^*|)1,IX$NdazV8'RB^,1` qg`8?>mݢ=?k^]^vn ^eQNWn*ee% ȵ Av_6?'-DcbxphOݝ:[Qz`eCeI|64Pu=aF%pApI6Gx>-"FOS㺠QZ.xF#t`&EF;ἥFIq)7(2givfuQMU_4#)[)D@Aڥu~r-;Q転 ieTҐ+J*Dhz;M7~.&ss9GD) []7w IAA]RrEU5]tЎ(_p"{L0,3 P"Ktrp`"7.lWs8i}Y-*[Nm1 +4 f:S6'6 4pblOA>1.E@`at۷@c)PÏ7/ l[ׯF0P 2YY~|m%U`Pk޺qgAN_[ڠS4oފ y.7Й*ʿ~}` L ,"ܦ?~}%E={!!o?[X*o?|珯99ЂRKSB] ^dΦpp7H1 @[X-C0BlAP?f(@2fA "m0.Z $41}3&]0e45t{*a̽{_"^`|gD`K٬>TA(>TihjYnZi3MJ3*:+nMM=`~!ǎ4ݟ=ciu^4ts>ï(qŕ%Nz/H-}aVܳa]ԻNذie%C-$ ϑ1?kN"'ײ06 (w^6DDk&顺B,Xun.x N!F-Pe\v٘bnz]F!) tzj+I.Jb8ͳ,r1Qj,UCb$)M/,fŰ`[!9=xAu|BVng_Jfh ( 8;yi׭u)E0uVFK6I lVvvtx0 YX@df.z5dιcE}3 ʂ%łoJT#+׮ yS- O,-,!*1N=wV+yrJzx?!3ƾAyT|S]eYNvN7#wsa$N53ء|VPBfQ~pY@D|+q*:d4A˵MQ?Ry@l 2(^kn Cz;É9OhX.T7Aa렛zA0|;k|!Ij]0pqm9@PhLԓI<^F=>)hy?Y/h a;t:pj|xO.`y;Rj܁AzZU(I|:+s9O6N߂oEEsWQ0d/V/uhjלO:/b0^CqKYJ E.%AΫv^N dn=o^%ɐ7M_]MTJՎ)^R<;0ue"nFzRZ[oTAo0"? Y#eқ meoKߠh nq\!Iy8_:sa ,a@Al J$f3[:(~$; ;e+'35%Ho/ PfA%W @ă`W?ٓ 1ZZYLL@7iww|Y?tدʒ%B$L(Ca¢KGbβe 6F˗azg*sݝοQW)v@k{뮧!C/U˵BD}Z=JC<D\`XT? gDV@Ee.b- /Y\2\rl;iK<=`R䆀% &փﴱDV;ZP,s1K(Ⱥv  HKx/bm6GP$,i2/f-vH#%qpD"9" "1bz%$If2 u7۰ċhd-ܮvMǛ6AתrӋ?˺,,Jb. 8?7 D@EAK1Q(H/ܟdN@ǻ.D I3w|<1cJ@ v`/1X&;(S\,ɹ5AJz6H}(.Mۿf}u_}ddWh#p47NZڃ Dzv||,ɨZzdF 8qT~׍b~JG 0ȕ~(y9_Ik $:cA,dbĴibQ9źV҅.Q UO(QApu- Aq_z")C$UCr / $A:3TM$|LwWoWUĀ sQU HEV(hE$RF*}sݔrxdTE#K~{Ce#Ԍk59˓u`R. Ђ+>Ah8<a/IF} f<Ej(D4o?44Yrh `CT!@iՊmłIPq@9z\8vZ5i ΦI$O.?ʥ[ 7w;u՟UPUI*gv* *F%Raʄ;| @յ&DQPdKKöI ?npJM41MK#T!p<9s֔U^tJŃ/DbZȓwPW:WP>Q7\RϟƧݏtr7joI#lIZ{Yt ]uW !a\G/3ࠝʤEi@0)EU5s 0?Q+J02;w&A#Si< ?{蚎ԝòƊqW\v3&(#]Ǔtجp:Z^&Ii+|HM~Val\A2n9V Z)\m'狥.d)*D2v[6ZPŠ{ JL! @x2 m+^fH- E~2ʽng=^+)8ga/AT:>D}<.G|&VZhs,Ȅ>Gh,q}XsF4 $x5IXnK (MfBEH_Hp1*bWfn{7yo8]@M+^}|MQW}6{{9*6XܑfP D?Vg?=|n I Y$`̛{a<Ď3fa=CYu\pK6]O(fkmhV_*{E3ӍJYTNv5D-GQPU(UrbOv#)m4/l {R5z9Igk̀"je3ɄKdkiq$&] T(І%4\ wałR,%!#Ă8f&cp7 w mAzۚUn Q*ϏIƆz|繻y|'~$\]^F&B}5ʰ?D'>m`t| _! -ۢ,i"fٌTOGÙXedtH=.ty0Z/*$Zj} AV}*c wPye+ AA n]wnvz>NЮ1S>&L8NʢcAPVТi,ƩԜo>gvyu&ԨwU}lxΘP:ҧ]U(~& ѫ{p%kWJy5aqq/ҟF;K Nk1asb~Avsз: ɤ Jy_1P7 yu;MA`y6H~ӿ~y~\]"i{B!MJ:AX/ÿnJZPc^)/F2}4.D/.쎬8告; M+%s'c;V6h*[bMxh0?) b jk F(crٓ|lM$ `(ܿ͸d]Ms0h:mL;=8?yf |з[y3/o7vLR _6|m"Iϳ[V1 SAĩEدtNʛw0ā@i KU v[drzO4Ѱ z D5!\Ssyy HCD5յf6Qm&Kip\5//YF#~j|ճ\a҂^{%:xb2 t©LcaҥW ꐝ'R > rbiU8뇯!#cԹS P]#9ZCoh韷<0 %`}'hRM1S9 0e)d鼼Wi ζ A0M$ytֆsI ^Qj6U]ǻ׋g\o4 wݰu|ȉVtT<,A((M]&azFZ? bLp]MH`Ӊȫ6 )b_DynA2}ARPV\TƂ(Uʊ_裮LQJ%?Rf#{ Ăm*֥y>#Yג C"q),Ba7ּx6Kga 55qEH2\~*8^1ùږZ / r SmZާ L?}km"!Y(DKB*~!Ʉd# ?lQ5vEi򞺾k"Ɵoy&l5btAxIJW\C$;%b:mԓ3-"&c@B#hׄ?pu-A^Yw $CAtAP|teƝy;3-POGmۉ+_JbGۼ}7IA#˛DΐA!W.ڮ'Q)eG׬m!04Sx ?,AY|\BrZSU`Qtm e)X!iƪ d0K&֫6Riމ͠wRF jD5m7א\0 Ekaꌌn% SAĜqP@nE@ՈNiA_YYvJd~Ns3f?N~ЊϤQkvz -z tPUl7/;UPӰ, q庿?ʷ]%Xa|Q(&a4a0Q4?M\/"$e),D_#S+Vz^KIO mh _~ [9tB,S ѧKAJ,f.ݻ hRv;0ӣPb;m!/ybS m3KNB\])je- Q-WO 2X\0g!ܞ <"|('BOk=enyZZhTcCi)93 WB,:]{ lvm%Ƭ6fX?: 3"щvE[TQaL!x[Χajtу >C[=x!$%/(|66Ab񡺈eI/ #Q=i^kLkn4K\$7Ȅ0b&hunO^򫟨X7g%)bc[o݊r) P'6G Ìbk"{\h.c6}0̸E=FXdObLvJ@C[b%N䈓̩~#Uײ K(%~ j$Ζ'ζ;3g_PԅJ~u4GYA*|~^fgIH|71dMZWe[bD ,:M* WW)az!C%y[x9xX0^U Rxy՗s?t5H".J{3Uo?sWCOC*4݄&}c9,(hq *8i^䭓%)npL\BO+!J Q$BHjl߾7ٙ :GOnj*s[76/l̆gL Zd25!N-Rgf'˸=dP%7=uP(ţ:)֍۱{i_V%%u:Wխ?0xmYK#[sxg#, ԴBͯvD{0 Хr,X /XЉB %CW^ G޲L][@ DT5?фOT"t1%tȸgm6ƻ|iE"I[8"fsw 'i>mI G鬩뾣VIfij Uef 2{3XsR-c(ڌY%'=}+|6 W]xsM@qܲN*Sw!bx'-IickhрǬ+B4˪ܔkQ+ݎ覢hfONd`ÈE%"<_:(b}|Di(vgL]՚ȺMG&򍕗(8.`/k&I{X6,Kz1w$pd ?]Pz8ي$K9@j!iGYq( o &%@YS#gU?p>ۮ920tO; C{  pw uކyEVh`$ hB+Bʭ%+Og DaL1 HҪ r% Msֺ;?w|3)\Y:| X\qffi}!`N'4D˹@U_,;Iw)::,gF;{w=ϡ8]ܥ'ks0T C'U[Sv;HoE~59um!JľP'>L70IadMbK@AR@/QAj_B.&ԁ~t?c8`B+OWӂ DEWI"ʵKPvw&F`k4޼);̛}OZrC&VB*\{(ފz0 wu߭Ζ=x-I,#7R\ԐG5tV2 ш1ErIHUq.&Au&_& g P }iGKUUW:]'I||nt6߿ W>G `O+'ü6IرW!"X(](. /U^A|zF?kg@`xImeFAW[{D_TjY4g$z l+~M]ODC1U" ɋ 70 4C]A>JC1VРeQU>e);]Mb>NRl4<-VީI&H~[FC*FsejZn֫e sDz,>_'cr[;cB/깿//!i[2v)^xC.'ǓG]AEzȞGlc&jFrkIݙd7N3c|_\c@9eKuc(L?Ax$/.M1<8,,qPHz91C7"Jgٱ6_XKi [AZi-c{un=BғHi DS~R ]Qp \?g.$_eLR|Edѱy o4Hoyޏg.`+{,uや#nvu]f|iΣA}Uޓea Dё'մO5M\FvN!+LC蔚PdB)Bjq.:x턕Sι,;/؛cY46ܦj& \bőRK"x:( ԔUcb19.&7qw, hMaݽ<#piGJP zD?UhH2P2GhpTx5joZ}[Mx) ].lj>weiI+{Ƹ#vǃt&d%\&5R)*M֘l8]y1ʷ:?Cn,鷁jpLqCQBE!M:7|J"hrj550  ӵ DLU"&> B+Ea3˳/;cD]1/k)B%R ]Eqs^A_ifjJEkl$c[. _$!2ThO9R]ϋ&Zz@vt~6f:Okkeu]5:NFrRȹnm{gdh, Y7[bCf]1YtΔ+<>FUTeH'p WE޷y @ӹ @T%qD4AaiBwv3@nkR!`@Oƫ[A­Wvga*4Cr,o Pt 2B]#[Pph=is!:톦A•KV$yf3yuy_twi9d@n^Zl&:6ч9csg%=\o4^ Tfj߬ZzOELJPF+ Dбfة`+ek[A-衂""~H(GAHWݥ3A?{fϜuy1o 0fR>sF@涻ݳ-A yǼQv!a'MW˅L(6O]XK44<(_ⰼ 1EL\*z|oZ ^.pf,A=dWT}#>tROHj  yDiYxlUYfyvڟ|Z#dZZ 0E@jSAB`%Bzi$'Mg a](C|2Ѥ;Ssc);_g66T jK=-DO4pQ+>ǥMrӡ!( &'GZA4H.§(Hd5 dB(Bȵw3&<*Wr0c[rF8Z%*/} Fv@ xvmotlU,⊵XΘrrņ[l:>/j㔼 HaC @ӵ J1mFLݾvwfg Rv$r%1֢ f F1,~-R*WrQ$8Mg1yZBNa<=fǸgN tE n&DGv 63Rbhj#ڶcQ gh sPa|Y޽>r[fim5!,*P6>hȏJ4ꞗ2j$,= $Hmp6Oywrke\$.I$rSlʹu[ECJř?7M}أyJsӡf΀إ@H :Bqq+ekR^㸔<]A0P4!jo䋎;9\ph 8"ov;W7׌Xm%96F$yKedw\7d=KTT (!2Cb@Y5߉\(}~ά9Z ӵ A|*)-R*3hg@nvw?ϸRpݭz~m@N@%ajkV2s!*O8LAJ@$^ F6\s/' tL^n#Pf{ŲMΞ8;n>ׅg*r:{C*Dvn!<>OXw1Ua+&h@Q")9qP5$FȦ*Z-pj=N.ٽz-ڧ$h 0Q4 ߪ)>IENDB`nabi-1.0.0/themes/Onion/none.png0000644000175000017500000003235611655153252013374 00000000000000PNG  IHDRL\ pHYs  gAMA|Q cHRMz%u0`:o_F4dIDATxb` h 0@ PAPb瓄:S }qwatXkSJBc4MusN cxιc~Cs]W(trk}aAaYkm| )Q#Po8@[۶ + @PxRzf!IL&;Pu&3s*Z^]}6sJb&E]88.6bk2pڈPtJrzौmA20PtB@#3ȒhBjsQݭ#"xcsJDSU W둑) =C(aW>cH@}( }8t6JD<R80 \CzY!c +9b';"6Xi&kJk u򲁾Ќ Ь?3::/!6^*s۶[ y|ƅ06Is? D]kh:prim?CּesC%Fl smAδ2xy'gv0C 9C_#SB%;@vjSD1bZ!iM@ek-*n.T>J1 &&YAOESep$Lk3vNʜpZ9 <G^GNpjEeem jhV̬(;3#<а. zVAy,#q=AM@{&$_&bIٔs>Pj)艒mH-a ln@;MSB93^BF&?;"Hߗ̜R{Y:J& +6_HEVz3^&8ԮC* C>cR2J = ~՗EN'A~FwWҡNuQzK.멸}H s03 H%Ahg{@cKU 7'#$IѡU}OwL]=ɦc)0P^hx/AO`R\r!9~ Qn¤ԳjT~@I΄ =l}x:bw:}+L oA ڡUucHhchU96ze9cJP[N=h*p(P&Y'8䥻"t*&ZbN`Me#?2\pb( {p%'C"H5O0ꅎq? .ӏMLf:gh j?.Jj(%9@1#-YAT` Raw;AAGm`1Isoo_UּP@iR58BR͝P_ ?N6i3-tW/5@5f 0|hﻸx Ĥ֬| @ǼۅrFJ͙>#X7 :}ZXdtA"fD>I$D r*(\d+=jW`|o(#m"+9eP8G̀/?PwW*ژ^5e>}8޼LG3$Ié}l/ŀ?_ AC9ך{ aC0f/) @7=w}a40 ʦo 9`]"cn6nm ScTM%nXwA(;*W9Be@im9g01yP !㞏 C& s.`O pʿEA+1rZκ^+x%e!u  1t[~\E\ ҏ~)*x&mwJ(q[cmrYkY(#8FQ@b I j .{#UQN0z|#Ӷt7G*}Ʉ'=H3eްwNu6Na7||-|_=SR*-mGḒSW9p^COc["dT~%f/3IasC[ FM?inJԵcAhJPfn`H[jYur#fb;0gWQL\H|sROawb7v[ XJ|F/`LS v]+%;kP *饐ڱ=@-*djuWuD}̀b|$>2<200TS;F(ag!CR(1z~иvSl"UbLC/j|@+ KKΰmR+-+_;JnxC!mʖBE!IN^`ԎQa 6-XT6pVn4|Ϣ4 QG]Y1QڢD?)ugz{ۆSz4E8y+fhWB#9~Ux 8Zh1"⎊b8u>̬*ܘTq A|(& E=FQgT0SТ>!SR)=^}l#'kĢoqa 9ŋDN!gH2}޽ǏEȇ0=\`L=H% I/؂8A:"](2xRAؑ.B鈡 > !6@oA;#ddVF$dM ښȊ?DvK`x@P$S |> 100bǀ#rBS… X(gφ>qYHg@B ZHHKF^UHźJ ȳQCCC`ьl$`( @N%<ѺM$<ȝ5 ȓs'F9ȣ&LiAFl H[ x {AY[h$7@ py X ?dG N:uuH[xE[ !e ds d(my } OeXqFxn?h#`h dm4Wz &<ɐQRU`$c!R>_|?$ C!$!q7&S<.o/ @@,Č#pqH*-HJM2$6AJ̲$ R@@1LmBiq@Q' ܇,LPҩ&@kB"D!'_Xہd}J,mT -!@ۯ  B<=&C`C/VNR)1;!e7 Q޾} YW{sTF' @,Cd>Z%~,ksTg@!STew+ӧOȳpOA#b!;d50@Pם@B!3<: |(ض=H?mY:1@`hZ"{/ !&# 2'Jj= et9x,$@lx-O" p0 +JȰ%XHHVH2 |d?d- lg;ж 8*%2 `"sieBZ> 6=AT\b=bB\!J˔dH ,ૻnR×g# ;ho;ph& w,דw6 3 FX j<BYHE+! !`Z;h 1jFd |%U(H'Y҂ 6 R}0'ၬTAhdP60,zؐ(C>}rdl)(d.ڹ' 6oÜDaB66:4RŐȇ{!/FnC2p\@' { RĂ%逝o;A֏@e pO ,I 00!|A4FȚ8#e5} ȎH2@,fEć~%5!H @レ크S}NHNAHBB,ٜ P@p'#'_ɡx m?_[fڭ9}qtZ08%*xΝsj0`CXTjT*cёYx~>QIUO5kI ++gBѮ?{{8$AC  E!_Wm+tzYQaL!t0XiDP e&{1g*Sut&O^qM]n` @0|޼T"Mb]+kqDH5):TVx59laltua5 Y`J"++w@ poBPPP,My/Ey^Uh3a Q&"3rMv['g$D"DAKm9$6^ =%$ɢ"`4PZY-4`zx`Iv$$;g !`blll8{,$ CZ?"Hdxw" !g@ÍE@"Qa. B@N_7cy^ҧ֥`ui(M2ZU5Ϩp Ųa~@H#ҜDt 'jǑ?P1$X{9.y13d+/:d:d5.<E M{HSRiCβoT[uL0(1¾L']@pJ^LDG>\l7!4u72.j9*KV4]ņ@$/O:|" Y2Z}xA=G׀W1NJ<_=;A BZ+4%|g{U T:œ&k +";Vk L@Η pCzcV)w2-t̲qra)5F< D\0o7(uzz LnA(ڑ%P ZѼ'N+K_nU׼͐1Zh@9'\t 1U_6뼈F{g7U'W"- #ib\Sk*dF娨StU} NA ?2B&>z W|%jksR] S""c fU ?Q1  Ij bw_C]{'4oᯉM\GS@#3 @fx]xF&CNk6 h" L(U9Cj$kf -g `A.hSY`f#gmB>F@🦸iӦ &Ȟ300 :F'Op>$h@F+6 6Ȩ i@B,!Ek÷h[ Xo&2=x')) Z%0A,) Uf_҃ydhOݐ-_!@&\d@2rTr,$ $hE@Q &HBv?C${-ZKqͪBBnྀ!`.S ߫C#Cکl?ދ͡A.: !5-0#>fË>f&\qpy̵ehDɐF ޔFˍ2VB;v8 ݼA (m1[ pJW}LzI)7J2"*̤#Snf.\o m'ޙ֕7`\nA(x0ڢ1* 'ݫ9`0>""zq73cGDwgfUA`Պ{5ڻtt.a_PP󉭙3{C3E4 XW`}23d,i1jpG5Z?z: \Tz[NJ`mZ2 hJwW3 ]h,{| Z`g$ w"O>׾)@͚$`~_H;a "T>^C즅B6h|1/ld _`v`}y>7}ɍBXk3UfCrt9 hq-* DJB`-7Zc̆x{O_@, }1ZV."#q.=RZqaD\:C38umŠ12BJ< kQ;EQ"V{fBs6z,'g@tlA(./6Yc瞙!yTx&B>2g̼(l#=?,EtAf8XPhbdNFGF)Z<lD+iy> H>(Fфb Kb,܃ .[Y$~)r@0?&MI"!`dO]T-]Tɥ!FdFpf|Z$X`\FkG+ȳĸ=: qa2p3VuCbOpa:P?bwZ ùd_|OpѨq}@|?`)ci_YhDW[m%'hhg8.xЌcj% D@rLV=Y 6Z0|s,NsfewY0iCN C $Qwr099&iңR{Mцipv) 7700EGK"uGFCZmw/`:=U >^)NH]#CJHSMջ LOGDS;c\j16uM{ڣ{v(0 Ek O.kf'nf=x[]Edo&ٹ.wfӜx Jw#ҳL@[w[\VA_7xKhAA)f@T/$iM^7ݦS1gC7r!9 $nzO$b:YiG1‡`g[i@Zմ61 2,!Cʐ 03>D|WQ z`tJCb~'P#Ȇ\ Fmeߐ&-Y_LjV9uK!|51y l [Gw@t/ o!9 fH t+P;n(QBlԆ,{g@ZRBÂi7@]SFDEE) XRn@@.͎ȑ "`J8@ۂx2 _@>A i g! e 0^1 BN>}С3b2 rFϿ21s2pvrt9K'#| sCD!c d])?ߥ ~861`\i/׮?~\m``L h526Zl90An; ^x@:h'0/DDW?/Fpq$BLF˗3̦dR Qv!Xp؃ x:4spݻv=}VEUᕓ@| U'Q!7o*jЎB;"Y5ȝ䃊Wzz{޽P,!.?#0]?b/\0F&FV6Îm?| ,=t`뷙?09޼y[aj}@@P ?_ IdBGթ Hg*]/BPvnֽ`8COHXϿ@ ?pp{9PkӧOlJAÇ XCihHR@5dD MkW4"q}R\\?H3Ub=`3b,o֭XSSA66o߾ߺy z?{֠g27GMb'!o8څ5ȅ8d6O ڸfACfT sn.!=`@@uA.Yj@gJ@SMLL?CBCݻw}/LS3SyY/_35(#@82C{ Av4@&ԐMz-'XE9wBV6.r'҇$|`TA=@ |O=>׿(֐}ڴi۶l{-uBCC}&F4d|(.|2b5G>O&_7L̇@}HCHpsYqǏ|3_`лnٲ({=a`kXf3R1۾F&\@lr= Q~rE+&8|D&ۯц@0gӐ5f[y]H oCJx H B6px2:11߿/4!Cd=D@Ï r?D&zZ 24oCҼ$|xtMz!+8!Zs`>\0M? z`ĸX,8}P$hdi; (rV xKpP_@HT~k,|  #BGHi VU2ߟ13A󈪪rRr7~V.h(' #)QB(<]!ڵm-VyR۔TRn@2%4J'e| ! A#o ,4]]ERBHW7`豓W/_Z*H>/dQ;= 0 :yEzy=z]`C3ZJBڗ%y2u,Odvi(iY ‹{9JzhsĖue_LPiڎH39S@}W4]NssZ+_ץ}ۡsWe|>XN$^D>aL6|/rbM"_Stm[d O=@qh6$4!`r8 N9xW'd<Rdd_ ?&̌8`Ξ=6{-}珠%/?o_˪? .>|)0!n@5ѿ% j\ǨBxO_x4Rr-k쐁o1]J`xtkjjDx b9vn ,}(ԳT))U’pk❗%PT+?iaeݷ-EUW1؇+/,&#=[Q30!R1kNJ H A$UB! I2@Weh'`oBm(- Ð')6PGu@0 ED?o޼adQTP461y Ȣ +hKE k Qw@-8QKWtIH4# NA~c +y  @U*p05iu}@_^ !>,\ZH3`QJFWޚHeC> "z-kW0êiٜu0J@BDe5r~H hx\lw䨳󤄠]:^M,R>hZq[yϢݦ'}Q#~Wΐå Qmم/u(d8R`| jm55H$>.5e^< ,P{@@Ç%Wρ KFF<T_-Jab{_?L DNyRK!V61dHg2 _v0 |m:1j> pll&Zȉ{ UPR N@]rх+Nߠ~.| EO = 4 _ M.xUC*2{o,YVm9QN/Ix a.-5յ߽V@MM|fxp6oeA) )PE?~բmN@isҢ/2\n!gi|q~@z) FŬ l`^_`G;IoHGkjLǣmĀsqO hC*>.R3 H g;,|6r%`n÷ FE  0yIENDB`nabi-1.0.0/themes/SimplyRed/0000755000175000017500000000000012100712170012606 500000000000000nabi-1.0.0/themes/SimplyRed/english.png0000644000175000017500000000142311655153252014703 00000000000000PNG  IHDR00WbKGD pHYs  d_tIME  6kIDATx홯Ӣ@߹f&6h6&LF MќImIh$Q^/8ˮk93Ì<}e 6R15^t[^vL T%c^sEQ@~4MA4 c6Ƙ9ӄfXE3Awatb^kb xArꏫ$IrÄ^u*,HӔeSmT:p`6q."V+†1u&}㘰łjsO&afȲ ᐰ# C.~ }|<E{&IL& k =o7K@$IQOBcj$ t]'i%>U(s/Zfh4aej1A@[mnWbT>t]#;xkLr8 + (ReU[Y (1+uNK͆0ǡJYĞ1$Bzj1kuTU-ԟ' r4 Ce0 Wy,-ތX*(%Yݳ\.K9?+(BGAJgxGҨya$ DQ,si2k$1HT_h_ Mn彟o~: T }IENDB`nabi-1.0.0/themes/SimplyRed/hangul.png0000644000175000017500000000164711655153252014540 00000000000000PNG  IHDR00WbKGD pHYs  #utIME 2I4IDATx홱K@ǿѪXݬdAE(AEA:R*RSQq] )67<^0icr< w~߻%pqil8c1@]~bnW N 71R-qUlS?XYYe?EQ'IhuQH$`*^^^X͑fz__8BX-vwwuI|>q̰-`gg{{{5; Î h=z&g̶T*T*UZ\FX;xg5rww}>==Meq Ō3HIss3c8@:::H4%kkkDQ:c1 "—?'OOOD"x||mS*W,//Ӹd2Y$I^/尾*zzz!"_P0-̌Ht:mBKKKUDZJ!{Zgg.2bվm<ӸU IK~uu^a``PeYgFT籹L&L&cjݍt:VHMJ!㰱C [x<$ ׶tE|l,CQe<@ .c>qBBP|ZoiiA[[V<d^RQ2R(011Q!ƈb6BNOmc:XzWR_~t<t0IENDB`nabi-1.0.0/themes/SimplyRed/none.png0000644000175000017500000000036411655153252014214 00000000000000PNG  IHDR00WbKGDC pHYs  d_tIME  p:IDATx1 A0>M_okf!씄6 A[l!dbZe+҅%Obgz @3f89?x: Nm.ͩ0f4h @+(}u$4 &sIENDB`nabi-1.0.0/themes/Tux/0000755000175000017500000000000012100712171011457 500000000000000nabi-1.0.0/themes/Tux/README0000644000175000017500000000010111655153252012264 00000000000000Tux Theme Aug 30 2004 Joon-Cheol Park, nabi-1.0.0/themes/Tux/english.png0000644000175000017500000002107511655153252013560 00000000000000PNG  IHDRtK pHYs  tIME9 IDATxɏd{v?w1O9WV*wM Pa`ÂK$;ĆHBH 6?l6tzUsfwX܈̬ꪬ{cȊT^Ueݸ8;;G>m*fJAGrĒ!@$%<[138FԱY2W<6FV"aCB&8!o*v_)݉R @ DHKk8Fh+[%nltϪ+ kל="(5@"[*Qb)-9Da$\cA z*bu󸖆gxkxF䋈Rzr@BK#RA| >z)DC-$( ll+tϪt*t+0^\0(-qj5`wse~a.l\)HJ D@Kmd9" :'5V1xɱ "D)D\EҡѠz5k 8Yq"$Hz$W\e>I,:3.bt 9~{tj<H5Pެso|C 6jF1J#J!Z&[LdõB{Y:5N_lsG}ZCh?9;l(_{2>B$kie{}/?6fQ=AQ sjۧdrֵ_^#??mC48#wְYON DHruȖdJ# iF.~KNXv7{O>eGCob5/"1D\2E#^,iAAP4-g#\&.:@gm⯾ǜhbz!r9ŵIP4I .C" EAhɪOe!wSb+*7_R)#ҡuNEVDy gl>Xn:X,Fg_SfSfSS{ʽ<*{FП,fk->:`!6u(A紊cK~P+wt](:N$QTOYHy5k"<[uً;Wq Q4?u~FrY:ԶOW(dn^}AiIyIh XU]N; vǂ.: 8.>"^DIв6bxsOiopuAkX tZ V ߷ n!>DD)K 8ۢj~*s@psZu(\\0 Foϗk"pmY5ݛMCCr|^Qlp-mH8 V'k鄁47)vWY 4ePwVw8y.L8 | sVsV## Wgz˅ќwX 4UH vw8!u\33qHyqتˌ[Yg 1Q\0h`=rWUrMM ]g8 6_~Ȑ)B"wpr9Cߋ~439fJgim#~үqߧW>Vt],z+A[z?gjz'_5X0-0,]D"g/?ϳӝ?`̪Rc"=rl?qC|: "Ja $^D;SY%lUqw(`%|7p{X tDPaMVF C!ѕ_D! J1 b\uxx,->q^ooۿ0&R-ERV\ g"Ƨ2%(xgP$ C9 -o孋I C_~u͍6 dE0[|ruMcr8LME׳C ԋ7ɕ{כvN9#["MX*8[OMh. NNg:5"MNߥI,md,̸\z@}dG+]?fjI'RLDѝ Sh5(a4K<ǫ*V7Z㦧a ^#b~ !ҭWpLUw]] &?]Ԍ({ S6M}k`h9vg;8Aw}'=DT}B}oJ94q8Oov\"|T Z7P_j.~vǝ-v@ADeUEoMѯ!5N`?ՓGnav ; ᡱIDƙ@P4Zk| {?O|Dk+qx&[1HE8%}})bhhB B}3㢰|Yn,ҤYEqAIïO8}v^ZY zBVF<[:yoOѭWl5r/Wĸ_hM$%`9|QwdaAeNGq|?뇴Gm$¥=aXaiIo% 4e}w+n@GئW̶ttA bu mr.aŕ6jv9WrM调*rl?%^} WXs>d"{O:z_c2RK (eNpC_nass "ѩ>\g:^VYO+isiAø{nQ}Jks#Ϋ֓g;P@6}2EcYhd4,oqq;OYk.ْAC[Fo qиc3jg=ywwh5l]2{.d6\+,qܫ>^sRެȒI(`*> DB_D(EgI!5 7y7[Y?$R>)\H0%..1YO+3mbNs Ӫ#xf@*hN4M"Y?"R7ZgU|PP&0 |B!q+x Fß?@/DCVzq{"}S6M"tP7%"_"%+0k{0U)_9@8J ^HcpW?X5ܔ bW*IG9 㕸 R-k#@iO1ueqyH MW= W_sksڷm&% *qwaJ_R#!#CwDRH7՟StoJun;aT :q^hJH*;o pa$ױR)xq])ҫVM `oxP=2@]gP1 f$A~+E"qF0(Zd9^]syeT.(' D<[122ueXiבEN\=a Xx9=.KC  ׸ҽ/,c긖6׽>?$h-l,49xp~ַasU(L"0%b0}߰^}"a@aє0=&I>'Fԟ*7QJ~SYQ #awY™ sjm*ۧ~6NY0N$|0H\Za@B8~Mvq.yiRw9 TT|JkMT͡P\=>fFyiҖ&~c9M\!jEwUV bnىt^,ij)Dڔ6l>ڣyN^PI`Z"WQɍE:MMp Jj-o"6-%$JEq<I@KY-gh^hK`cXsID{ZIBъ*x t,?8H/ 3|ۘZ%D@ *XX]i0#ͅNRNUb\ɓ/J1.$tD[NJnA0>#AtwNGz'aN.ӴE.{q+oCVyx_'ұyMP+cv<WY *-}QM ӝF/ڕiccm;oojM ާ~RBdEYq?M9X[Hj&%4iz!B\-jgWq aOLE{39%ׇ@T"ͣ`!syt`ڸMCs!tWHOhP\mtQt'񾝓|0Jw$S44ޘfxS;'4v"Da :v?nҴ?g49o_b "M^SBP<)$ɘ< fC98xfEl(>]M$z™n,s$l,Pĵt+tNk8\ aBs6:洺YZGtϪ8K̓E_/>a qAiX)ؓ{H9yq.b"G0Yh4:#s}BvX2:<\'#4~Hso1Oa42$9Q{rVFH;/S<ݡўUҽ'Ԛ(dՏ J=􂍤zb _s\#CYuBsw8IŽPK;/IiBQp f'OQsRqFxnYRKϯQ;>)od+."cv"z^,b~2Q8> t.~7R߫4$U" e<[6,N/cBH&,-eT-[S{ IENDB`nabi-1.0.0/themes/Tux/hangul.png0000644000175000017500000000500011655153252013373 00000000000000PNG  IHDRtK pHYs  tIME*L9 IDATx݋ǿ˓kͦ1$fWV[k.Pw-Ŗ ^EEK[Eo{Uh%JX`HfcUdߢf{Q893w|?>̙s|{l2l]BD4PP" JDCAh(( %D4PP" JDCAh(( %D4PP" JDCAh(( %D4PP" JDCAh(( %]zg|7!uT)RPKRw}Mµ: YV Zib14Yy_̫sHfjR疵#4ej9CjT:nۤ)&˙mĶR$vXlm=Q.4) ہf)=(h ߝ!ۅ~,NPkkkOwu>Ai9?g?^X EҨmzzQGRWD-(.;ZAcO44ZAc@Ug.v(/3ŜDDM$Ii{gZjNXnb6NPb[RP" Ja#E)( %(SJPHEAh(( %D4+:Qy(䇔0A5-Hu꫾n^ @^'!)N|{XhV.C| e!Ք\kkkn$w~!e(hinx[] *;ԉ=0Ƌ1NO<\Xrnˇ?> o?_q%‹s[۟w9-k/9U -mtΫGȢ^kG;۾-~g3EU$TU0eyp9#n@A77eaӪl`1MWwG~_3ձywHG^吏KPu]~ KiWG_uvvhP@v 'd &t9 Z[LBAkP$tWbITT}gez9*6\ !*A +KʩJyHLm^i甗I-yZznz ܺ[a(4-fvV!LѲcڼ7ds*a5?;x7|^L^i+R1ӨJ*%c^l0^(f&iR䐞Mᢲ{%v@]l`qz0n ./+i:eu^ꔑ*@/=oK%܊黟~+(s}4^:^:?N&p~=8s 9*jHJ 'pzr q3]wֹw܉{XT:̫kD\\{{w}x.}2'ϝw=ciKic/)-]ƞ+k]6vͿ΢,lIgt`I2*&+;pexφ:ع>;:K,b`u%_W0?Ʋgi6.>n_0F rf*YT>nGDCASĔ;:A&NP4Z̉>*6!JJAS؁&ݪ7HP 0tYuvEI<(靄ŬPR(C`bIyN}uwBSPHjJJ;P%T_jJRRf*NRPMlIZ6ܚ\g)џ7fhg[iJA+`c ZOIUI5䶑^,;FJl<[`SڐSy՝$Qu l$a}tC|Es9ƱsES4C{eSڎy3K?ī)S$NPúmq| NN8lAU ['A iiOLw$HA]JHAu}۷iY띺TRJuNP% FlѨIϦ>p4! _;_#' erǎ0="hA'hAuaz6 VPg)h9a/.wA ZUNqM'AJ9H4S'kLT%/9J]IENDB`nabi-1.0.0/themes/Tux/none.png0000644000175000017500000000345011655153252013063 00000000000000PNG  IHDRtK pHYs  tIMEDtLIDATxM6FT` I";r`E03H;e~J猠+K86U (H 4 (H 4 (H 4 (H 4 (H 4 (H 4 (H 4 (H 4^uq2b ¬"h#zHbaԈB,+V,dE yŋg)xu fKy xhZT)FXA+j2XMN2A_P#PD?Ao(4A/n UF aFnșʈzb\Wj}<嗙fڷFԞO Rzv=z0z.-(Kګs/+r$]VHtԣ/̴rD{;;.Kޕox%`B -(4 (b=/%(KLXJP9#4 (H 4 M/ʇwRzޤ|A3}LW><q5Za@!U%Eת&)E&O"pvT/!,BƪeUT^{Lڀ u1>Ox-DI)_΢{538_?fݧoOy*{[EگA5ZG̻9}RwUIkg!5Ib> 1פ\) J\OJļ#i A[Hʆ}F!Ci!<!"hW'bbF5AuS5Sw弢&*PP/r^QAs )G1As ( b-mly`v9=zKY#AaJŠS Zy ]_ -A'*GI(Or>bf?*G$A'U$-f  Ig9mG6ǎPon'<Ҭ4ILI &s$4QYKiEm$MA3%wJ%͙3Bpk:%r,?|09Itl%6Z>uwSIM;&)B3DˉU:{˘֣d@i'LZ@H![YJAc1[;j5_RДClch滰>Vz-t@Мy_廠>LtZ]7r#A+I{7QvM4X>+4tk'I]Eu$̲<>DLҚЭKMR00RN w߶^P~gQ XKj%[3m6T9E9?+gmgP]b+E+TϴY7 L)hTr۔Pf#;s_o@tuK9GyjYid3M(:I{Aѱ %zΏkAs!zӻ J\IKAa,=;;A•r2ӫNJ\"님이 만들어 보내주신 것입니다. jimmac홈의 키맵아이콘을 수정하여 만들었다고 합니다. nabi-1.0.0/themes/keyboard/english.png0000644000175000017500000001410711655153252014576 00000000000000PNG  IHDR>a pHYs  gAMA|Q cHRMz%u0`:o_FIDATxb?( X@###Gl@,$F8#{4A Y ψh8ZJ ܍$9a ȇLh΄'1&?4 XD>z3CHi4 GG|ppb33/?CWM20(~# @`\VVv( #06.z!kw1|u04@#7rB }⚚@ف Y?f`@ ϟ?` Fj@cGXA˗/XϟBj`(چC0(>|/jZ @ pu8s^DCm>a0ʇ @?F!@j @Xi0\@a ?~ %X~ 1|%`r=(Ip,=f"4HJS̴)u@zP `EoC1#@ @/ @}%IcMM;mM6-ĸ _yY5)8t0#%&5Tn dKH?H-JOw t0#%GvB#W/1azb -yBWIWun1 m-@SRs5夆1؄@Dp X tē@()ԐRùV X*i]"P' K]PB"Q `nR0(hB9'UJzD>5(zXJ r<E#Ԉ'bl9O61u9@8!Ȩ0@ DS+"?~p}σ٠ait5F6hnARRAIIAFF )E99 9U=#4uUV̩^vvvuuupKII9>.9\?) AJ \#W~=L8pҥK -'BE1)=T` wYJ !xM?{ WB[* ɍ#bO8:9\kPɁl.JH +a -HԌ|B|P5p$@ `%$$N< #O'6`r ȓw|jօ k`%s?1DKA'NQd>h-h ѣG]D|9Z_B |* @Jp1j_'%?1* Fc 4P\z T<(V+=/ID@lB %%Mh7 ,W"#WDJp;wD,rr?bb&'ٳg =wAVV G %DcV·y@j׎RA#t b߾}'P:Z~XoPd i~r"m:uMU J ;v&rQDn "?~ ΍-RԮ5Utmh4@-gςaoPPB >pa1rF1IvO H.d>hoܹsH.AfSlĆ(zA"?BaD) s%~]pē: E7j"w YV@t "w F@1RP &&&$Aj5r{~ PxMY8o޼!mXLI ::: vvv$6Cz@@n67@/b@}6:]7}PttfPVVDDDH2a3 " У@JO@"D /PMj|P)Z ZL555@m~P;kIi~Rn@JP Z |Rs?PweeebbHB@SѠohP0%4r?յuy 6?lPO6 34 ! ڧ' @0) ^PB{)xHD*ndP c!vڋA@  X r3tXOUU%0ArT@sנA1LH -&5* @]@Xkd>T 5aAXf'-hH A -RGD0h_EE8HA CP$@l 9 cbHf (>Oy(as= t8 @C6 0)9pEO Ųp|/^$+E2(Gv#w ,, n%v%c[(BAnB \<Z *An@.AlPa}"34 ['p!I6S4`@b(`A>@HAE<(A3 $*@  fAUX"6*HiOe4@|r?>@>(A4,JP)AN (@Al Aj Ѐ(g6|ȇ-pPI*aD"ȩ` *bKR~Rz@1 Dn'FXu@]@R>E>r9@O ;j0S + !  w%=Y @hJht 'wh^@E2 PԹo>{#UL0K Jaaa _& ?j@tOJMl@4 >:^=\n!Xu_ATz+1P?% {m GذdZ"F'h@bb"ԣQ@r0伟 yro ( P2@> @=l o%PP0@ `MMK#o%߶mI7Q3!hД = Ы'je*j Рi vP-aVrJРI??r o%jU P({Mv(huVrP5 u&v@ 7R7} jy+9:r Md'O(q#Dob DdLVrh hK:H%BR+h@u>ǽf` @@cJTq JL`3 wFe&0y /qhthh (aaX 4ґS CBB(jP3@ hVxd@@~C@۽A0 @ /b";A@Q@M`[a3)Dm"2TĂ0hjj۸:zzz.IзV)*tJ<trqDiU8?8?x\PgRґ^=Y @ȓ yr{CR e =:׾DPPR U܇V *%%i r>ҙ?P#d\-ib1r2VraӤ\UOb#R4(7F@Bɺ?خ?K\)B~E` rW # cJN :@2; RdT#'lA- @'-;^ 7N d n 1!RVj% EH XO ðD@4;PT +Dl73D5~6b[ܰ=@Gc۰-F -YP u(%XPtP%}oDס`gA?h.l@@:TO_%[A#MZ@IʨbPs?Gh@Vr1î]|+++-Bt@3P7*P@ºU|\CWr/}+E$) f64q5(63@ G(r={ԘMސr|<ጠHm$&DEhs 3+@j'h'e( ^\;`K$a9D*%tf]> s3z n !&nmAD\;upK |Rf-)ء @t(p0Xzr>mSY"^1@6D7>3H)")]N9O Xτr9>6!Ub{l3OJB u1 $* MJB#Gi@ȧn\ dM )mZSi1>@tRѴGj(͡6^Q{!#MKRirybBAԬF%O_D6hh4VNJ 7@%]^r:%h<ѣ3yFl=B ^asФrRDt( >K J.еnj $ @,J?7 KM6f*Uh#9:5\tmOe%fTDQ Z!;ZlUk)I Kо~>z` "56l0 V@  JXrq7jkgDr peE`p&,"% ԁݼyhH-<;1@("'UV69u AvI&7Z)^alb!R@3|+VG5A_hģ$bSD[٭i&q.`h@ KOM@ E<#ZBu+JJJ빸%(4a?~-a i XA QQQ%z@ Aah8߿{( ~A wBOLH @'6 *ggM`E(٠7B#+3VohF:a pHYs  gAMA|Q cHRMz%u0`:o_F"IDATxb?( X@###Gl@,$F8#{4A Y ψh8ZJ ܍$9a ȇLh΄'1&?4 XD>z3CHi4 GG|ppb33/?CWM20(~# @`\VVv( #06.z!kw1|u04@#7rB }⚚@ف Y?f`@ ϟ?` Fj@cGXA˗/XϟBj`(چC0(>|/jZ @ pu8s^DCm>a0ʇ @?F!@j @Xi0\@a ?~ %X~ 1|%`r=(Ip,=f"4HJS̴)u@zP `EoC1#@ @/ @}%IcMM;mM6-ĸ _yY5)8t0#%&5Tn dKH?H-JOw t0#%GvB#W/1azb -yBWIWun1 m-@SRs5夆1؄@Dp X tē@()ԐRùV X*i]"P' K]PB"Q `nR0(hB9'UJzD>5(zXJ r<E#Ԉ'bl9O61u9@8!Ȩ0@ DS#"ACΠFoPFiYPȐRa hZ*AǏ /_fr xJ@дnnniiimmmp@.rR@ F Lɓ' {ez*|$U㏗AQQ\hhh6EJ54WSil V)q=0Y/:8 䊁o޼1,poaa^mN_qOHPۀ1 RP;A` V kkkeeep{V?.1bĊ  (8!`f'V&A 5Cb@^AlOJI@n\Ѐ(jDH@@ P0)?KJbr2XoG>%^U1  t.LOJb /L h^ҵ#%a0d v0ppp{듛1@,Kȍ|O:M<^\ u藔D@@ѵHIII]]]7oD21, 1pqq9b'~h6@ qrrb ҁiaCM&~MHD@9 MvNM6="Wb>h<tt +))a!JH hMٳ we3%; 5mr @ Zq={&\c Hƍ`z8Vݠ  qNNNYYY@fI2"U@ d8hADž ߿pu̙OP ' @i=s;Q?\j.,9 a\H ht V0 Rs? @b@}6WB f)Pc22P%6 tE( IH)Эa#5Q) Aj@ ɠi#&aЀ Ho:D A"hhPL]PX*jaf&5A~ YF-tH:%LРdA^ >tdА,hHM<fAll &@c@JUNX@4KDP&J@Ӻ׮]NF\EMG.m@[AQ>|`bb@mK`n'TR%@ ͡(W!oF%07^xpSNhi>P&@Ӷm6o ةf7M`AOf)akBVZ0{npcӧIkr °%vp~j%Rz @LZ}aY\uVM6W\t.OE ZZk.\L w {b@1;f߾}@5@ %Ȭ,`Sڸ{E8f%̤$P{ypAk$U(ǃAOZbaxAG~<{ C7`9&i,[]˰c@E&0BE: tsqɁyP Pށ"4Elh%,h"52A>B<0ŀ--- f͂`9 ?H r@ Z~!p((A bbb#` [J` ;@6%8K[-PIebVHa@t 05 AZ~  DPк|К|,hy9hLހ +{ H-6PIK#RqD 1rtFd51~b=rS}`w"h d^$6!3;쩪vG'!b t-э^x8C ʕ\saAɰ]B kSu>rݏN^Xu1bAUUC=ҪW@'@Ѐ 1}b/:Pq: Gt(a3l$V#(@j v7}JꄚAR?@Ѭ$}AT[f@3nYA555x k͓ @TOX5Ji1@ mRvvp#(r50!.$ck4J$Z bY8@ n )+n`/m/5`A V܀N "s (D AD>آCИPJP.RD 9Wc-/vT&@l\PO?5Ѐ 0T.(GcM+E~E>h4AFFF1LBD6U:hU ӵ@mRG @=r;hTJ~ssspJv(9'@,I %Pm 3g7Ku!A;#lbPwTRP#FiuT,@t2Ԉ&-5CЂ cb6k @ Aj^ l")P)|ؚR#ɉ+ (&Y@ukzz:xh&?2؂OPD09S2#(׃r:m4441||OII@j @l XK$b j-^a6܍"DFl|lN̶uZD<Ժ2 (ޤt($q:YObG˩Ԩ SPC)9T]VIIh @ZUi@ Gv"eKbZݺD4jZ-Jl ls(a pHYs  gAMA|Q cHRMz%u0`:o_F IDATxb?( X@###Gl@,$F8#{4A Y ψh8ZJ ܍$9a ȇLh΄'1&?4 XD>z3CHi4 GG|ppb33/?CWM20(~# @`\VVv( #06.z!kw1|u04@#7rB }⚚@ف Y?f`@ ϟ?` Fj@cGXA˗/XϟBj`(چC0(>|/jZ @ pu8s^DCm>a0ʇ @?F!@j @Xi0\@a ?~ %X~ 1|%`r=(Ip,=f"4HJS̴)u@zP `EoC1#@ @/ @}%IcMM;mM6d?fxãG>>p.ˠH5h PZ/_spDJ<$߿\=DnQІq 1E>9 F9OL˩(oP@(A̙33Pd :z(ڵkjjjPx~!&,Pu@0 Wfغu.^ϩ"\.TTT9[E>Ȝ3fwzrT>}ܭ9Ď/|CZ bVn'0@s֭HÕSAEܹs1A 7n0L>P+++q| r<8E &4@rSNT+La[0;`J( .8Ad 8}k:1!@LĖbjD>9 9@E+uйqPSSJ:X@v*E@OI5@@_&b@ O(a-Ǡ#,, nͣWO>7(ˍ lT4{y!ERE(`@c˖-'Pq*a ʑw7s?K,H*%jT \t PJTHz 8D-`[H/h% @&rCTKP,9XOl8Q'@t)ȍ|x180(A&)) n"V"q~PQ JIC^( U#xY`dhR,zǕhIpb@`(-0PuѣnNmMe~| ~; S 6)6ΰcf7~`4kK+v ` oMKJ#-7GE2(0aw XPZ 5I #A&*}@]T*222 `w bJ| x;Fa?NNpKu!i {NٹK] #t'r",b[7dE>w3 ̜ m4KRK Лyc HE H_WI5e04KLfAٵm6XTynhQ~DL:$K/)l@ @&q6,OHB凨4z:K9|uuDQ%s8zC.̫ `\>pH&=c5o%𑝅M?Ch !-0Z_,ޠY b NYZ{tV9g)v?|񳪎69XOW28?Nʐ2?(YWQd#{t~_KZhӶB8C4BD ͮ$}p0( BK~Z' =j.6[V {o^voZjNd9mINE:8,`=''#m6O`(;1# 3E(z>g5th2e^j;ZVtZk/p|t.ʛqjQ望]_'DZ{ڵ֖5tc%5 U ͟@&p @D(8ҖBAAP&ӣAر!w3EĪ# ЉL6{Rܡ 3kg`<`Y:Wfvp#x2'Iv @̽ @ms$+O \|L5wR"f9%TUKM =or9qBگƻgVE;G`^I 1<*Lhޕ|OuK@t[H'Ћm:>///zPQ Bχ@1Aj8" ,yزx00(A;D0;@nE)X>`_R 9{(Wc;]'!$ ՛"y~lP J +a%dիWvAb"AE lE>1U=R@b[;|qKӚ6/ s':UAw)nd䙉J]-FH|#}A bAPt^HvWp &^@s87SA jVz [KţdAs fJ\Kpvv'HߐP@@;Q`fШ_ss3|<᠖5*na-1"TE6~bA Bq-"R޾};v7\jn *"A 竭7@aPQ ꃣ(RaK@#tPҜNθFSSCII Cll,Ɓ)!\l l Na˨`;ȣDru+W‹zMz}j6hZn1  ^ a=,AA9AA-nXTh$p!_P##6r7XOw\ !1 Xh $P"m0#֦[Ƕ>)A4h6ZK.A] [ [ĊkAjB <n >1Ш`Pr`|PCAP 꺢ZRhڌ ;aG>h&ԓA '4HIР8#YTܯZ  7&&@4h 4@"faENaB 9P4ۑo`eiM333x#^ kJJb܎ ={٠1A]>:@PV#r?hz@X JB`57J|Dqy67wE>lA*h!(h(hM"h l%0-.РŚ@b, *2A?0X#P"4 JȣԲPSZ=Ѐ &4ƏV"_[[I+2؂P;r~PZc6@ 4;f}0b^Њ ؜l5r;=5~ dk6*AHA |P}@*a>N h`a{Ka<,׃6vZDV4hP@{5#a;}A}{ P" 6¶u08* M ?P@:=E<u@tnhWb"{hPL[\y:׃F`Wǀzذ.(1r=@u5hД5sh a8wuw*UJ%$M4h@BW٠4 Dq9B* Mճѻv A#{ `y;9'pyRc7@ѽ v.VрJм:(7pRk4vh4 @|3 AVԓr#%GQ(mР)`-pP Q+aAr=4[bf䨑uWJl[} j\D`;V>'PV6V)N  [Æ~a( "zhД kYE("@}{I"btu+އE<3A}}>: %lV7 AJKZ@4/|d9P%X"VsAU#zh8(nmLФhhvW0]JpW 1 *TNF~!baGF hPI)mACALj^1Ő/az@(Y=Р(aD#aàǠiFw0,@)8"eM 1JrwgPT e@uJ2y,#w@g wP u vPr`wRWUPzW@||*  HAzP…AF哠Ro%7뉱 h w o΁%%qs=rI; #PC P @>)%&6@ ql=P"j+<(.--_;!r?YR- 1)i:Ll" &zF2)b;w@(!iRHЪcPBHMM'$P#ѠHQ ugΜoJĶa|P Q 8 . `~;(QzA^Bu?ȍ5 3A W=;@1@,]lAC{))}@LP@ f Aib~P{I} hV`9 v`@@G@'0j4@ RPV?(@c} jbGh}$,.@t &4,L(1`8(鮮.sЈv%RHP굀F0] Ii5@JNP0@ B.[ JP"hkkC (F`k @J@nAvbA@ h/ \AP . e5k@ _jAvf/'@򍠄"6>9=P05@P_=fBm -bA%>FL6 "u jZ#f+t@ T2)MC@c"9ZpF5@kcA X&Ia"`; A% %0P% urZݺD4|A?; @P0ha lՠE9ANSĔ}8'ZFh%%@QTWG @t5Rtch?f@dFhh(x(nFJ@d@ "%J7Σ`&,"% ԁgZO@gbQDGOeOF}D* `HMgCW X" p( B#%! "rfNަM{Giv+KOM@ E<#ZBu+JJJ빸Ak@%(4a?~-a i XA QQQ%z@ Aah8߿{( ~A wBOLH @'4 *ggM`E(٠LB#+3VohF: nabi-1.0.0/themes/malys/english.png0000644000175000017500000002012111764404477014125 00000000000000PNG  IHDR``w8sRGBbKGD pHYs  tIME.IDATx]sWzM3#Fɲ)lXq~v6 N*EaKA^(*(x?*WR!% $ĻYk$}{n߾e'jLt9{[odž3zGQTP(*9}O4o Oj1휋9 M3IJ|]=8z=Xzz sF'*U '{R?PoZD(Pt]xa__P%` Q2Y0΅E$Xj#B8K]Yeض'@~6xsV/<7=;(% d\@QU S 93B52|%| "wƇ5 ?ذik39޳TEq,.r}CQgV*` F`~˧\.M܈gE50atthoH@K&d1 Vl®a밖XX@caĶaNel%(GZ/HA`WKWF> &hTMk!.ϵп- mZ]*hh.-Xf32BΝi"E)U=0} R# 3墨Dg'B XlIJZ"0B]UUvts~?qrj͡1?لƙᝇ5^.f 0O$ EgmCatt@kki6a:ߥ7Z<{" OQ`Y =EU4PDu|K}+B 'f Ä+37}.׭JyΪVDDO迮)焀Bg7lV EUF mېDw|B@ RKirJ$Yz%Q(Xﻊ"Ӄ>̦M3ؖXGiM6 $fy4eX iªVa&Fq0RPtz&=Q(@O` ͦ7{l\+U ׇ܎X8~ձ1eDܸA9^(Ee0йoڇ%-Q% @T P>wΡhn6}i<}EdZ*CC3g£m$["q#g`WZGtE(\e i=Ԭm`MyQx0=úGfFFû߼n4XZ[oaS D$@=bu`ePǵ_D# 5rGߪaw/26a쩧\ZruIE_gǂ[dI6;]Gnp47(>*,VFF\\ JjAT ʌ@ 2Zo~=Ewޚ9A$;c ^F>0sm:=K_ΒItq w;4}S߮0XzpdùBoQaAjF\ɓXRMt< ! `}hBƌTOz> ׯU:EBP>{3gPhAKˡĘ݌I ^pΙ_FXDΝhߵ x(%&]]0?bʕ e!(bY^gZ>HJXwHJNVI)W*|3gZS 5–o|m[H`7zLRY$mԦPAuj (TسϢ:6+B1 @GSW܄H{Hvw\ &,:B^lL ݇#;0 y{?)h٬x#""3Qz!ilp+ى4Ţ(43Hkj"(~kTIX oD, PUw8 [~V3`)'cg6M$:;+_6#-͊8 غ@dP(X|WxKIXd-#?4ŘGZ{B`jzy̿&]mYвYlZ."BPU#bž=nX>%\_p>iɺ?w ݅{r} Nŋ~qY*c Ϣ,0r9d6m <ՊLP`\>~DVr;Em2 ߹ ϋ+THytAXt=D%v6YcbAu|9zÎYq m0Y©SҠ%)! ?b )V.]nh f,v0cx1bHvu!pV bi&]GM7.B񏖐mD/pؼSuC}Flε\jhf)<|uܤKI$P>{P &Dl,7uǏ1xׯ]Cet4r :9!Ö2u䶁Ņ$ bq&T詔w+4Qؽz[[+##OO2osgb~އ1(\һ<B$Htw 5 H==2+4֖}q$n𝧂fm,?+'H#2d6VBUeU*TMCWZkl%uE@4ԧats YfXOh۲%_8qB%J3g*1jZE}zڛMr92`]]TiϯeXTa2&@F}p,-:| P~hz>/[2$Ĺ @mۡ\/A$>;C,ˁt"w#RBMb]|f2s,ckFuy*6(5::| +W6(7rVqMKKr_ILaFlrsׄ- & EBBc~ޑ#l=muNpS}0MU5P"\] #(uW?;|e-vﱋ5U!ˁ4r9)^nQKD,vυȮ((А?S cǂ+61ի*ߛЙ]@sn/%´#)r_w[x@b:(sKXݕ-SeΡF}Z1I"[%j`i+ݺX9F".v}岷42@$dB+2TaV*9whL&=ǏΚnHKh IIt5JL[Y aebЛ+v11x-6˱Q:|X]JjI߆!Hv kuj>jT]hʮ []"X}睱!H#m/\8"z&Ӣ7*Yjk;2wJ\hs ⱳi"Ӄ|˿{ty{.*[fZr\E ʊ(TE!bh..8MS~UNBP7­:}r&lg~hqr9)&o(B|."Q~SM& doZzˣܜt S`o,,+d請~:xm?Q G IEӐp(NkSĩu|0XO|#Jc}m Dg FjBPuЫɤ>%v@f]w O+/p.hoG+u:0c9?VNS&N._[{qԟ_J%c.mߎ?aqHJNeGy bݿ wn4|U93HsjVNKymz[o?d3Ե?ٛQv(gw/~qCs>oŭϟwsJH]Hhyժh̕]IKwٶ|jVy/NyKa@ӄt-{[u,_PT!aDQ>wk,RۇFaީ3b6~mR8oa8pm >|fG]GelL mX>>PHioY<9s'0Efl^ Q2fpOu?֭WӧQ 2|y{tU\AڵVˆt+$x X7<+ 8Ϭ{3vAׯ, (aʕ \%)ᭉe63xNt?-LK)MJ"H` TQ+~',>|X؜}., +/*)v,8x`с>ߧu箻ߣG!kRDg{&. 5,ue!d;'6ffPfV3&R|<rqXqiݺiv9)`}јHU̾z,Xw_Mtv:@o7!KgϢ:1ђM57{AW:2O*瓟=׺>JI1:nd6lpI8fߝ#t0{UFG;vd="o2@a \Y ]FJ\i j G#;rw$"0wX7([\_A@|O@סCV5nҡzi\ 8w mtw,EwnpPX9_`?BhQJ_#GӎMT]ŋX8yRzB3aXalwC}rұ V`7s9?ϛW nU::N̲,UUAM\} eOh Lz#oONDg|5[jf,viEdukQ@yYȭi\OaZ,vog_g=9EQ`7HJ 7L,Ԃ^9 +"Hկ"8{2:j"gqV6Ɋ~K [v,?_r;Sn7଒-K5Z->܎0]¼0]_{)v ؃mgږmjkVuЏ~6EY2 6ە4N 儘GDBY.^h4}bunY}viB0}.~W)'c[z9(B b뷿̆  [5 T^ŕ_}';'y# A"X%4e=V{qA]%l{Hp]V$d=I6ni yb1'>OѰ·$r,SA~` v41X=bP ^N妡X?lcTrmn_ Y&(CxiJ'?|>yс{BetosSFUm>>J4v@=l>u3m(mؕ F{3OT&x'8sA&!eO[g%uwrXEaАUî׽$?0egg\\tw0[+UסAooGB)7^܋BUU|,_~53C~ UBsqc<_Ǻ#Gжq#b+rgӄ6CQBT }<9az+a5./26> x* ]D54h@np-[szY'*=T c;RTE}rW`ezOdynD ^d9Zz=HJH!m:&qH#mP DYµk q~/'jR*\]k`N2˲vc~曘ӟud;zkb?4ٷ߳&VGFq4C7+twR@ |$]{j./(Nv#MCTBXQ(@K.4JрUӰ ؍kc(^' \P%-U"I,tzC7X}9ɒ(A|}l/R#q@qAXL&!(X1DBjև d¾V %`JS8MXkx^QǭEkdqce? }-.)Lvt󗾄sCIENDB`nabi-1.0.0/themes/malys/hangul.png0000644000175000017500000002022611764404573013755 00000000000000PNG  IHDR``w8sRGBbKGD pHYs  tIME7T IDATx]yWtܧ{23Q8p$A؍@,,cW qؿB%$ _۱k}LQUWիiq'<~|[oR`ᥗw$GI$I,3۟$EO5e$x1pN0%>߲qߣ|^Cܵe{ #G99˔!e*}'I>c~_ z%IR@jфf5Í\H=ߑDR"Z'k}=F}N/Ijw9C#IIUÉN$Yv_<1s>#DxH!i7M}/v> REu?Q(5P`J$ْH\\!Iq$Y, 7R,/7kQEӷ8K!3J@!2FhMM!bPqH%a,aUt\[C%C%,Xn;LYn uI0ajM )p|dFJRqCt-ЀH_uLxscp$ӄeY0 PG5Guu4aUz4 ih2e")j@}2N47~#*b--КDC?V'#erSZFFzЗ~ ЗPY^UBS3ˇa„jLgogFEj&hMMP@U[zij!$,4ZFF`J,-<3V_#c}X),C 'p5Gq("`M[Ѹkݐ WR) M|ב4e, 2b툷!=8ǏcB\$E W)B4KaIF(﷒,#ىkAj*4mv쨫5Uj>X1 ,ÀUP kDBMfК&0uZuW#r,~${zپCPKsMDS_ S̑aiCMCףqn( *@bH'ObITA*Xժ/g/#Ď4 r<%@fdw쀚JٚmYqڲ'⋞#:#$Eyu4)֖g\/IxKtdÙBW(1hjV5ʑ#X9r;225v)9% bCzhSO< %:Wi lhp3$O @duHMHH4^z)(=akf! 8$NEZss Y"maP]]z޴CAl|1+ىM`/ QO@iz -E&c"tsPq$\xZ[Ѹs'wD<4%*bmm~>, !AL,\;at}7vVI!f?q;E7g8dI$,gg/,4;n@0 _@=`'P+B> GӛMNBu{&@_XOcѠg3`z, 3/>;\=N .Sg?q3O=Ą RWkm PH-4P#"CBӋɖc11(MN:p!QTZ#Ö_9gg1_"w3hb--CI` -͊8 B{AK2h!IX?{>$Y-3RI_a7 X",13X>x2M(4?y&dd!(5`CzpЖ| 9~4x"h{Ԓ59xjܗc %&"~FŏߏÇ]sزooG|A@:(qbMM|aU*^H?6駞蘇`jeY)o$B 'scH8U7݄9>'$H=%O}6-J*JկfE.#ab|q;Q׭5+J;n B$/*򣣐U?` %PG;q9Ceysr/J4-AϝÿT$\lؤe\}OhBI5_>,b~\_P%UgbTx{+in,8̌W9YkjB֭.CHdR\s~&/Y"AB\+@I\B@ NF\eT W]OiX~5Ȗ5=qVI[d AE3C?yshv{B l"hz;2fɱ0E𡛦aࡇ|7Y&'q?@eaHBkhf$*!jt"XJAmhp{+%j"Bm;={ݱ㯖Щ-[w ḱfBzo)C=4ܖv[t OQ,Tbmhe~!y',/.dEA+4P@PUsˊ}~7"2|-7"\oJ]l9{ykt"(xfCڗ$hԲltO2j6)yuhm֩Ӿݘ0aq6h5522mX_dⴓfWWWÉv5A|]$b씘&*6bt0eJ YI!0 3+qV2Eqɗ.*SLmό4[$(ɤJ|F #`jqA>\.)NLѠYL;A ;!bNXėP(%YvpI`8@Ҵ`B7EIpT a hf5/df6% .: Nݔ:]@6)VfHņMaC/DP$Ter1Uj-ٝ@]%Eq]ZE]J*T_C+$jfT .x33YT[H}xP-;*^(i(=5ŕJmx>Hv6,^@pIѴgZFFd(>+s|C| ccfƽDNQ8!H)IH-[ǽ3a܈j*U, gNhN FM׻;Zn95AϽ. E+ֆ:~L>8V PavPS)bYCjR fp;L?yLgFd]Idf\Xn >_}~o˱$0-9j&cGdԍ1 TWVљ$SQǭp+x#+F|v!'h8H |ĚNpGӫ|zb!вY/ǨkŶO-d0ϻ햵nq-IvǼWYZu@GoJ.㭭(֏wvl5Kb6;(30 ) mm~z6;NVܜ|8k<n.X[?+ڐ[ku}v8ʉ D#噙`CoP?,8>0\A,(61@f*shHU{utikk0uBN$hoG^uo|#V\WklD F>A4a7٪:r ./#`IY,]ﲛ0~6v:P'Gh{{D f~3O=eQn۲,X yaߏ|Rcew͢ΌC:Ur\!jr+ǎyN<8 ̃]s0/{X,#}{σ#$?uf )^cZNAX_Gm8Ţ Knd7N3NN:/cm y.fSqҧ6ܲ/kڥX_B\f- #~ɓ."*{%٨Ɔw֕閦ƯXhHp7qo3G# 5MN J2p(pYVzpГFw5X2|dS%Ҧ4tDzz$A4;}q12yexR:%hڳ [R[kj¦{ԓOz(UR͆Kn@j*[oEǭ^L}įUC6M|3RpKpJO;DoaPGr&ty۸Bꗢ`}l #GQOd&l3j;x_ ̌mrZݽ XÑ㏇-.*c_L ^{˒eZģ!k"# J`G]!Z[qտK\;[.GbM 9pGС Z@-<`-r3qJ23XUp|(,/-kގZ6a{_ cXӟ0_ vĚES((P]]Eq|ccX?wƀP?)`;fXx庉K,z@&\(´3 nctG]]7-Mm {h_Y+X|mD(AЀm4R[I{gi > f9iJ{&Cp0f2иk@ߕ%(| /t(sP-34W6o41?1H[{,}IX"& |pۦra|]w 5J]=\Dt-:IJ$VlyZ[i(MOc} K|358w;w η<.ݹӖBw0 b$?bI6d)@KK\}]6g}b}l NGD|Y9 G/&]wމnf!$Ѹ{7_|e[ZF9gyф'jz`n6'!@I&r&<EV@ߔB  LTPY]O<3,0QPjCwFfh'N`۳u0ƟvuZ}oz5 scv~XpYa)Ih&Y1(b?==dٹDZrϞ :Ef aV4ލ={F3. ͵j"j>C} `C|_Z0 4NtvBŒd{k`!w0_~?Uc,9C;߉믇ͺdfeAKr(}U'_#`qKhD1OތB>1t}7l6yԄ;~q,8ɓSJ+v:ruHm<53mh`YEXxN‹yg}& j(2v :ov L"1ѐt}HB}X[ʊ=k9YUjCFZZkn*7^fߋ,CeKKX /Q[4MO&E(hڴ"@ n"ر(*Fu8 +l,Q?xsI5;̛}YAhX;;Ǜr&l`ԩEq*(PPUgwO4~!sm;7EebAпV \Xo|1}t ĶwT)k8B)yL \B PZt"{@ux͏/lS% hY1@9FJDX'1Χ2ö=^xoz,wEQȾHG)IrEUOL%;THDMIci'BYdN\)Î Mjs'H".rwCQG+( 67Tl/Xtm ]dF<)48UF[X Z<0 `X2lӄ]T`-/mîT9Lh¬(Z~7>#))!s.эVh--H]}AdjZq/W'B[lۆaGF` 0@, izBF*teD9 S#N747Qu,$+8D!"8`Y =FݰJ%TPDi|K_'cs)B &5Gu0"5`ep;?aڶoGj"iU*0ѿ)Dg7lVEUF ͛D%,_`R&iR&I4K J";WQUyd?֯J,G];5nqئUPmpfS zGj:j^Q`W.-a?~>Gj5ؕ (Ώd_:vFj,U@v.֯ث\Zr5IDeG[`I#38|4ؕP["+0Je֝2C"X˓Ne`m۷hkk'.l0u/^ '@fƦۓdQVYWk>9:;4ʘ "/d>_ˮd##Qu,$y G-r+OMaױp3hjut`ïT*lvYQ2N({== "Eʍ=| Id-g~d4V!eL;3gn\eAK7~nYM,Xaq[X" #HoH>MrƏ ^Z5&Pb0h;Ǐc9ymĻX I'ގ>ZGØ7u̧`j>dg0 Al!;Ǐcg?Hxy$꫺z -{NXh>-/1-J:Jcc3˃F:.˜)bc(oR[`EEQj? -*+| $׬$i4L!DJCt)QN$ՇB쿈!D l/U ϣ4>z*`:a/ut ylͳVʍ ^Ⴗɼd2g4i |"iRB|U,bEP0-[ZOG6߽ n݊D.T0ӟS[&n3QG0T4[p_<Qo4m#iSc RHmP/쨢`1q.\ d68D=GHE9?@R*_{34&R5 Ļ$ =j Z& ىx.WRpz&*33\=u0i'`~t=&:wE7je,]X}c#Q7jK#Q|ȋ.oU .;I4#Aj@\>qt3Z[~?"`JXv4ds?D D%;14>V;׳$K4ѲaD .f&Z1Gd&j4 |te PuݯXgz Z*R!ՅD>, Юՠ:Zt00;u"v鉻D/!{DZw͔0pJ5Vz@ѝQr\b( *U_1.py% V#~5q"UTwA?%*ie`1q%IzXJAoi@O$0|Or{6QL|}$ȉQI41,]D!-MB(ͅQ1Dt)ruOȜeDŽU$eS^XbY_オiHHϭgC~K^Bj*Өf٦%X⋁f)lxwgAOX~+7nV,I6dųN;Xz}TfgewDg?2|Zg@(X'w ³ CbQt}c^$O:цAΤ|e>g}C?ﵖG@ѭ46''&} 0cIT"5V:GłN9NFîTp_wFή}gvlĵo} gєaY|+l' B}͛o:@דOF"/AkmkШK1oq m|s5qLܟ7qh3s˘|ڶo'# ̡ԊzZ*):t־3Ptr(`avmuy7!(\w|.qOYĴEu>6p*s~i|w?}wԶ;k`MI;\:1`"CoEmưMj}³kdҫʇlA~Mٷ+6>[,3 c є&z*XƪTIMU*՗#sUdB\=2*0oXK03g9p2[60[zf.ӃA- {n%Gd| EUQ[YUmIsq'ъ;RXZ9u |a]nkFkk YȚҀ}j"!dJŖK \8j HP>'_ ζ1[>--G;e[hhqڵo8 ghIa(Z:Nf_unW b^4ف8 +;;:-۷1S{|unSo>&wwc.B XkՌϝyHS?iK`jГIĻ-WHSR;Xs|8kX6뵨FA\pmR:谵tDfD]2$Fe*8f6b٬S`jVC] -,8sv+?|`JS8HB ̮#MWvo LM B8rFL"/;x`ގ5=_5ZEZҒtIQK9[)- O=T`̌/Gi"D` X<{Vh/iy,!͵?<ʢWPL|5Z|YUА3IԚ0{̩SXCc>FaBk3pZӐ.,߱{7R f |3|L8y_fy]Z xXam؄gf۶m|zɑɈgޠ_tM|kװxS\gUT]Gg|sceL> rL[d[][&xgv|Ƿ'q/ىwl5;SS"l :UJw=;xЙ͉ӒI\Gme% ص}~८94,jF]g&CZ z&}mU"9f Ȓr M3;ڵ0PŭCPsܲ{r 3eY(`Wz77˄Kٷ:$rC2j$ 7i$rO?u"hR  -! 2Y[ qƔӸEnH{ՠb}H`[馡FmvTЦWT]0^{ ew,mN 6!PtAS&Dev#zCn#,Eێ>yT.i̎o*Iw'jz&IJY?Z21ꫨ!kDx!"Н "-`U]Zđ#(ONbK/Ƽ JoiAێ beLu#)2fϠG7:q{;U1u8RI0pl`҃{`+L>/#NK&}anۆ¥KXx+7n"iwWӲav@vN'^(mz"P+>@$0!ǀ(n kpo} gjh.IO&ݵ jX8wOC5)яGazdbmHxFD)fXB *Ӕ 8=#cex;܋lehF{;z}kő̿. WxoEz\1}ilقGAjFeiCm.1/y"8O$~gj@8ިLL3g|:O?tuuACVR^ϣ,Eg[p4bPuzK 6:::vRzx=Ϩ0},_> +E:f~ۇu;Y~Z 59XW\ g .,`mL(EnAaWq! 38ƍH9M⼀MTzʆ,7dIp6l&{;? bR/#-JGse0V^ s%{`dBim|oVy7:7 #jG h7͘0aE?7_IENDB`nabi-1.0.0/themes/ubuntu-mono-dark/0000755000175000017500000000000012100712171014106 500000000000000nabi-1.0.0/themes/ubuntu-mono-dark/README0000644000175000017500000000007511655153252014725 00000000000000Lee June Hee http://opensea.egloos.com nabi-1.0.0/themes/ubuntu-mono-dark/english.png0000644000175000017500000001172411655153252016207 00000000000000PNG  IHDR>asRGBbKGD:95od pHYs^tIME B2tEXtCommentCreated with GIMPW/IDATxsוǿvByIBH5f`(v;q?U[n֦q6UImĎw׉+qcX"6;<,iFjSLksBP( BP( BP( BP( BP( BP(*o0Mk/;LDtݹkL %IYHɒYr[f GwUXAD2 p̮V…ɼ @0a"zfdtlz1>'}D$ávlWV,ƿWi"̼ - @l.hOHi Já`` z뺇:Աѝx=+H{ 2䗇mDDmkm_;2Xj @-xq󰔈Z-Mmr1%[%%ZCDԴ>JӴ@/`K|K=MD%"C t0mYvix@vδ_{W ^bfl&Uim[n ˯_ UKx4?d8,Ylf_l<?:AtDԝͤ5]5DЮb-D`64@¥ fse{M]ݲgbE,][^R `ae!dDUefbQ冇%cM6Ǔ4:%,gf>5 t-)R3rqVBADNYJ DADeټa}nWUb@^J~^Dw6߻,ffЕͤ %CU Joٴ޲O:nKkP}$yXJHlܳi]?(ͯp5M׭/reǼE{_ԤP0OlݲvTN0دpXd~|2n>nB}$g сgfd)-fN),TdX/ZA.߈LD`>{MJrV`NhSk5U0s[ڥY/ADI%D$`0fHs-֕cM|҉.߷oU,-IJ7(j{+xݶ.Ŋd@ሪJ7' uzϙKof.x9*9*ѫ<;hhF=Ny>qg# M`۶M¾-z2~E":Uf 2v" *<{vK)ە5mnH eJ7 fN33rC[<m1ٶWPo^أ C)%{鹉wmtSp6'R]n сg\ȶ%6ݵv|ݹlJ [*ܱ, Ua"\/7` w̔$RJ75lM  }*J/eBh3[p-%\6P̲AK#D$\|?H䕖UIRfHD{fR+n\7LD4My;@ ݫ-OӴrZ`_iDdJLD)%D_ߪa~L|RJy$.f>Z뾾ޮD0hfRK`fZmDߋ>{N_m3if~YHD㱖 %u"J#\zzo1 сՖo!iKPND\6m(\?j9L=wҮsȵ,p2mKܽq퀳6Pp}&~^RJ46!mNKn? `wcl:FDo:@hjjZ4)%2s'@oG[#&3jV%+ fFow>f_KRFUH׵i!Ӯn@]}mш[ z@ a4z r~ۜHnT#I_ar 3ct21 r,TX &"ߒ*} 뼉Sn]̼Ƕ7nbi/3u3moJ'"8Ҽ{m )URɄ[#}r5Wr&3. Qb顤綾7!Љ=M82:f)#.2?5m>5er-+lnT$me,7\u8$y%\Pp'K֘8T]3zӦ^:^onnlѣ'jQ1;DdN槬'x$ @S>_I!f_|~"" ilUk(R43׽2zdnkk&3K"f3:%`E!HКͤv5}[0LZ.(%4xqf^yl=C}^Deٸcp{>Q DyR,w~/fY W_9h`fAD&[D4t]7x_z2#bfD6߻qK/nxv˦uTNd|xuy3g "ѝƉHJ%m?喦nnfp=@.o[PmYjjs6>/:Vy1NkOӟ~k(+^)%zWz-˒DT޶XOD|~ʣ-#"1K'9zf͛3O._8s>!¸W@20 MLYB{eGl_ݻIt'3f"@y^ l Y eHśۘK/G%:3k̼wt.9_702:̼Wyg?i*_mŎUHVfRUD̬&{^7p3?)ΚyH!|iሓH+zkζnfRUb[[pMLW~s'q,<^$e"D5m 8x I33:V$k3wΉ-#c%,yDDO!'˗h :J"jajX4ڴq]\F2DcN:=7kDtqI8y􁃇?03cƵbvBD|g0]Cؿlgf?~8~yә"ttS E#c": K)4nR}04] D|>N$pN|xք"XiW>?;iB8mc3i4cg+۷Ƌř=lZ[ ; =z~|h6zw8M<|xLJlƆ&(IDT,GvlkT~}R .MD{*,QWUy[qS8#3 2=](۶ܝ[asRGBbKGD:95od pHYs  tIME #z%tEXtCommentCreated with GIMPW IDATx{T՝ǿs=/q  U6vk40Ű#!JB"1A1F*GbBUh  sDѠ y2=3}w։3-aƞߧkjn{;9{`aaaaaaaaaaaa$ķH&A @:d͔`/\>\J遈 !O4O)-k }H哎fs=ot "*-"D4 h$"\{eԁJ)9s\vl'qͿ|W CLO&d,]N!Xǿ IϓA)C@4illo>D20@ϟ 0!Bk i@y[l뺞*l.~\Og|pt+<jN͔)BU P`>̉̌e#Akߜ;̔ԡ4@ww:_]n O0]k<`kAB@q)A"X S͔}}9zx  =n@ hv͡|>އ&KCC7ߟz뭸oٜ`WM*zVZ)t(BUh-MMG&5l PBtƨxRJ4J2\׳Tڿl q][zR Pip'*m'yRIȧ zs!-"g}RJ-譴0pP?~`ݯm\ULo^)3^u=E֑\$xԝ][ <ᑥX;.Y8ۓR<*%<S\uu, 0lLY^29(4H(~d} s[bwN e!;wj`L๑;D|46L2@j˶ J+{Y~b0jSZmgx@C>o/pݳ=hĨ5qL?vziǛH ͔a>VS<"6Ë$cȸ3@2'G*e J%8=y>`L  +f"\.֑FㄯiդƆ ogRZAl>^p_I¿aXS[ Cn3eI6gZ{9_+ DDӓNoiF2 \0X,RΗ&L VjYg~rBJ*UP((LY}pd"~t Fq"~/I)ݙ4(OJ]lRz[Gao(fKJ3e P:H/YRdža BooF#yb|yo[b؎`0(NM&c, 0h$u+.BUUر׷?D"̔?RyR/οRnw3 C 0Akg:[k]t'"ھc#`<3GDF3H)GPyRZyp(ɱ]F#?LϓKsM? /;_[C90c3)RJo4^pޜBn?g;n ͟{Y1x3> \L|!m2[60.Hnb_ήsbA[g|D=`śW+D7 51yRWqy=nEkR\o-YRVAÇ淅&.<ϝ5sF}# W C[-_U\3@28iZk۶'~cP6zw~i+p8`^gޥZRk_p#--[#p63e,q Op==[œ?hj`jϓ]g۱X42SL (X,gM <])Z)ͷX]]X25/YfA=s'.]]yMwco <s]O}=kmwUu 0fh6s Z ݲ?MJ3+]ʫ&uA/LY/Tc /"{޶cߺO>:+z~w`io̔H>|2o }%K]λYok֘06DDl1Sbyơ|Lğ!$A~Ȍg&x15*,z& a0l J/8}!^I`Jе^PB/ ) (fF8((eƘ#Wh0LYwaaaaaaaaaaaa9߽+݉IENDB`nabi-1.0.0/themes/ubuntu-mono-dark/none.png0000644000175000017500000002110711655153252015511 00000000000000PNG  IHDR>asRGBbKGDC pHYs^tIME 2T3MtEXtCommentCreated with GIMPW IDATx}gp\וw A@7H`I1(ѣ`[d,ra ߸ic@--%fݲ,Su0LtݚWQ EG}^ѱlo? 0F[*EH f+ >j"*gf-ϛTt W, UQIdnTj||"̌XdghJU"KD1hK[%셳nL"e횕T/((//+-.}~YTEQTY0T:Odww7z$EQdf/f]4nڨesyksƪM U>%?@D44 Ccl.Jet:9<4:zg}BP0藅a4LDǙyo-~uVX̆aV"#jgoqŪ*P /$ ?ieJ*Igǎ<#OUd-mBƆb_L{ضM%%E,2n)8:l1 fsL6wH|l?9+yQ"6G[Ss|4X^"tݰ鴱~q+|pvln=[ d"hK[GU:E"5~fHDDo}͢p=CR{Rܲ,?"UU<@h^Eye>u5ˋ[oB@QdADA`X|t`$\}#mfj"ٚ- z]XZҒJYX0;&l$!{;;{'vFjzc5scf) |ym%eYL TWy[\M>?<U$ |"awsX"f^_EDۙ "dF Pӎ\O%Yj?IScXxH%4`&"f`oQDTT/xT߹Cy[ɿ#GN$~DD*3onjlȹ[6vx56|/&W8;˲8Hwڛv\= ػSn ie IȖ&鏚sV=STUP%$IrEyk5+--?xdV 2f^Y9g?bIDնR!yD bxE#H'J:X KK-M Wt<⌙X,2:_~=PPջ<'f$RԉĤvu*+\l)(|K]ɴnN7Fj2;X8`fދ'cxI] kVQ p7MѧM ˘+DTd? _wnkw}~*3FsLwq;BDދE!@8KTUNg'?DVXZڟK3sy$\3u\^GZyҲX@Z$""#sM d ~ j" "mKK_-WmB(ua\aYu^LX,E"5̼DQjm7T]\X[V3CӴPYQVi6Hf9S$@y$\5puQR\~e[$"*fX,>WADO&S(lpuͶOe,>SdR]7\!GF3LV >"j3J|f. ;_:~@$RhiId5WYaO$bdս "jW (+-QCH !DW+D@DԸfe "iH1M}>{>t[qqD׍YX3~> oF[N>zcl8\P $Ӵr[\0ULτ4,%I/.8qsHY0pg&/w|ņ5fؠڿLi|j24eY񊵕]ݱxF* @6 Dp[e >|P/>h(s&^e>γ NO;yH%;5$`fT/X-ۮnI` mx,\.[\*Rq6mo,Ԕ2s&x`|+7H$φ$ "*./YT6<27QUՑpID|҂D6˙:t]lǵ٬޾g(iJ_]װqf39̲,}|BYE[v*Ƽ KzcѱaVԁmlT5M7Hp-3Qe+*u]?-K2ֿ['<"owݕ dYVNfaozMv %v~ Dي3V\q%Ӵ,"44:>?0 ^\>ou fsys4-;ƦƍTUΆw`>>mhsup `匁e1kq6\q[nھܶK,E,too|L)ΑV|t,#ryo^qͶƫEQfs-)fJ3˯la ;֮YY᜵jtM7sABP>7ou [sJO\~Ifvm'"m{?u\l,sǎ * ++DDWlXSwali]ɽ_cʊ1QXxѧJ&Sc0ٔ=蘘Ԏ48m0\_h=_AQ15\/>D緭nٽcbg`|<1lZ|FNgé)@s53q놆9 I͍Wkz|DXiŕճHme.EbQhD+UYR\T._}*ETE=0 H9A'*\>)wS?(ncdg٤i vR$B:vdbl.CsPٞ\|gVwCiSxp<"/IT˵E3+I1kZg^|桇<`YhKsB+ !i/7pI0MKޝGlb_Ӵg_y{FHv!.Q|:#I+dY==}iߟ[\[yNB`4M#%'BT `9l.Ng*N!$I$I Aߍ3w/[Qd$I-m=r1x2>"j(* 7=v & Q5Mr\"H~g%ŗll_@h*ΔB`B!$!lB VcYѾG{YVf'/ոic% >ԮXbIRA2٬e*eP؉䝷ݴx[W/YdZMKȵ#b"4Ϲ@yYl;NmT:cDU~OQ(8(4loHIqHW~mRj:Xذ6 4M-cڎʂyMLg mRQQVsx󙾾N˲U+*).EHgX^o=Q\ϴ y ;*YeIx\:llU9eMw:1֭]Unۼ|U>70b084LOo_W?ǯUU[4°'&c/~$hJ3Fm.v-7F"5 d,&}_ʟW-R1ioi}o(R>7}t:[~U%L&5# f~hKGzsI`bL$Rs ;H?߹k7> psڥhK{_yyO]g2]!ͫ,f[ӪXHI.4>M7]( (~Օ6*fY$˒( `ЩFJnי8T޺EM ݖ8Y>ffUU/[ ͚-+,˖eq(lJ4rf~6{'De5M K 2Ln2TfcmL$Iv3ŋ}{65ͩN2\JL&ss!q0:6>+o}\8e˕WWzmU#K]N}Aף OY#'И(Bu lQܼ}Y\ָic%IƆR^"b0y嗅gS:WP/xݲU$Ij͖=rfV\^4q$ ^f U4ͫ(/ _3ʲ$$IP(s䱴0LDD%I" xL&Mp``';\R\tjPE&-i ,m4i%@su,]o|eyvj߳d"),$IT:eͲ "J&SBP̜$ `MfN^xh6ϴp/O|p0&`Eixht-˜Տǟxn["y.Y4G[(:Q6ӻcg:o(%;N$En̤8rc4-c6W.=㪪8cvMIb=8Z^̆Ixt=fQ@6Kaنr]h g2 Ѷ3i eYYYɑYM $s@o;Ϭ~LJ͟/;>양b, YνQ"I{ۅx&'d*¡ٌ-!@-A:Nv'IL&fjή I:e-m($W畟xúg#adt,;4 (3%Yhxx4}l&AtvN39=JK$bgYeYcO -mD`AtsXkvxJu{M"0 BȣNg2ə L!OL ,{< |$˥ش6"B|`6)3k$G;GD|^7郗o훩f# * ryqN =zvmS~&>[-fF5قF?+> N"LӴyﶾatܡĔ]`hzJFIDw\.?UN/iM8UVF?sx"O v;ozZ`C),=Dd]"?5*;OoGv (m=I&@=TU<:3]abDDTw3]g`3LPhͷZN&SuOd8l;`LFFeadttDd8%ԣDdt?1:0P3?F[ڎ} `w0Bp.e94/T&xw[y*"g٦j̜qonG>~l6O [S;pLŬBXl18AZ۲,'v/hffl)1y=O?U:I iיR cfxTwс|^8gMgԃ={v0,UN[oODb|n\.aHfcc8G"5:Y`0Wvv4}8BSLd25G|vQUUdhK.#PKD!Bq Vff0޾j~'}v`f!dƦ)pN" @H$ AKJEUpDטbRqq)йT:3G ~"IjˏQ ȟ9G{P8)TdY{_yiIqQ )8H&#>+CUUUfѳzmˆ!0ݷ΢P0[R\\ u4 O$IBȒ_o|^.tQ{su_ {9Mi[6V_if*x%̟W>Le1c_|g}$I4v۴nP@u$"l|e榆e֮PZ\\lZ>ΤOvv{u|ۓ@ 4G[g69WqoQ-0X, LPUU U+*k׬/. iZIDATiGu$E&"0Q"z9zAj556*PF>Y%!eݺV\VSxaddtl9~'1<2s$ ;%h޹0svi/(efsxef,f˲QeEQP2MWqOG[z/"1e"caY^W*+-dYc||"/IgܠiWS'-m+='w656+8."8"d{^NS<(In5BM$8]gm3\|sJ; 2"e:{ö<m!̼֠PrS*G[.ݢ.\p… .\p… .\p… .\p… .\p… .\p…94fIENDB`nabi-1.0.0/themes/ubuntu-mono-light/0000755000175000017500000000000012100712171014274 500000000000000nabi-1.0.0/themes/ubuntu-mono-light/README0000644000175000017500000000007511655153252015113 00000000000000Lee June Hee http://opensea.egloos.com nabi-1.0.0/themes/ubuntu-mono-light/english.png0000644000175000017500000001171611655153252016376 00000000000000PNG  IHDR>asRGBbKGD pHYs^tIME ,tEXtCommentCreated with GIMPW)IDATxmpSיsdIl̛xH6y$M6iӝm;m_C?tfvi44 ! $ `ly'/% `ٲlIg?:C[tMx ߌAtν@h4Fh4Fh4Fh4Fh4Fh4ͽ L')"I|GDHrXDZ5whܣM$@)ETȔDġpQ]-{jNfdԗɌTLeDsTWE6I%"$ߎ6d`.:RJ~pfd")`W^m;$kEd-{@ɐRp\/ݔ 6wxeY~kRfO{ IDH۶L CF$RY`&FݯX `s5 7 }}GL0 ,W<[)V2duov X>@Wn +mhJkHڦi;OŒp-V*tD.lLg{f|3ˍ}wG+>[f9"(·B;HP(V鈯h}*SZP @zzDܟ_t] PQ `0I =]sҗ=|o+W9]!-bAPTZ;q?l;G0 . jQ:_0%D6SNkVJyy$`R gvo$Ar[,>kHiȧ,ˍGtI=yOD(%$)Ba/򙦈M%b>-C: v}4ˇ~FnNM8[@瓃-G*^ˬ I_\((4+~u7i`E•VUNEdp7Z:/gܱpGfDVDJJ =}5oȿ M=} R077h<(ghDɿ^H>T>{ǟɌ6La-@[(ɟ( fv;$Mj}`A]7;"S9aWw{7V-/03pqKU~/w}ݲw^ J 6&M Zw|Ξ}Wdc5^5;^*Tl67g~#jܝ?Rrt}hUz4I$;I&IZ`'m_麐|q0***,[JZ~ӛi8m8S$麴_kJ&3i:Q-[qw>ߺ,Rw>5YN9 L>l7cZfWBOTˎ|z,t/ 0{z+ _Z_"#gҗ{XGTJ߭ 9r"W+u'OW>^$";uB1'J񟴴VwZ>A#bHGP,Qj-w\("ȍO ܿ\$y0N<a?q<7a׳쥳s~CD ð;Ό>D-r's'ɭeC22]q4zg2m$W&K ɵ"á?etH~3 U ?~;Ù%" 7"24/{}qVai N7pq0|\e˲X }o(Õ˿Sd aF^SH_-oN? e'mYVC.-(S"b߿Xn1lA,5DJڵw Zw)n;rlm>[Ѷm_{ "bp:K)trS͘thWRgԫ^TJbK2#^cWǙїMl 2#cKTv @ gcO5`]"b?yc…gn^MڵLcm0TMR(b~? W:$禓hmSR _eХ@__r Uُ[֭[Ȍ `hS`IơK֬̉Hؽf-T"a({CB3 .M,[x|t4kqԇ;5=lŹsku}C"bٳ7m1L%bsP TTXyD7t}>3n@EL u=vEd8_P)4p_?wrd fDɍ"b?;6[nW`po=uhY \}M}l$o;|>_ \nvǟ}g2BR, vU$\Îy=m[Nw,~Q G' *Wu3Up `S:7XX`iΉSC鍮!|;pO7EsBҟ̿O%^O:WaCrJ Yp8d"rD>|P4cX6m\7`ӎ}:=koh +-igHDI:##Y > qܴ]DL"26.$#;:rsu摑Q] h >)?ڿb#dODѱĢfg. Z$"rL?닆axl|d(Un=9;5хǖ.YJ;kfR*\ =}+IҲl<'eO236eH&J?/`˟EHoe_@};:REd|woʕZكBG6o~m*` ""2!"\ry5=i+WW}EOZ'j&NτOrm{X?Uwe݋-̹+oY}%0B/̭^G$>wp8te$?1uG?"kΝStrmQ]sj Z4Nr~4_|Y/(p b `&N$V'kl *mwpl'2նHeJssm;ʝ 㨈жm>呁ȗSX ql']+ ǝ 4q~aٱ"z&z455s.n}8tڦ~"†'.x}*DRH6d P{K&eSVP)iӺsFiPD( 3Oo=0D>쭷[Z5Ŧl`{^}9yCD 1{9B|AOOM:v 2DHfTC%2U/k-Er8Z?[[?Z۔K'"06 /|ӿr@`b4;\aL0t2s`WK9<+g;sqdڦ *li:SmSdxdox? 'nl7w1rD@ɍ| M^#Hh4Fh4Fh4Fh4Fh4Fh4fJ,ʾQ+IENDB`nabi-1.0.0/themes/ubuntu-mono-light/hangul.png0000644000175000017500000000671411655153252016225 00000000000000PNG  IHDR>asRGBbKGD:95od pHYs  tIME $"EtEXtCommentCreated with GIMPW 'IDATxtTǿ}LHH^B:(z@u9(֖XEز]mW,*mer*A /v٭,VE !L&;}2!$$99L}            [pjSI l.@'N78 |h`f(]/7+Z 0`fٛ22|˲RRgg<J'3ぇ>ր|2 cm9]g/{ꫮҩ$KD(Si²,(eXZ\.?"~2f_dfT:L+5!Lee O 0FL +\۷oʥ"`7(5| ≯\W4ϞN~|*~7@:`|CCuL+3G߇qw0 wTB9`z:Līkjjr)I@1igem_*09"bh DPql˲,@i4@LY% U񡔜@-wöX4  o"rhX.mَ>\c 3WhTWP)8zKrߕJ2UW` %H4U^)qH 0pl3ԠU 0İm;ebʄwΙ( $d.=N:>g —*N) "ꚧqa-aC.X,Zƍ8bQD"N*bDsh۶8oYV`Yf`*Hz u`$R9;srxơЌmbe1MӘqz|| Z;@3cYgve1@t*(I(M:PB}.9ifULS&O< ?|๾;Tr235,ymK^Zs8V\w;~.g`N%#lW_us|2A 0HXk)_j2]8|n<&%"d?U62MiN5؍!Ƞ3@:$#"~ye(3ĶmF``p`$3;v=aEh²qHF2Jf-8mZ֚Νpk#)[>Z0Ʋw|~XCٿ D L1MPC}]O=fVebrge2uʹ;3mYC5T9@:1"*n^N< .*DD)7hSJczq\?70.2 ߻wJ* 2r6~:F&=0w邰;af|zV4Q=}#odCiG7:%Tn<NZ>ӈ(WOfGRwܶpg["Ot5/_nk#6􁇵 @Z гkDM|Ok񙙦N`k")<[)RzEffYf =|ճ^Zu?bc ifd^aラ0 l٧5'brbB&AH0])#طopl[h4Һ价Q پNdop=3#֡liieҰ `e%\H)~;K`TZFEL[^%qÇK򳗇ҩd]|˝1u`aoLcgqm?o=ZӸ|U9W7YX pL3af%_ؽ{ߔ0+;R,sqȆ3~3cIopݜWֽLBAQO`~آo/7pIgf.l$x}A\^1?Ai (i 4r{#'`rXsNYG|QJ:luHJXU|E? \(h0ۻD߽tA>tqgOUݻ1Mfʡ8{ J.gK"'x|SݰZ"z|4Uqc,6"s ٛ$~Mj)D^lLAzdƴoN7xQ$`Sɑf~ZƯ쬎Άn}>dV=w~ &)"D 5@?>x|A}EW{apO:'|JKKQy E 5@(L9u_oyI՜lp蘉T[[7ntbXDBM|4\`3J)7~s 0 w5}XSkk|xeV'(=ލ'ft*9&" 6|bgdP/[=to\]ZG8Dƍ'^9+3`e;_1z[.{cL/UȏD"¾\.oQr7'RV"7f_ YQ3356~kk\.J#|xnjZkZW&7a[ouaxW|ҧW5/kV3$xPXGD\.os׭9{K\:=)fᵻW5/7nd[[xO<#3zxO(i񳟈7 ][6g=ăffv 7xSdXn< LᅫYkviԫkV<^&ֹ!8&xv,Xv?P_n~p2\ `O$EnFUUMp֭~tE$Z Bij7y_.4;N%f[_7{dV33e-%7" 4@hөVk(&ma( f&x!JuC"L1 @C  e=VENaӢ%5iN^_i"]). vNaD bNrXэ'ޑ%            ViX4!IENDB`nabi-1.0.0/themes/ubuntu-mono-light/none.png0000644000175000017500000002067711655153252015712 00000000000000PNG  IHDR>asRGBbKGD pHYs^tIME {tEXtCommentCreated with GIMPW IDATx}yt\ՙoMV%KU%xA`0c L'3}2szMn&aIȄ61 6$,yQbwS K%ystlr~ p… .\p… .\p… .\p… .\p… .\p… ..T;]MD3 7#@wY?3%I~ `"6 fV(|DT"1s u21  7Xy'@WG@!0@M-`0x0ID) 4eƃX*b< @-*"9s;'̂6ZQ0ܐwoVz1JDʝ IJLD$luFưl"hJhˉh3PMD\XB(eQVLRJ, $tȠ0H96 i]%MB3I[GD"f2Zա$2-2-SERJ "SDtmR σ:"D4֘el!,MӤ*k:5Ji鴡xYVZ N`eR4Nga 3kRD.3o=[ "|m2^*(۶7Un_s`2d C3-K%̀FaaAdSkG*STZI0L}2P⋘f2,[Xܼ2z鮲d"7MK7 C7LK45FJ‘ƋZhao*V P41!@WGND+\)+|zg=Q܏[f #HeeyK-<`~)%b UJ)l a=H 7`̙B#zsl?_' DeYGÜK~/Y^V5{f]=w߲:Og2"fBơ1!@w]j R엋*Ӵ!,grnt H}#աS >v}wD'4IfBD[$ ڂʂ@lm;V߾>o L@?N"ITZh?w6RJ EgL}D^weFϙj!rElv"Ob޾#G%+W,ͯ߻'kdJ]Mo"-lf.!U\\h+z[x$1t[#B?EiO( 2-Kik?>c{Zt*&f 7&@"0KD%D98)%T*8=7Ͻ\w;֭i-Rh`agX"iXh31ŵǫ;ؘIg|ei"Y3 2LS(¶t!BXDTJ$ysguDOקpv*LL3Gy+o93:+=H;\73xMH ,v̚ 3 ^}ke,/"Y&duup2-sL@ `>?{OrVY3ƯfEQLz`{\:۷dCΏEt"jNʼ &h-cODY3;^sLB >LogH1LwRZe%%OwKk6STŗ߸Ϊזښ`<+G`ouG_HD@Paf!,f 3G6Mk:ؘVuGg14;͍x<>KoܴyU*c\ _D239|DՕ+lã:h|u`lݾ<-#Abk&'?t:#o)TXDTkdtG+BYDd"Z]M&CJ'yik3/#`7܄nzִ%I2)B(3D2ޱnMkyc4.$5Oz觏œ)U4'wM7Ky,׶lFNaOeru_PgW_QPeDYexg?GgFUUyΩdF;q!@0BPWw@eY[_Śm***4Y@DuG lu @? 欙u}Zڂ9ZPoʥvd2boԄ2^UU,4?q f2fӼ`f,[d5+4pLȹ~q(ND,M_si! "bEQpxt?f%%i ym$'H$H0ޠQsמHt8<%aY*UUU-LУ+c "g)%L }ws EJĘXJߺY4-+Z`DS_{[fI`Wۯ=$ꆳu̬̕33 vͺs {cȱ(7O>ѴN{}-oLM$yG0NgD0ADdpmui!w$陏?auA{YWGӕ:ytR 1C4˯ׅ5eig( ̟p%1u=5A98pg?jy_ߠT"@C3E̜0B>K߶L?jE1JKS[O!u]K1$$ؾyWޜml( (XU2`13^մ@WHɣ5^z s}or0> vD#yco V.A$0~2cV{"g=2C5,%y=k-Gץ*›lXL&B )%y=!Wr`'N;vE :gΘv>8 ! x;Itԓ<2vJifɆY^˧?(bVp7o.,,0l2q⒢Y%O8TUN|!23jjt˗,j/Ɇ;zwK֩} /b)b4HcD 鬬d"t)sxoˇ+^L]פTiǣD V4Ueo.4u OO3ΆUAWGS̈́qeIIVrHDĉD_=8$*FcN?d"s,cutFyDks0( OZҚPHa‚q3M [.zc N TV_^yX\%ϛ;g3R2U=Jq Qf6Piiq%}^ofCOTDg޴,qTQKk}7 ~w۔mb2L;VZ9 %@0ܐB&MWWJKH)'w,-)J{$("ϟ\NgIʘȦ `!1q34]g4#8`Y]2f3~_yŤQNA:ug>nM.٘*F_|ڴڶ+^:;=~GbeB2c$=f-n\;84YْmyvlmXc kTu]u]jʏˮpC6?6<+{>6Ͼ7Ldﰾ̝bHcr52vz^x[WU-dюJEU8h99i-onr̓3qn(xf<<ٛ6wӵRJ5_\y'@ 0M7^w(KN IeDšՏoa5v)숥N]h+HM{O|F)[XԆ3kFs"WItXt2'='<=\KLLmMM#{ '2C,j%Ąj޸ΛyO hkl *8o4MS؉Òi3TTuMP$XfIl긫|jzoލyyO)l.&;HIe} >/sAP1fm̨>||aiSÃ} @dJՇ4M˫ꤦ+N7RJ'unQ6#mLyr`G39h-Psw4 Awx>J? 7 i i2[D֎t42W}?/-())9SUYAD|tᆏ R|6fFuH9橍3e[`nlGwjɜ+8ujm1$ϙ]6vKvٗ[S"T_u!O3ӽNjLުNn`EQyӚU-]*xʊ3zrSvR-fƆrR2n]qe%i\Q˲DYYI;o^ pL /:|"4U)Uǥ\̸r%qۚǹ( 7<=2C?@$R;rGEM 3dO}yPUxR2O_}凋 3Oap3s+ff(4-5.]"{k{ "TzAefU*Ғ`fE[?'ODRM+ʘپ+W\]ID?!L0s]C\vG7.$M  ̇- !g1jE|Bu/lO˰7wJ@zGHA{SLtF\pngeEyǣ'4M=ǟewg/RUEV[؅Xl}_ǘ^w^O:-/+IK-Pv;< u]7w4>Tc瞆s,~QaA]wܴ[ohMR^A(Ҹ}HWGS=UP07ǞY?PuUˬ*~% Ͽhv׼f**3c}d&'|uM~ᶒ ֗XwcHLef7 rl!f@ x_/|wBǗ913-a_!TZ1 axd`w`fLFkľ|]y͝uk[b̺}ꥳ=.%c햵׵|uͨ~P!e+`[xBi]KD| B `{C*y=cD$S鴲NUUU ÄakYGH9DQaa _ۜ6"G?ZR꺮o㾦{[qJKzL3;/`i:d \tsYYqG$h7JD/ G6bg)|US@ JpwOoM<e!S#G[|k;bYê4?1!@F4yˇ5o9iECŊ]K?^_7iiu߽v rÍD5" UU၁!@38y7WgX/pSg [<^tB0p^juG @5!"ЈԼj֚c:W\nzd,ldo7dY҉D^ Lt[|Kʹ'{ Ba)%ySR${IDATJؗI fLKHct Q3_8BVS?0fiiIڲ,[w`9x idI;\`3_dYvŞHv9Ƕj%;F(7Nc {'*>d͓9 d/4ٹØHd/w&W)P `E=^ :BҎfDNbvvt4p(u… .\p… .\p… .\p… .\p… .\p… .\ }iQDpIENDB`nabi-1.0.0/themes/Makefile.am0000644000175000017500000000355611764413367012710 00000000000000simplyreddir= ${NABI_THEMES_DIR}/SimplyRed simplyred_DATA = \ SimplyRed/english.png \ SimplyRed/hangul.png \ SimplyRed/none.png oniondir= ${NABI_THEMES_DIR}/Onion onion_DATA = \ Onion/README \ Onion/english.png \ Onion/hangul.png \ Onion/none.png keyboarddir= ${NABI_THEMES_DIR}/keyboard keyboard_DATA = \ keyboard/README \ keyboard/english.png \ keyboard/hangul.png \ keyboard/none.png kingsejongdir= ${NABI_THEMES_DIR}/KingSejong kingsejong_DATA = \ KingSejong/README \ KingSejong/english.png \ KingSejong/hangul.png \ KingSejong/none.png kingsejong2dir= ${NABI_THEMES_DIR}/KingSejong2 kingsejong2_DATA = \ KingSejong2/README \ KingSejong2/english.png \ KingSejong2/hangul.png \ KingSejong2/none.png tuxdir= ${NABI_THEMES_DIR}/Tux tux_DATA = \ Tux/README \ Tux/english.png \ Tux/hangul.png \ Tux/none.png jinidir= ${NABI_THEMES_DIR}/Jini jini_DATA = \ Jini/README \ Jini/english.png \ Jini/hangul.png \ Jini/none.png \ Jini/english.svg \ Jini/hangul.svg \ Jini/none.svg ubuntu_mono_darkdir = ${NABI_THEMES_DIR}/ubuntu-mono-dark ubuntu_mono_dark_DATA = \ ubuntu-mono-dark/README \ ubuntu-mono-dark/english.png \ ubuntu-mono-dark/hangul.png \ ubuntu-mono-dark/none.png ubuntu_mono_lightdir = ${NABI_THEMES_DIR}/ubuntu-mono-light ubuntu_mono_light_DATA = \ ubuntu-mono-light/README \ ubuntu-mono-light/english.png \ ubuntu-mono-light/hangul.png \ ubuntu-mono-light/none.png malysdir = $(NABI_THEMES_DIR)/malys malys_DATA = \ malys/README \ malys/english.png \ malys/hangul.png \ malys/none.png \ $(NULL) EXTRA_DIST = \ $(simplyred_DATA) \ $(onion_DATA) \ $(keyboard_DATA) \ $(kingsejong_DATA) \ $(kingsejong2_DATA) \ $(tux_DATA) \ $(jini_DATA) \ $(ubuntu_mono_dark_DATA) \ $(ubuntu_mono_light_DATA) \ $(malys_DATA) \ $(NULL) nabi-1.0.0/themes/Makefile.in0000644000175000017500000005346312066005053012704 00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = themes DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__installdirs = "$(DESTDIR)$(jinidir)" "$(DESTDIR)$(keyboarddir)" \ "$(DESTDIR)$(kingsejongdir)" "$(DESTDIR)$(kingsejong2dir)" \ "$(DESTDIR)$(malysdir)" "$(DESTDIR)$(oniondir)" \ "$(DESTDIR)$(simplyreddir)" "$(DESTDIR)$(tuxdir)" \ "$(DESTDIR)$(ubuntu_mono_darkdir)" \ "$(DESTDIR)$(ubuntu_mono_lightdir)" DATA = $(jini_DATA) $(keyboard_DATA) $(kingsejong_DATA) \ $(kingsejong2_DATA) $(malys_DATA) $(onion_DATA) \ $(simplyred_DATA) $(tux_DATA) $(ubuntu_mono_dark_DATA) \ $(ubuntu_mono_light_DATA) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ LDFLAGS = @LDFLAGS@ LIBHANGUL_CFLAGS = @LIBHANGUL_CFLAGS@ LIBHANGUL_LIBS = @LIBHANGUL_LIBS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ NABI_DATA_DIR = @NABI_DATA_DIR@ NABI_THEMES_DIR = @NABI_THEMES_DIR@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ simplyreddir = ${NABI_THEMES_DIR}/SimplyRed simplyred_DATA = \ SimplyRed/english.png \ SimplyRed/hangul.png \ SimplyRed/none.png oniondir = ${NABI_THEMES_DIR}/Onion onion_DATA = \ Onion/README \ Onion/english.png \ Onion/hangul.png \ Onion/none.png keyboarddir = ${NABI_THEMES_DIR}/keyboard keyboard_DATA = \ keyboard/README \ keyboard/english.png \ keyboard/hangul.png \ keyboard/none.png kingsejongdir = ${NABI_THEMES_DIR}/KingSejong kingsejong_DATA = \ KingSejong/README \ KingSejong/english.png \ KingSejong/hangul.png \ KingSejong/none.png kingsejong2dir = ${NABI_THEMES_DIR}/KingSejong2 kingsejong2_DATA = \ KingSejong2/README \ KingSejong2/english.png \ KingSejong2/hangul.png \ KingSejong2/none.png tuxdir = ${NABI_THEMES_DIR}/Tux tux_DATA = \ Tux/README \ Tux/english.png \ Tux/hangul.png \ Tux/none.png jinidir = ${NABI_THEMES_DIR}/Jini jini_DATA = \ Jini/README \ Jini/english.png \ Jini/hangul.png \ Jini/none.png \ Jini/english.svg \ Jini/hangul.svg \ Jini/none.svg ubuntu_mono_darkdir = ${NABI_THEMES_DIR}/ubuntu-mono-dark ubuntu_mono_dark_DATA = \ ubuntu-mono-dark/README \ ubuntu-mono-dark/english.png \ ubuntu-mono-dark/hangul.png \ ubuntu-mono-dark/none.png ubuntu_mono_lightdir = ${NABI_THEMES_DIR}/ubuntu-mono-light ubuntu_mono_light_DATA = \ ubuntu-mono-light/README \ ubuntu-mono-light/english.png \ ubuntu-mono-light/hangul.png \ ubuntu-mono-light/none.png malysdir = $(NABI_THEMES_DIR)/malys malys_DATA = \ malys/README \ malys/english.png \ malys/hangul.png \ malys/none.png \ $(NULL) EXTRA_DIST = \ $(simplyred_DATA) \ $(onion_DATA) \ $(keyboard_DATA) \ $(kingsejong_DATA) \ $(kingsejong2_DATA) \ $(tux_DATA) \ $(jini_DATA) \ $(ubuntu_mono_dark_DATA) \ $(ubuntu_mono_light_DATA) \ $(malys_DATA) \ $(NULL) all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu themes/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu themes/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-jiniDATA: $(jini_DATA) @$(NORMAL_INSTALL) test -z "$(jinidir)" || $(MKDIR_P) "$(DESTDIR)$(jinidir)" @list='$(jini_DATA)'; test -n "$(jinidir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(jinidir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(jinidir)" || exit $$?; \ done uninstall-jiniDATA: @$(NORMAL_UNINSTALL) @list='$(jini_DATA)'; test -n "$(jinidir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(jinidir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(jinidir)" && rm -f $$files install-keyboardDATA: $(keyboard_DATA) @$(NORMAL_INSTALL) test -z "$(keyboarddir)" || $(MKDIR_P) "$(DESTDIR)$(keyboarddir)" @list='$(keyboard_DATA)'; test -n "$(keyboarddir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(keyboarddir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(keyboarddir)" || exit $$?; \ done uninstall-keyboardDATA: @$(NORMAL_UNINSTALL) @list='$(keyboard_DATA)'; test -n "$(keyboarddir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(keyboarddir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(keyboarddir)" && rm -f $$files install-kingsejongDATA: $(kingsejong_DATA) @$(NORMAL_INSTALL) test -z "$(kingsejongdir)" || $(MKDIR_P) "$(DESTDIR)$(kingsejongdir)" @list='$(kingsejong_DATA)'; test -n "$(kingsejongdir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(kingsejongdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(kingsejongdir)" || exit $$?; \ done uninstall-kingsejongDATA: @$(NORMAL_UNINSTALL) @list='$(kingsejong_DATA)'; test -n "$(kingsejongdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(kingsejongdir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(kingsejongdir)" && rm -f $$files install-kingsejong2DATA: $(kingsejong2_DATA) @$(NORMAL_INSTALL) test -z "$(kingsejong2dir)" || $(MKDIR_P) "$(DESTDIR)$(kingsejong2dir)" @list='$(kingsejong2_DATA)'; test -n "$(kingsejong2dir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(kingsejong2dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(kingsejong2dir)" || exit $$?; \ done uninstall-kingsejong2DATA: @$(NORMAL_UNINSTALL) @list='$(kingsejong2_DATA)'; test -n "$(kingsejong2dir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(kingsejong2dir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(kingsejong2dir)" && rm -f $$files install-malysDATA: $(malys_DATA) @$(NORMAL_INSTALL) test -z "$(malysdir)" || $(MKDIR_P) "$(DESTDIR)$(malysdir)" @list='$(malys_DATA)'; test -n "$(malysdir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(malysdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(malysdir)" || exit $$?; \ done uninstall-malysDATA: @$(NORMAL_UNINSTALL) @list='$(malys_DATA)'; test -n "$(malysdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(malysdir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(malysdir)" && rm -f $$files install-onionDATA: $(onion_DATA) @$(NORMAL_INSTALL) test -z "$(oniondir)" || $(MKDIR_P) "$(DESTDIR)$(oniondir)" @list='$(onion_DATA)'; test -n "$(oniondir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(oniondir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(oniondir)" || exit $$?; \ done uninstall-onionDATA: @$(NORMAL_UNINSTALL) @list='$(onion_DATA)'; test -n "$(oniondir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(oniondir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(oniondir)" && rm -f $$files install-simplyredDATA: $(simplyred_DATA) @$(NORMAL_INSTALL) test -z "$(simplyreddir)" || $(MKDIR_P) "$(DESTDIR)$(simplyreddir)" @list='$(simplyred_DATA)'; test -n "$(simplyreddir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(simplyreddir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(simplyreddir)" || exit $$?; \ done uninstall-simplyredDATA: @$(NORMAL_UNINSTALL) @list='$(simplyred_DATA)'; test -n "$(simplyreddir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(simplyreddir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(simplyreddir)" && rm -f $$files install-tuxDATA: $(tux_DATA) @$(NORMAL_INSTALL) test -z "$(tuxdir)" || $(MKDIR_P) "$(DESTDIR)$(tuxdir)" @list='$(tux_DATA)'; test -n "$(tuxdir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(tuxdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(tuxdir)" || exit $$?; \ done uninstall-tuxDATA: @$(NORMAL_UNINSTALL) @list='$(tux_DATA)'; test -n "$(tuxdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(tuxdir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(tuxdir)" && rm -f $$files install-ubuntu_mono_darkDATA: $(ubuntu_mono_dark_DATA) @$(NORMAL_INSTALL) test -z "$(ubuntu_mono_darkdir)" || $(MKDIR_P) "$(DESTDIR)$(ubuntu_mono_darkdir)" @list='$(ubuntu_mono_dark_DATA)'; test -n "$(ubuntu_mono_darkdir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(ubuntu_mono_darkdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(ubuntu_mono_darkdir)" || exit $$?; \ done uninstall-ubuntu_mono_darkDATA: @$(NORMAL_UNINSTALL) @list='$(ubuntu_mono_dark_DATA)'; test -n "$(ubuntu_mono_darkdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(ubuntu_mono_darkdir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(ubuntu_mono_darkdir)" && rm -f $$files install-ubuntu_mono_lightDATA: $(ubuntu_mono_light_DATA) @$(NORMAL_INSTALL) test -z "$(ubuntu_mono_lightdir)" || $(MKDIR_P) "$(DESTDIR)$(ubuntu_mono_lightdir)" @list='$(ubuntu_mono_light_DATA)'; test -n "$(ubuntu_mono_lightdir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(ubuntu_mono_lightdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(ubuntu_mono_lightdir)" || exit $$?; \ done uninstall-ubuntu_mono_lightDATA: @$(NORMAL_UNINSTALL) @list='$(ubuntu_mono_light_DATA)'; test -n "$(ubuntu_mono_lightdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(ubuntu_mono_lightdir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(ubuntu_mono_lightdir)" && rm -f $$files tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(DATA) installdirs: for dir in "$(DESTDIR)$(jinidir)" "$(DESTDIR)$(keyboarddir)" "$(DESTDIR)$(kingsejongdir)" "$(DESTDIR)$(kingsejong2dir)" "$(DESTDIR)$(malysdir)" "$(DESTDIR)$(oniondir)" "$(DESTDIR)$(simplyreddir)" "$(DESTDIR)$(tuxdir)" "$(DESTDIR)$(ubuntu_mono_darkdir)" "$(DESTDIR)$(ubuntu_mono_lightdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-jiniDATA install-keyboardDATA \ install-kingsejong2DATA install-kingsejongDATA \ install-malysDATA install-onionDATA install-simplyredDATA \ install-tuxDATA install-ubuntu_mono_darkDATA \ install-ubuntu_mono_lightDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-jiniDATA uninstall-keyboardDATA \ uninstall-kingsejong2DATA uninstall-kingsejongDATA \ uninstall-malysDATA uninstall-onionDATA \ uninstall-simplyredDATA uninstall-tuxDATA \ uninstall-ubuntu_mono_darkDATA uninstall-ubuntu_mono_lightDATA .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic distclean \ distclean-generic distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-jiniDATA \ install-keyboardDATA install-kingsejong2DATA \ install-kingsejongDATA install-malysDATA install-man \ install-onionDATA install-pdf install-pdf-am install-ps \ install-ps-am install-simplyredDATA install-strip \ install-tuxDATA install-ubuntu_mono_darkDATA \ install-ubuntu_mono_lightDATA installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic pdf pdf-am ps ps-am uninstall \ uninstall-am uninstall-jiniDATA uninstall-keyboardDATA \ uninstall-kingsejong2DATA uninstall-kingsejongDATA \ uninstall-malysDATA uninstall-onionDATA \ uninstall-simplyredDATA uninstall-tuxDATA \ uninstall-ubuntu_mono_darkDATA uninstall-ubuntu_mono_lightDATA # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: nabi-1.0.0/po/0000755000175000017500000000000012100712171010030 500000000000000nabi-1.0.0/po/LINGUAS0000644000175000017500000000000611655153252011006 00000000000000de ko nabi-1.0.0/po/ChangeLog0000644000175000017500000000103311655153252011534 000000000000002004-02-18 Choe Hwanjin * update from GNU gettext to glib gettext 2003-07-28 gettextize * Makefile.in.in: New file, from gettext-0.12.1. * Rules-quot: New file, from gettext-0.12.1. * boldquot.sed: New file, from gettext-0.12.1. * en@boldquot.header: New file, from gettext-0.12.1. * en@quot.header: New file, from gettext-0.12.1. * insert-header.sin: New file, from gettext-0.12.1. * quot.sed: New file, from gettext-0.12.1. * remove-potcdate.sin: New file, from gettext-0.12.1. nabi-1.0.0/po/Makefile.in.in0000644000175000017500000002026511655153444012447 00000000000000# Makefile for program source directory in GNU NLS utilities package. # Copyright (C) 1995, 1996, 1997 by Ulrich Drepper # # This file file be copied and used freely without restrictions. It can # be used in projects which are not available under the GNU Public License # but which still want to provide support for the GNU gettext functionality. # Please note that the actual code is *not* freely available. # # - Modified by Owen Taylor to use GETTEXT_PACKAGE # instead of PACKAGE and to look for po2tbl in ./ not in intl/ # # - Modified by jacob berkman to install # Makefile.in.in and po2tbl.sed.in for use with glib-gettextize GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ PACKAGE = @PACKAGE@ VERSION = @VERSION@ SHELL = @SHELL@ @SET_MAKE@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ datarootdir = @datarootdir@ datadir = @datadir@ libdir = @libdir@ localedir = $(libdir)/locale gnulocaledir = $(datadir)/locale gettextsrcdir = $(datadir)/glib-2.0/gettext/po subdir = po INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ MKINSTALLDIRS = $(top_srcdir)/@MKINSTALLDIRS@ CC = @CC@ GENCAT = @GENCAT@ GMSGFMT = @GMSGFMT@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ XGETTEXT = @XGETTEXT@ MSGMERGE = msgmerge DEFS = @DEFS@ CFLAGS = @CFLAGS@ CPPFLAGS = @CPPFLAGS@ INCLUDES = -I.. -I$(top_srcdir)/intl COMPILE = $(CC) -c $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) $(XCFLAGS) SOURCES = POFILES = @POFILES@ GMOFILES = @GMOFILES@ DISTFILES = LINGUAS ChangeLog Makefile.in.in POTFILES.in $(GETTEXT_PACKAGE).pot \ $(POFILES) $(GMOFILES) $(SOURCES) POTFILES = \ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ INSTOBJEXT = @INSTOBJEXT@ .SUFFIXES: .SUFFIXES: .c .o .po .pox .gmo .mo .msg .cat .c.o: $(COMPILE) $< .po.pox: $(MAKE) $(GETTEXT_PACKAGE).pot $(MSGMERGE) $< $(srcdir)/$(GETTEXT_PACKAGE).pot -o $*.pox .po.mo: $(MSGFMT) -o $@ $< .po.gmo: file=$(srcdir)/`echo $* | sed 's,.*/,,'`.gmo \ && rm -f $$file && $(GMSGFMT) $(MSGFMT_OPTS) -o $$file $< .po.cat: sed -f ../intl/po2msg.sed < $< > $*.msg \ && rm -f $@ && $(GENCAT) $@ $*.msg all: all-@USE_NLS@ all-yes: $(CATALOGS) all-no: $(srcdir)/$(GETTEXT_PACKAGE).pot: $(POTFILES) $(XGETTEXT) --default-domain=$(GETTEXT_PACKAGE) --directory=$(top_srcdir) \ --add-comments --keyword=_ --keyword=N_ \ --keyword=C_:1c,2 \ --keyword=NC_:1c,2 \ --keyword=g_dcgettext:2 \ --keyword=g_dngettext:2,3 \ --keyword=g_dpgettext2:2c,3 \ --flag=N_:1:pass-c-format \ --flag=C_:2:pass-c-format \ --flag=NC_:2:pass-c-format \ --flag=g_dngettext:2:pass-c-format \ --flag=g_strdup_printf:1:c-format \ --flag=g_string_printf:2:c-format \ --flag=g_string_append_printf:2:c-format \ --flag=g_error_new:3:c-format \ --flag=g_set_error:4:c-format \ --flag=g_markup_printf_escaped:1:c-format \ --flag=g_log:3:c-format \ --flag=g_print:1:c-format \ --flag=g_printerr:1:c-format \ --flag=g_printf:1:c-format \ --flag=g_fprintf:2:c-format \ --flag=g_sprintf:2:c-format \ --flag=g_snprintf:3:c-format \ --flag=g_scanner_error:2:c-format \ --flag=g_scanner_warn:2:c-format \ --files-from=$(srcdir)/POTFILES.in \ && test ! -f $(GETTEXT_PACKAGE).po \ || ( rm -f $(srcdir)/$(GETTEXT_PACKAGE).pot \ && mv $(GETTEXT_PACKAGE).po $(srcdir)/$(GETTEXT_PACKAGE).pot ) install: install-exec install-data install-exec: install-data: install-data-@USE_NLS@ install-data-no: all install-data-yes: all if test -r "$(MKINSTALLDIRS)"; then \ $(MKINSTALLDIRS) $(DESTDIR)$(datadir); \ else \ $(SHELL) $(top_srcdir)/mkinstalldirs $(DESTDIR)$(datadir); \ fi @catalogs='$(CATALOGS)'; \ for cat in $$catalogs; do \ cat=`basename $$cat`; \ case "$$cat" in \ *.gmo) destdir=$(gnulocaledir);; \ *) destdir=$(localedir);; \ esac; \ lang=`echo $$cat | sed 's/\$(CATOBJEXT)$$//'`; \ dir=$(DESTDIR)$$destdir/$$lang/LC_MESSAGES; \ if test -r "$(MKINSTALLDIRS)"; then \ $(MKINSTALLDIRS) $$dir; \ else \ $(SHELL) $(top_srcdir)/mkinstalldirs $$dir; \ fi; \ if test -r $$cat; then \ $(INSTALL_DATA) $$cat $$dir/$(GETTEXT_PACKAGE)$(INSTOBJEXT); \ echo "installing $$cat as $$dir/$(GETTEXT_PACKAGE)$(INSTOBJEXT)"; \ else \ $(INSTALL_DATA) $(srcdir)/$$cat $$dir/$(GETTEXT_PACKAGE)$(INSTOBJEXT); \ echo "installing $(srcdir)/$$cat as" \ "$$dir/$(GETTEXT_PACKAGE)$(INSTOBJEXT)"; \ fi; \ if test -r $$cat.m; then \ $(INSTALL_DATA) $$cat.m $$dir/$(GETTEXT_PACKAGE)$(INSTOBJEXT).m; \ echo "installing $$cat.m as $$dir/$(GETTEXT_PACKAGE)$(INSTOBJEXT).m"; \ else \ if test -r $(srcdir)/$$cat.m ; then \ $(INSTALL_DATA) $(srcdir)/$$cat.m \ $$dir/$(GETTEXT_PACKAGE)$(INSTOBJEXT).m; \ echo "installing $(srcdir)/$$cat as" \ "$$dir/$(GETTEXT_PACKAGE)$(INSTOBJEXT).m"; \ else \ true; \ fi; \ fi; \ done if test "$(PACKAGE)" = "glib"; then \ if test -r "$(MKINSTALLDIRS)"; then \ $(MKINSTALLDIRS) $(DESTDIR)$(gettextsrcdir); \ else \ $(SHELL) $(top_srcdir)/mkinstalldirs $(DESTDIR)$(gettextsrcdir); \ fi; \ $(INSTALL_DATA) $(srcdir)/Makefile.in.in \ $(DESTDIR)$(gettextsrcdir)/Makefile.in.in; \ else \ : ; \ fi # Define this as empty until I found a useful application. installcheck: uninstall: catalogs='$(CATALOGS)'; \ for cat in $$catalogs; do \ cat=`basename $$cat`; \ lang=`echo $$cat | sed 's/\$(CATOBJEXT)$$//'`; \ rm -f $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE)$(INSTOBJEXT); \ rm -f $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE)$(INSTOBJEXT).m; \ rm -f $(DESTDIR)$(gnulocaledir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE)$(INSTOBJEXT); \ rm -f $(DESTDIR)$(gnulocaledir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE)$(INSTOBJEXT).m; \ done if test "$(PACKAGE)" = "glib"; then \ rm -f $(DESTDIR)$(gettextsrcdir)/Makefile.in.in; \ fi check: all dvi info tags TAGS ID: mostlyclean: rm -f core core.* *.pox $(GETTEXT_PACKAGE).po *.old.po cat-id-tbl.tmp rm -fr *.o clean: mostlyclean distclean: clean rm -f Makefile Makefile.in POTFILES *.mo *.msg *.cat *.cat.m maintainer-clean: distclean @echo "This command is intended for maintainers to use;" @echo "it deletes files that may require special tools to rebuild." rm -f $(GMOFILES) distdir = ../$(GETTEXT_PACKAGE)-$(VERSION)/$(subdir) dist distdir: $(DISTFILES) dists="$(DISTFILES)"; \ for file in $$dists; do \ ln $(srcdir)/$$file $(distdir) 2> /dev/null \ || cp -p $(srcdir)/$$file $(distdir); \ done update-po: Makefile $(MAKE) $(GETTEXT_PACKAGE).pot tmpdir=`pwd`; \ cd $(srcdir); \ catalogs='$(CATALOGS)'; \ for cat in $$catalogs; do \ cat=`basename $$cat`; \ lang=`echo $$cat | sed 's/\$(CATOBJEXT)$$//'`; \ echo "$$lang:"; \ if $(MSGMERGE) $$lang.po $(GETTEXT_PACKAGE).pot -o $$tmpdir/$$lang.new.po; then \ if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ rm -f $$tmpdir/$$lang.new.po; \ else \ if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ :; \ else \ echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ rm -f $$tmpdir/$$lang.new.po; \ exit 1; \ fi; \ fi; \ else \ echo "msgmerge for $$cat failed!"; \ rm -f $$tmpdir/$$lang.new.po; \ fi; \ done # POTFILES is created from POTFILES.in by stripping comments, empty lines # and Intltool tags (enclosed in square brackets), and appending a full # relative path to them POTFILES: POTFILES.in ( if test 'x$(srcdir)' != 'x.'; then \ posrcprefix='$(top_srcdir)/'; \ else \ posrcprefix="../"; \ fi; \ rm -f $@-t $@ \ && (sed -e '/^#/d' \ -e "s/^\[.*\] +//" \ -e '/^[ ]*$$/d' \ -e "s@.*@ $$posrcprefix& \\\\@" < $(srcdir)/$@.in \ | sed -e '$$s/\\$$//') > $@-t \ && chmod a-w $@-t \ && mv $@-t $@ ) Makefile: Makefile.in.in ../config.status POTFILES cd .. \ && $(SHELL) ./config.status $(subdir)/$@.in # Tell versions [3.59,3.63) of GNU make not to export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: nabi-1.0.0/po/POTFILES.in0000644000175000017500000000020711655153252011541 00000000000000src/candidate.c src/eggtrayicon.c src/fontset.c src/handler.c src/ic.c src/main.c src/server.c src/session.c src/ui.c src/preference.c nabi-1.0.0/po/nabi.pot0000644000175000017500000001341512100712130011404 00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-01-26 17:31+0900\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" #: src/candidate.c:367 msgid "hanja" msgstr "" #: src/candidate.c:374 msgid "hanja(hangul)" msgstr "" #: src/candidate.c:380 msgid "hangul(hanja)" msgstr "" #: src/eggtrayicon.c:118 msgid "Orientation" msgstr "" #: src/eggtrayicon.c:119 msgid "The orientation of the tray." msgstr "" #: src/ui.c:700 msgid "XIM Server is not running" msgstr "" #: src/ui.c:711 msgid "Total" msgstr "" #: src/ui.c:712 msgid "Space" msgstr "" #: src/ui.c:713 msgid "BackSpace" msgstr "" #: src/ui.c:714 msgid "Shift" msgstr "" #. choseong #: src/ui.c:717 msgid "Choseong" msgstr "" #. jungseong #: src/ui.c:731 msgid "Jungseong" msgstr "" #. jongseong #: src/ui.c:752 msgid "Jongseong" msgstr "" #: src/ui.c:776 msgid "Nabi keypress statistics" msgstr "" #: src/ui.c:832 msgid "About Nabi" msgstr "" #: src/ui.c:852 #, c-format msgid "" "An Easy Hangul XIM\n" "version %s\n" "\n" "Copyright (C) 2003-2011 Choe Hwanjin\n" "%s" msgstr "" #: src/ui.c:870 msgid "XIM name: " msgstr "" #: src/ui.c:876 msgid "Locale: " msgstr "" #: src/ui.c:882 msgid "Encoding: " msgstr "" #: src/ui.c:888 msgid "Connected: " msgstr "" #: src/ui.c:918 msgid "Keypress Statistics" msgstr "" #. palette menu #: src/ui.c:1030 msgid "_Show palette" msgstr "" #. hanja mode #: src/ui.c:1038 msgid "_Hanja Lock" msgstr "" #: src/ui.c:1256 msgid "" "Can't load tray icons\n" "\n" "There are some errors on loading tray icons.\n" "Nabi will use default builtin icons and the theme will be changed to default " "value.\n" "Please change the theme settings." msgstr "" #: src/ui.c:1263 msgid "Nabi: error message" msgstr "" #: src/ui.c:1449 msgid "Hanja Lock" msgstr "" #: src/ui.c:1483 msgid "_Hide palette" msgstr "" #: src/ui.c:1659 src/ui.c:1668 #, c-format msgid "Nabi: %s" msgstr "" #: src/ui.c:1671 msgid "Hangul input method: Nabi - You can input hangul using this program" msgstr "" #: src/preference.c:271 msgid "Tray icons" msgstr "" #: src/preference.c:334 msgid "Use tray icon" msgstr "" #: src/preference.c:423 msgid "Hangul keyboard" msgstr "" #: src/preference.c:433 msgid "Use system keymap" msgstr "" #: src/preference.c:463 msgid "English keyboard" msgstr "" #: src/preference.c:619 msgid "" "This key is already registered for trigger key\n" "Please select another key" msgstr "" #: src/preference.c:633 msgid "" "This key is already registered for off key\n" "Please select another key" msgstr "" #: src/preference.c:647 msgid "" "This key is already registered for candidate key\n" "Please select another key" msgstr "" #: src/preference.c:742 msgid "Trigger keys" msgstr "" #: src/preference.c:764 msgid "Select trigger key" msgstr "" #: src/preference.c:765 msgid "" "Press any key which you want to use as trigger key. The key you pressed is " "displayed below.\n" "If you want to use it, click \"Ok\" or click \"Cancel\"" msgstr "" #: src/preference.c:792 msgid "* You should restart nabi to apply above option" msgstr "" #: src/preference.c:798 msgid "Off keys" msgstr "" #: src/preference.c:818 msgid "Select off key" msgstr "" #: src/preference.c:819 msgid "" "Press any key which you want to use as off key. The key you pressed is " "displayed below.\n" "If you want to use it, click \"Ok\" or click \"Cancel\"" msgstr "" #: src/preference.c:861 msgid "Select hanja font" msgstr "" #: src/preference.c:926 msgid "Hanja Font" msgstr "" #: src/preference.c:931 msgid "Hanja keys" msgstr "" #: src/preference.c:951 msgid "Select candidate key" msgstr "" #: src/preference.c:952 msgid "" "Press any key which you want to use as candidate key. The key you pressed is " "displayed below.\n" "If you want to use it, click \"Ok\", or click \"Cancel\"" msgstr "" #. options for candidate option #: src/preference.c:968 msgid "Use simplified chinese" msgstr "" #: src/preference.c:975 msgid "Hanja Options" msgstr "" #. advanced #: src/preference.c:1113 src/preference.c:1471 msgid "Advanced" msgstr "" #: src/preference.c:1119 msgid "XIM name:" msgstr "" #: src/preference.c:1133 msgid "Use dynamic event flow" msgstr "" #: src/preference.c:1144 msgid "Commit by word" msgstr "" #: src/preference.c:1155 msgid "Automatic reordering" msgstr "" #: src/preference.c:1166 msgid "Start in hangul mode" msgstr "" #: src/preference.c:1179 msgid "Ignore fontset information from the client" msgstr "" #: src/preference.c:1193 msgid "Input mode scope: " msgstr "" #: src/preference.c:1198 msgid "per desktop" msgstr "" #: src/preference.c:1200 msgid "per application" msgstr "" #: src/preference.c:1202 msgid "per toplevel" msgstr "" #: src/preference.c:1204 msgid "per context" msgstr "" #: src/preference.c:1227 msgid "Preedit string font: " msgstr "" #: src/preference.c:1413 msgid "_Reset" msgstr "" #: src/preference.c:1438 msgid "Nabi Preferences" msgstr "" #. icons #: src/preference.c:1450 msgid "Tray" msgstr "" #. keyboard #: src/preference.c:1456 msgid "Keyboard" msgstr "" #. key #: src/preference.c:1461 msgid "Hangul" msgstr "" #. candidate #: src/preference.c:1466 msgid "Hanja" msgstr "" nabi-1.0.0/po/ko.po0000644000175000017500000002157212100712130010723 00000000000000# Copyright (C) 2007 Choe Hwanjin # This file is distributed under the same license as the Nabi package. # Choe Hwanjin , 2007. # msgid "" msgstr "" "Project-Id-Version: nabi 0.99.11\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-01-26 17:31+0900\n" "PO-Revision-Date: 2004-07-27 22:03+0900\n" "Last-Translator: Choe Hwanjin \n" "Language-Team: Choe Hwanjin \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: src/candidate.c:367 msgid "hanja" msgstr "漢字" #: src/candidate.c:374 msgid "hanja(hangul)" msgstr "漢字(한자)" #: src/candidate.c:380 msgid "hangul(hanja)" msgstr "한자(漢字)" #: src/eggtrayicon.c:118 msgid "Orientation" msgstr "" #: src/eggtrayicon.c:119 msgid "The orientation of the tray." msgstr "" #: src/ui.c:700 msgid "XIM Server is not running" msgstr "입력기 서버가 작동하지 않습니다" #: src/ui.c:711 msgid "Total" msgstr "전체" #: src/ui.c:712 msgid "Space" msgstr "스페이스" #: src/ui.c:713 msgid "BackSpace" msgstr "백스페이스" #: src/ui.c:714 msgid "Shift" msgstr "쉬프트" #. choseong #: src/ui.c:717 msgid "Choseong" msgstr "초성" #. jungseong #: src/ui.c:731 msgid "Jungseong" msgstr "중성" #. jongseong #: src/ui.c:752 msgid "Jongseong" msgstr "종성" #: src/ui.c:776 msgid "Nabi keypress statistics" msgstr "키입력 통계" #: src/ui.c:832 msgid "About Nabi" msgstr "Nabi에 대해서" #: src/ui.c:852 #, c-format msgid "" "An Easy Hangul XIM\n" "version %s\n" "\n" "Copyright (C) 2003-2011 Choe Hwanjin\n" "%s" msgstr "" "쉬운 한글 입력기\n" "버젼 %s\n" "\n" "Copyright (C) 2003-2011 최환진\n" "%s" #: src/ui.c:870 msgid "XIM name: " msgstr "XIM 이름: " #: src/ui.c:876 msgid "Locale: " msgstr "로캘: " #: src/ui.c:882 msgid "Encoding: " msgstr "인코딩: " #: src/ui.c:888 msgid "Connected: " msgstr "연결된 수: " #: src/ui.c:918 msgid "Keypress Statistics" msgstr "키입력 통계" #. palette menu #: src/ui.c:1030 msgid "_Show palette" msgstr "팔레트 보이기(_S)" #. hanja mode #: src/ui.c:1038 msgid "_Hanja Lock" msgstr "한자 전용(_H)" #: src/ui.c:1256 msgid "" "Can't load tray icons\n" "\n" "There are some errors on loading tray icons.\n" "Nabi will use default builtin icons and the theme will be changed to default " "value.\n" "Please change the theme settings." msgstr "" "상태 아이콘을 로딩할 수 없습니다\n" "\n" "상태 아이콘을 로딩하는데 오류가 있습니다.\n" "내장 아이콘을 사용하겠습니다. 테마는 기본값으로 바뀌게 됩니다.\n" "테마 설정을 바꿔주시기 바랍니다." #: src/ui.c:1263 msgid "Nabi: error message" msgstr "나비: 오류 메시지" #: src/ui.c:1449 msgid "Hanja Lock" msgstr "한자 전용" #: src/ui.c:1483 msgid "_Hide palette" msgstr "팔레트 숨기기(_H)" #: src/ui.c:1659 src/ui.c:1668 #, c-format msgid "Nabi: %s" msgstr "나비: %s" #: src/ui.c:1671 msgid "Hangul input method: Nabi - You can input hangul using this program" msgstr "한글 입력기: 나비 - 이 프로그램으로 한글을 입력할 수 있습니다" #: src/preference.c:271 msgid "Tray icons" msgstr "상태 아이콘" #: src/preference.c:334 msgid "Use tray icon" msgstr "알림 영역 아이콘 사용" #: src/preference.c:423 msgid "Hangul keyboard" msgstr "한글 자판" #: src/preference.c:433 msgid "Use system keymap" msgstr "시스템 키맵 사용" #: src/preference.c:463 msgid "English keyboard" msgstr "영어 자판" #: src/preference.c:619 msgid "" "This key is already registered for trigger key\n" "Please select another key" msgstr "" "이 키는 이미 한영 전환키로 등록되어 있습니다.\n" "다른 키를 선택해 주십시오" #: src/preference.c:633 msgid "" "This key is already registered for off key\n" "Please select another key" msgstr "" "이 키는 이미 영어 전환키로 등록되어 있습니다.\n" "다른 키를 선택해 주십시오" #: src/preference.c:647 msgid "" "This key is already registered for candidate key\n" "Please select another key" msgstr "" "이 키는 이미 한자 변환키로 등록되어 있습니다.\n" "다른 키를 선택해 주십시오" #: src/preference.c:742 msgid "Trigger keys" msgstr "한영 전환키" #: src/preference.c:764 msgid "Select trigger key" msgstr "한영 전환키를 선택합니다" #: src/preference.c:765 msgid "" "Press any key which you want to use as trigger key. The key you pressed is " "displayed below.\n" "If you want to use it, click \"Ok\" or click \"Cancel\"" msgstr "" "한영 전환키로 사용할 키를 누르시면 아래쪽에 누른 키가 표시 됩니다.\n" "그 키를 한영 전환키로 사용하시려면 \"확인\"을 누르시고 아니면 \"취소\"를 누르" "십시오." #: src/preference.c:792 msgid "* You should restart nabi to apply above option" msgstr "※ 위 옵션은 나비를 다시 시작해야 적용됩니다" #: src/preference.c:798 msgid "Off keys" msgstr "영어 전환키" #: src/preference.c:818 msgid "Select off key" msgstr "영어 전환키를 선택합니다" #: src/preference.c:819 msgid "" "Press any key which you want to use as off key. The key you pressed is " "displayed below.\n" "If you want to use it, click \"Ok\" or click \"Cancel\"" msgstr "" "영어 전환키로 사용할 키를 누르시면 아래쪽에 누른 키가 표시 됩니다.\n" "그 키를 영어 전환키로 사용하시려면 \"확인\"을 누르시고 아니면 \"취소\"를 누르" "십시오." #: src/preference.c:861 msgid "Select hanja font" msgstr "한자 선택창에 쓸 글꼴을 선택하십시오" #: src/preference.c:926 msgid "Hanja Font" msgstr "한자 글꼴" #: src/preference.c:931 msgid "Hanja keys" msgstr "한자 변환키" #: src/preference.c:951 msgid "Select candidate key" msgstr "한자 변환키를 선택합니다" #: src/preference.c:952 msgid "" "Press any key which you want to use as candidate key. The key you pressed is " "displayed below.\n" "If you want to use it, click \"Ok\", or click \"Cancel\"" msgstr "" "한자 변환키로 사용할 키를 누르시면 아래쪽에 누른 키가 표시 됩니다.\n" "그 키를 한자 변환키로 사용하시려면 \"확인\"을 누르시고 아니면 \"취소\"를 누르" "십시오." #. options for candidate option #: src/preference.c:968 msgid "Use simplified chinese" msgstr "간체자로 입력" #: src/preference.c:975 msgid "Hanja Options" msgstr "한자 옵션" #. advanced #: src/preference.c:1113 src/preference.c:1471 msgid "Advanced" msgstr "고급" #: src/preference.c:1119 msgid "XIM name:" msgstr "XIM 이름:" #: src/preference.c:1133 msgid "Use dynamic event flow" msgstr "다이나믹 이벤트 처리 사용" #: src/preference.c:1144 msgid "Commit by word" msgstr "단어 단위로 입력" #: src/preference.c:1155 msgid "Automatic reordering" msgstr "자동 순서 교정" #: src/preference.c:1166 msgid "Start in hangul mode" msgstr "시작할때 한글 상태로" #: src/preference.c:1179 msgid "Ignore fontset information from the client" msgstr "프로그램의 폰트셋 정보를 무시함" #: src/preference.c:1193 msgid "Input mode scope: " msgstr "입력 상태 관리: " #: src/preference.c:1198 msgid "per desktop" msgstr "데스크탑 마다 따로" #: src/preference.c:1200 msgid "per application" msgstr "프로그램마다 따로" #: src/preference.c:1202 msgid "per toplevel" msgstr "윈도우마다 따로" #: src/preference.c:1204 msgid "per context" msgstr "입력창마다 따로" #: src/preference.c:1227 msgid "Preedit string font: " msgstr "입력 중인 글자 글꼴: " #: src/preference.c:1413 msgid "_Reset" msgstr "초기값으로(_R)" #: src/preference.c:1438 msgid "Nabi Preferences" msgstr "나비 설정" #. icons #: src/preference.c:1450 msgid "Tray" msgstr "트레이" #. keyboard #: src/preference.c:1456 msgid "Keyboard" msgstr "자판" #. key #: src/preference.c:1461 msgid "Hangul" msgstr "한글" #. candidate #: src/preference.c:1466 msgid "Hanja" msgstr "한자" #~ msgid "2 set" #~ msgstr "두벌식" #~ msgid "3 set with 2 set layout" #~ msgstr "세벌식 두벌 자판" #~ msgid "3 set final" #~ msgstr "세벌식 최종" #~ msgid "3 set 390" #~ msgstr "세벌식 390" #~ msgid "3 set no-shift" #~ msgstr "세벌식 순아래" #~ msgid "3 set yetguel" #~ msgstr "세벌식 옛글" #~ msgid "Romaja" #~ msgstr "로마자" nabi-1.0.0/po/de.po0000644000175000017500000002247712100712130010707 00000000000000# translation of de.po to # German translation of Nabi korean input method. # Deutsche Übersetzung von Nabi, einer Eingabemethode für koreanische Zeichen # Copyright (C) YEAR Niklaus Giger # This file is distributed under the same license as the PACKAGE package. # # Choe Hwanjin , YEAR. # Niklaus Giger , 2006, 2008. msgid "" msgstr "" "Project-Id-Version: de\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-01-26 17:31+0900\n" "PO-Revision-Date: 2008-03-23 18:27+0100\n" "Last-Translator: Niklaus Giger \n" "Language-Team: \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: KBabel 1.11.4\n" #: src/candidate.c:367 msgid "hanja" msgstr "한자/Hanja" #: src/candidate.c:374 msgid "hanja(hangul)" msgstr "Hanja (Hangul)" #: src/candidate.c:380 msgid "hangul(hanja)" msgstr "Hangul(Hanja)" #: src/eggtrayicon.c:118 msgid "Orientation" msgstr "Ausrichtung" #: src/eggtrayicon.c:119 msgid "The orientation of the tray." msgstr "Ausrichtung. der Ablage." #: src/ui.c:700 msgid "XIM Server is not running" msgstr "XIM Server (Dienst für Eingabe-Methode) läuft nicht" #: src/ui.c:711 msgid "Total" msgstr "Total" #: src/ui.c:712 msgid "Space" msgstr "Grösse" #: src/ui.c:713 msgid "BackSpace" msgstr "Zurücktaste" #: src/ui.c:714 msgid "Shift" msgstr "Grosstelltaste" #. choseong #: src/ui.c:717 msgid "Choseong" msgstr "초성/Choseong" #. jungseong #: src/ui.c:731 msgid "Jungseong" msgstr "중성/Jungseong" #. jongseong #: src/ui.c:752 msgid "Jongseong" msgstr "종성/Jongseong" #: src/ui.c:776 msgid "Nabi keypress statistics" msgstr "Tastenstatistik von Nabi" #: src/ui.c:832 msgid "About Nabi" msgstr "Über Nabi" #: src/ui.c:852 #, fuzzy, c-format msgid "" "An Easy Hangul XIM\n" "version %s\n" "\n" "Copyright (C) 2003-2011 Choe Hwanjin\n" "%s" msgstr "" "Eine einfache Eingabemethode für koreanische Zeichen\n" "Nabi ist das koreanische Wort für Schmetterling.\n" "Version %s\n" "\n" "Copyright © 2003-2008 최환진/Choe Hwanjin\n" "Deutsche Übersetzung: © 2006-2008 Niklaus Giger" #: src/ui.c:870 msgid "XIM name: " msgstr "XIM Name: " #: src/ui.c:876 msgid "Locale: " msgstr "Locale (Ländereinstellung): " #: src/ui.c:882 msgid "Encoding: " msgstr "Encoding (Eingabe-Kodierung): " #: src/ui.c:888 msgid "Connected: " msgstr "Verbunden: " #: src/ui.c:918 msgid "Keypress Statistics" msgstr "Tastaturstatistik" #. palette menu #: src/ui.c:1030 msgid "_Show palette" msgstr "Zeige Hinweis" #. hanja mode #: src/ui.c:1038 #, fuzzy msgid "_Hanja Lock" msgstr "한자/Hanja Zeichensatz" #: src/ui.c:1256 msgid "" "Can't load tray icons\n" "\n" "There are some errors on loading tray icons.\n" "Nabi will use default builtin icons and the theme will be changed to default " "value.\n" "Please change the theme settings." msgstr "" "Kann ein Icon nicht laden\n" "\n" "Es gab Fehler beim Laden der Icons für die Schaltfläche. Nabi wird deshalb " "die eingebauten Icons verwenden und das verwendete Schema wird auf die " "Vorgabe zurückgesetzt.\n" "Bitte ändern Sie das Schema." #: src/ui.c:1263 msgid "Nabi: error message" msgstr "Nabi: Fehlermeldung" #: src/ui.c:1449 #, fuzzy msgid "Hanja Lock" msgstr "한자/Hanja Zeichensatz" #: src/ui.c:1483 msgid "_Hide palette" msgstr "Hinweis ausblenden" #: src/ui.c:1659 src/ui.c:1668 #, c-format msgid "Nabi: %s" msgstr "Nabi: Zeichensatz: %s" #: src/ui.c:1671 msgid "Hangul input method: Nabi - You can input hangul using this program" msgstr "" "Hangul Eingabehilfe: Nabi - Damit können Sie koreanische Zeichen eingeben." #: src/preference.c:271 msgid "Tray icons" msgstr "Icons für die Schaltfläche" #: src/preference.c:334 #, fuzzy msgid "Use tray icon" msgstr "Icons für die Schaltfläche" #: src/preference.c:423 msgid "Hangul keyboard" msgstr "Hangul/koreanische Tastatur" #: src/preference.c:433 msgid "Use system keymap" msgstr "" #: src/preference.c:463 msgid "English keyboard" msgstr "englische Tastatur" #: src/preference.c:619 msgid "" "This key is already registered for trigger key\n" "Please select another key" msgstr "" "Diese Taste wurde schon als Umschalttaste " "gewählt.\n" "Bitte eine andere Taste auswählen." #: src/preference.c:633 msgid "" "This key is already registered for off key\n" "Please select another key" msgstr "" "Diese Taste wurde schon als Ausschalttaste " "gewählt.\n" "Bitte eine andere Taste auswählen." #: src/preference.c:647 msgid "" "This key is already registered for candidate key\n" "Please select another key" msgstr "" "Diese Taste wurde schon als Kandidatauswahltaste gewählt.\n" "Bitte eine andere Taste auswählen." #: src/preference.c:742 msgid "Trigger keys" msgstr "Umschalttasten" #: src/preference.c:764 msgid "Select trigger key" msgstr "Bitte Umschalttaste auswählen" #: src/preference.c:765 msgid "" "Press any key which you want to use as trigger key. The key you pressed is " "displayed below.\n" "If you want to use it, click \"Ok\" or click \"Cancel\"" msgstr "" "Drücken Sie irgendeine Taste, welche Sie zum Umschalten verwenden möchten. " "Die gedrückte Taste wird unten dargestellt.\n" "Falls Sie sie benutzen wollen, drücken Sie \"Ok\" oder \"Abbrechen\"" #: src/preference.c:792 msgid "* You should restart nabi to apply above option" msgstr "* Sie müssen Nabi neu starten, um diese Option zu aktivieren." #: src/preference.c:798 msgid "Off keys" msgstr "Ausschalttaste." #: src/preference.c:818 msgid "Select off key" msgstr "Bitte Ausschalttaste auswählen" #: src/preference.c:819 msgid "" "Press any key which you want to use as off key. The key you pressed is " "displayed below.\n" "If you want to use it, click \"Ok\" or click \"Cancel\"" msgstr "" "Drücken Sie irgendeine Taste, welche Sie zum Umschalten verwenden möchten. " "Die gedrückte Taste wird unten dargestellt.\n" "Falls Sie sie benutzen wollen, drücken Sie \"Ok\" oder \"Abbrechen\"" #: src/preference.c:861 msgid "Select hanja font" msgstr "Wahl 한자/Hanja Zeichensatz" #: src/preference.c:926 msgid "Hanja Font" msgstr "한자/Hanja Zeichensatz" #: src/preference.c:931 msgid "Hanja keys" msgstr "한자/Hanja Tasten" #: src/preference.c:951 msgid "Select candidate key" msgstr "Bitte \"Kandidatauswahl\" Taste auswählen" #: src/preference.c:952 msgid "" "Press any key which you want to use as candidate key. The key you pressed is " "displayed below.\n" "If you want to use it, click \"Ok\", or click \"Cancel\"" msgstr "" "Drücken Sie irgendeine Taste, welche Sie als Kandidatauswahltaste verwenden " "möchten. Die gedrückte Taste wird unten dargestellt.\n" "Falls Sie sie benutzen wollen, drücken Sie \"Ok\" oder \"Abbrechen\"" #. options for candidate option #: src/preference.c:968 msgid "Use simplified chinese" msgstr "Vereinfaches Chinesisch benutzen" #: src/preference.c:975 msgid "Hanja Options" msgstr "한자/Hanja Optionen" #. advanced #: src/preference.c:1113 src/preference.c:1471 msgid "Advanced" msgstr "Feinheiten" #: src/preference.c:1119 msgid "XIM name:" msgstr "XIM Name:" #: src/preference.c:1133 msgid "Use dynamic event flow" msgstr "Dynamischen Ereignisfluss benutzen" #: src/preference.c:1144 msgid "Commit by word" msgstr "Bestätigung nach jedem Wort" #: src/preference.c:1155 msgid "Automatic reordering" msgstr "Automatische Neuanordnung" #: src/preference.c:1166 msgid "Start in hangul mode" msgstr "" #: src/preference.c:1179 msgid "Ignore fontset information from the client" msgstr "" #: src/preference.c:1193 #, fuzzy msgid "Input mode scope: " msgstr "Auswahl des Eingabemodus" #: src/preference.c:1198 msgid "per desktop" msgstr "Pro Desktop" #: src/preference.c:1200 #, fuzzy msgid "per application" msgstr "Pro Programm" #: src/preference.c:1202 msgid "per toplevel" msgstr "Pro höchste Stufe" #: src/preference.c:1204 msgid "per context" msgstr "Pro Kontext" #: src/preference.c:1227 msgid "Preedit string font: " msgstr "" #: src/preference.c:1413 msgid "_Reset" msgstr "" #: src/preference.c:1438 msgid "Nabi Preferences" msgstr "Einstellungen von Nabi" #. icons #: src/preference.c:1450 msgid "Tray" msgstr "Schaltfläche" #. keyboard #: src/preference.c:1456 msgid "Keyboard" msgstr "Tastatur" #. key #: src/preference.c:1461 msgid "Hangul" msgstr "한글/Hangul" #. candidate #: src/preference.c:1466 msgid "Hanja" msgstr "한자/Hanja" #~ msgid "2 set" #~ msgstr "두벌식/ 2-fach belegt" #~ msgid "3 set with 2 set layout" #~ msgstr "세벌식 두벌 자판/ 3-fach belegt mit 2-fach Anordnung" #~ msgid "3 set final" #~ msgstr "세벌식 최종/ 3-fach endgültig" #~ msgid "3 set 390" #~ msgstr "세벌식 390/ 3-fach 390" #~ msgid "3 set no-shift" #~ msgstr "세벌식 순아래/ 3-fach ohne Umschalttaste" #~ msgid "3 set yetguel" #~ msgstr "세벌식 옛글/ 3-fach alte Schrift" nabi-1.0.0/po/ko.gmo0000644000175000017500000001512612100712171011072 00000000000000EDal/`!&f%#%  &09HYC`    * ' 1 ; D X i     Q m       f `> d     ' > U g u     Z?za*;&f#' 6DVK    - 7>EL ]k |q#B4f##   $-> lx $?043<+ C% &@/#"1?-$.A!9E>  B6;2='58()D *7,:* You should restart nabi to apply above optionAn Easy Hangul XIM version %s Copyright (C) 2003-2011 Choe Hwanjin %sCan't load tray icons There are some errors on loading tray icons. Nabi will use default builtin icons and the theme will be changed to default value. Please change the theme settings.Connected: Encoding: Locale: XIM name: About NabiAdvancedAutomatic reorderingBackSpaceChoseongCommit by wordEnglish keyboardHangulHangul input method: Nabi - You can input hangul using this programHangul keyboardHanjaHanja FontHanja LockHanja OptionsHanja keysIgnore fontset information from the clientInput mode scope: JongseongJungseongKeyboardKeypress StatisticsNabi PreferencesNabi keypress statisticsNabi: %sNabi: error messageOff keysPreedit string font: Press any key which you want to use as candidate key. The key you pressed is displayed below. If you want to use it, click "Ok", or click "Cancel"Press any key which you want to use as off key. The key you pressed is displayed below. If you want to use it, click "Ok" or click "Cancel"Press any key which you want to use as trigger key. The key you pressed is displayed below. If you want to use it, click "Ok" or click "Cancel"Select candidate keySelect hanja fontSelect off keySelect trigger keyShiftSpaceStart in hangul modeThis key is already registered for candidate key Please select another keyThis key is already registered for off key Please select another keyThis key is already registered for trigger key Please select another keyTotalTrayTray iconsTrigger keysUse dynamic event flowUse simplified chineseUse system keymapUse tray iconXIM Server is not runningXIM name:_Hanja Lock_Hide palette_Reset_Show palettehangul(hanja)hanjahanja(hangul)per applicationper contextper desktopper toplevelProject-Id-Version: nabi 0.99.11 Report-Msgid-Bugs-To: POT-Creation-Date: 2013-01-26 17:31+0900 PO-Revision-Date: 2004-07-27 22:03+0900 Last-Translator: Choe Hwanjin Language-Team: Choe Hwanjin Language: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ※ 위 옵션은 나비를 다시 시작해야 적용됩니다쉬운 한글 입력기 버젼 %s Copyright (C) 2003-2011 최환진 %s상태 아이콘을 로딩할 수 없습니다 상태 아이콘을 로딩하는데 오류가 있습니다. 내장 아이콘을 사용하겠습니다. 테마는 기본값으로 바뀌게 됩니다. 테마 설정을 바꿔주시기 바랍니다.연결된 수: 인코딩: 로캘: XIM 이름: Nabi에 대해서고급자동 순서 교정백스페이스초성단어 단위로 입력영어 자판한글한글 입력기: 나비 - 이 프로그램으로 한글을 입력할 수 있습니다한글 자판한자한자 글꼴한자 전용한자 옵션한자 변환키프로그램의 폰트셋 정보를 무시함입력 상태 관리: 종성중성자판키입력 통계나비 설정키입력 통계나비: %s나비: 오류 메시지영어 전환키입력 중인 글자 글꼴: 한자 변환키로 사용할 키를 누르시면 아래쪽에 누른 키가 표시 됩니다. 그 키를 한자 변환키로 사용하시려면 "확인"을 누르시고 아니면 "취소"를 누르십시오.영어 전환키로 사용할 키를 누르시면 아래쪽에 누른 키가 표시 됩니다. 그 키를 영어 전환키로 사용하시려면 "확인"을 누르시고 아니면 "취소"를 누르십시오.한영 전환키로 사용할 키를 누르시면 아래쪽에 누른 키가 표시 됩니다. 그 키를 한영 전환키로 사용하시려면 "확인"을 누르시고 아니면 "취소"를 누르십시오.한자 변환키를 선택합니다한자 선택창에 쓸 글꼴을 선택하십시오영어 전환키를 선택합니다한영 전환키를 선택합니다쉬프트스페이스시작할때 한글 상태로이 키는 이미 한자 변환키로 등록되어 있습니다. 다른 키를 선택해 주십시오이 키는 이미 영어 전환키로 등록되어 있습니다. 다른 키를 선택해 주십시오이 키는 이미 한영 전환키로 등록되어 있습니다. 다른 키를 선택해 주십시오전체트레이상태 아이콘한영 전환키다이나믹 이벤트 처리 사용간체자로 입력시스템 키맵 사용알림 영역 아이콘 사용입력기 서버가 작동하지 않습니다XIM 이름:한자 전용(_H)팔레트 숨기기(_H)초기값으로(_R)팔레트 보이기(_S)한자(漢字)漢字漢字(한자)프로그램마다 따로입력창마다 따로데스크탑 마다 따로윈도우마다 따로nabi-1.0.0/po/de.gmo0000644000175000017500000001354312100712171011052 00000000000000<S(/)Y&=%d#%  0C7{     - 6Ba    ' : @ F fc ` d+        ! / 5 C O [ gh > &9E8%   +H [Ki  !2CL^u V(;YyysBr) /=Z"i 5    ) 8 DP,2/<(.$!8#53: 0*6 +9-1 )& %7;4"'  * You should restart nabi to apply above optionCan't load tray icons There are some errors on loading tray icons. Nabi will use default builtin icons and the theme will be changed to default value. Please change the theme settings.Connected: Encoding: Locale: XIM name: About NabiAdvancedAutomatic reorderingBackSpaceChoseongCommit by wordEnglish keyboardHangulHangul input method: Nabi - You can input hangul using this programHangul keyboardHanjaHanja FontHanja OptionsHanja keysJongseongJungseongKeyboardKeypress StatisticsNabi PreferencesNabi keypress statisticsNabi: %sNabi: error messageOff keysOrientationPress any key which you want to use as candidate key. The key you pressed is displayed below. If you want to use it, click "Ok", or click "Cancel"Press any key which you want to use as off key. The key you pressed is displayed below. If you want to use it, click "Ok" or click "Cancel"Press any key which you want to use as trigger key. The key you pressed is displayed below. If you want to use it, click "Ok" or click "Cancel"Select candidate keySelect hanja fontSelect off keySelect trigger keyShiftSpaceThe orientation of the tray.This key is already registered for candidate key Please select another keyThis key is already registered for off key Please select another keyThis key is already registered for trigger key Please select another keyTotalTrayTray iconsTrigger keysUse dynamic event flowUse simplified chineseXIM Server is not runningXIM name:_Hide palette_Show palettehangul(hanja)hanjahanja(hangul)per contextper desktopper toplevelProject-Id-Version: de Report-Msgid-Bugs-To: POT-Creation-Date: 2013-01-26 17:31+0900 PO-Revision-Date: 2008-03-23 18:27+0100 Last-Translator: Niklaus Giger Language-Team: Language: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: KBabel 1.11.4 * Sie müssen Nabi neu starten, um diese Option zu aktivieren.Kann ein Icon nicht laden Es gab Fehler beim Laden der Icons für die Schaltfläche. Nabi wird deshalb die eingebauten Icons verwenden und das verwendete Schema wird auf die Vorgabe zurückgesetzt. Bitte ändern Sie das Schema.Verbunden: Encoding (Eingabe-Kodierung): Locale (Ländereinstellung): XIM Name: Über NabiFeinheitenAutomatische NeuanordnungZurücktaste초성/ChoseongBestätigung nach jedem Wortenglische Tastatur한글/HangulHangul Eingabehilfe: Nabi - Damit können Sie koreanische Zeichen eingeben.Hangul/koreanische Tastatur한자/Hanja한자/Hanja Zeichensatz한자/Hanja Optionen한자/Hanja Tasten종성/Jongseong중성/JungseongTastaturTastaturstatistikEinstellungen von NabiTastenstatistik von NabiNabi: Zeichensatz: %sNabi: FehlermeldungAusschalttaste.AusrichtungDrücken Sie irgendeine Taste, welche Sie als Kandidatauswahltaste verwenden möchten. Die gedrückte Taste wird unten dargestellt. Falls Sie sie benutzen wollen, drücken Sie "Ok" oder "Abbrechen"Drücken Sie irgendeine Taste, welche Sie zum Umschalten verwenden möchten. Die gedrückte Taste wird unten dargestellt. Falls Sie sie benutzen wollen, drücken Sie "Ok" oder "Abbrechen"Drücken Sie irgendeine Taste, welche Sie zum Umschalten verwenden möchten. Die gedrückte Taste wird unten dargestellt. Falls Sie sie benutzen wollen, drücken Sie "Ok" oder "Abbrechen"Bitte "Kandidatauswahl" Taste auswählenWahl 한자/Hanja ZeichensatzBitte Ausschalttaste auswählenBitte Umschalttaste auswählenGrosstelltasteGrösseAusrichtung. der Ablage.Diese Taste wurde schon als Kandidatauswahltaste gewählt. Bitte eine andere Taste auswählen.Diese Taste wurde schon als Ausschalttaste gewählt. Bitte eine andere Taste auswählen.Diese Taste wurde schon als Umschalttaste gewählt. Bitte eine andere Taste auswählen.TotalSchaltflächeIcons für die SchaltflächeUmschalttastenDynamischen Ereignisfluss benutzenVereinfaches Chinesisch benutzenXIM Server (Dienst für Eingabe-Methode) läuft nichtXIM Name:Hinweis ausblendenZeige HinweisHangul(Hanja)한자/HanjaHanja (Hangul)Pro KontextPro DesktopPro höchste Stufe