/*************************************************************************** * Copyright (C) 2005 by Teppei Tamra * * TAM(tam-t@par.odn.ne.jp) * * * * 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 Q_WS_X11 # include <X11/Xlib.h> #endif */ #define Uses_SCIM_SOCKET #define Uses_SCIM_TRANSACTION #define Uses_SCIM_HELPER #include <scim.h> #include <ctype.h> #include <unistd.h> #include <sys/types.h> #include <sys/select.h> #include "nagisa.h" #include <nagisakeyboard.h> #include <qlayout.h> static scim::HelperAgent agent; nagisa::nagisa(const QString &xml) // : QWidget( 0, "nagisa",Qt::WStyle_Customize | Qt::WStyle_DialogBorder | Qt::WStyle_StaysOnTop) : QWidget( 0, "nagisa", Qt::WStyle_Customize | Qt::WX11BypassWM | Qt::WStyle_StaysOnTop) { keytable = xml; if (keytable == "") keytable = "jp109.xml"; id = -1; mousePress = false; QVBoxLayout *lay = new QVBoxLayout(this); lay->setAutoAdd(true); scaleButton = new QToolButton(this); scaleButton->setText(tr("Nagisa Keypad")); scaleButton->setMouseTracking(true); menu = new QPopupMenu(scaleButton); menu_scale = menu->insertItem(tr("hide"),this,SLOT(scale())); menu_connect = menu->insertItem(tr("connect"),this,SLOT(connectToScim())); QPopupMenu *resizeMenu = new QPopupMenu(menu); resizeMenu->insertItem(tr("enlarge"),this,SLOT(enlarge())); resizeMenu->insertItem(tr("shrink"),this,SLOT(shrink())); menu->insertItem(tr("size"),resizeMenu); menu_exit = menu->insertItem(tr("exit"),this,SLOT(close())); scaleButton->setPopup(menu); connect(scaleButton,SIGNAL(clicked()),this,SLOT(scale())); createKeyboaed(keytable); show(); connectToScim(); } nagisa::~nagisa() { } /*! \fn nagisa::createKeyboaed(const QString &xml) */ void nagisa::createKeyboaed(const QString &xml) { NagisaKeyboard *b = new NagisaKeyboard(xml,this); contents = b; connect(b,SIGNAL(pressed(const QString& )),this,SLOT(sendKeyPressEvent(const QString& ))); connect(b,SIGNAL(released(const QString& )),this,SLOT(sendKeyReleaseEvent(const QString& ))); connect(b,SIGNAL(status(const QString& )),this,SLOT(updateStatus(const QString& ))); b->show(); status = new QLabel(this); status->show(); } /*! \fn nagisa::sendKeyPressEvent(const QString &e) */ void nagisa::sendKeyPressEvent(const QString &e) { if (id < 0) return; scim::KeyEvent key; if (!scim::scim_string_to_key(key,e)) return; agent.send_key_event(-1,"",key); } /*! \fn nagisa::sendKeyReleaseEvent(const QString &e) */ void nagisa::sendKeyReleaseEvent(const QString &e) { if (id < 0) return; scim::KeyEvent key; if (!scim::scim_string_to_key(key,e)) return; key.mask |= scim::SCIM_KEY_ReleaseMask; agent.send_key_event(-1,"",key); } /*! \fn nagisa::mousePressEvent(QMouseEvent *e) */ void nagisa::mousePressEvent(QMouseEvent *e) { mousePress = true; mouseX = e->x(); mouseY = e->y(); } /*! \fn nagisa::mouseReleaseEvent(QMouseEvent *e) */ void nagisa::mouseReleaseEvent(QMouseEvent *e) { mousePress = false; mouseX = e->x(); mouseY = e->y(); } /*! \fn nagisa::mouseMoveEvent(QMouseEvent *e) */ void nagisa::mouseMoveEvent(QMouseEvent *e) { if (mousePress) { move(e->globalX() - mouseX,e->globalY() - mouseY); } } /*! \fn nagisa::scale() */ void nagisa::scale() { if (contents->isShown()) { contents->hide(); status->hide(); menu->changeItem(menu_scale,tr("show")); } else { contents->show(); status->show(); menu->changeItem(menu_scale,tr("hide")); } adjustSize(); } /*! \fn nagisa::connectToScim() */ void nagisa::connectToScim() { if (id < 0) { scim::HelperInfo info("e135e0ee-5588-423e-a027-f07d769c12a3","Nagisa","","Nagisa helper.", scim::SCIM_HELPER_STAND_ALONE | scim::SCIM_HELPER_NEED_SCREEN_INFO | scim::SCIM_HELPER_NEED_SPOT_LOCATION_INFO); // 以下、本来やはりこうするべきかと。 // #ifdef Q_WS_X11 // scim::String display = XDisplayString(qt_xdisplay()); // #else // scim::String display = getenv("DISPLAY"); // #endif scim::String display = getenv("DISPLAY"); id = agent.open_connection(info,display); } else { agent.close_connection(); id = -1; } if (id < 0) menu->changeItem(menu_connect,tr("connect")); else menu->changeItem(menu_connect,tr("disconnect")); } /*! \fn nagisa::updateStatus(const QString &s) */ void nagisa::updateStatus(const QString &s) { status->setText(s); } /*! \fn nagisa::enlarge() */ void nagisa::enlarge() { delete(contents); delete(status); KeyButton::buttonSize += 5; createKeyboaed(keytable); adjustSize(); } /*! \fn nagisa::shrink() */ void nagisa::shrink() { if ((KeyButton::buttonSize - 5) <= 0) return; size -= 5; delete(contents); delete(status); KeyButton::buttonSize -= 5; createKeyboaed(keytable); adjustSize(); }