/***************************************************************************
* 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();
}