summaryrefslogtreecommitdiffstats
path: root/src/main.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.cpp')
-rw-r--r--src/main.cpp227
1 files changed, 227 insertions, 0 deletions
diff --git a/src/main.cpp b/src/main.cpp
new file mode 100644
index 0000000..01c5148
--- /dev/null
+++ b/src/main.cpp
@@ -0,0 +1,227 @@
+/***************************************************************************
+ * Copyright (C) 2007 by Todor Gyumyushev *
+ * yodor@developer.bg *
+ * *
+ * 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., *
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ ***************************************************************************/
+
+
+
+#include <kaboutdata.h>
+#include <kcmdlineargs.h>
+#include <klocale.h>
+#include <kuniqueapplication.h>
+
+
+#include "MainWidget.h"
+
+#include <X11/Xlib.h>
+
+
+
+static const char description[] =
+ I18N_NOOP("A virtual keyboard for KDE");
+
+static const char version[] = "0.4.8";
+
+static KCmdLineOptions options[] =
+{
+ { "loginhelper", I18N_NOOP("Stand alone version for use with KDM or XDM. \nYou should Add : HOME=/root kvkbd --loginhelper & to Xsetup to run in xdm/kdm"), 0 },
+};
+
+
+void findAloneWindow()
+{
+ unsigned int numkids, i,mapped,scrn;
+ Window r, p;
+ Window *kids=0;
+ //XWindowAttributes attr;
+ Window root;
+ Display *dipsy=0;
+ char *win_name=0;
+
+ dipsy = XOpenDisplay(0);
+ if (!dipsy)return;
+
+ scrn = DefaultScreen(dipsy);
+ root = RootWindow(dipsy, scrn);
+
+ mapped = 0;
+ XQueryTree(dipsy, root, &r, &p, &kids, &numkids);
+
+
+ for (i = 0; i < numkids; ++i)
+ {
+ XFetchName(dipsy, kids[i], &win_name);
+ QString c(win_name);
+
+ if (c=="kvkbdalone")
+ {
+ long wid = kids[i];
+ XDestroyWindow(dipsy,wid);
+ XFlush(dipsy);
+ i=numkids;
+ }
+ XFree(win_name);
+ }
+ XCloseDisplay(dipsy);
+}
+
+class Kvkbd : public KUniqueApplication
+{
+
+public:
+ Kvkbd(): KUniqueApplication(true,true,true) {
+
+ };
+
+
+ int newInstance(){
+ MainWidget *main = (MainWidget *)mainWidget();
+ if (!main)
+ {
+ main = new MainWidget(const_cast<KAboutData *>(aboutData()),false, 0, "kvkbd");
+ setMainWidget(main);
+ }
+
+ main->restorePosition();
+ main->finishInit();
+ return 0;
+ };
+
+ QCStringList functions () {
+ QCStringList c;
+ c << "show()";
+ c << "hide()";
+ c << "state()";
+ return c;
+ }
+ bool process(const QCString &fun, const QByteArray &data,
+ QCString &replyType, QByteArray &replyData) {
+
+
+ QDataStream io(replyData,IO_WriteOnly);
+ replyType="QCString";
+ MainWidget *main = (MainWidget *)mainWidget();
+ if (main) {
+ if (fun == "show()") {
+ main->show();
+ io<<"Success";
+ return true;
+ }
+ else if (fun == "hide()") {
+ main->hide();
+ io<<"Success";
+ return true;
+ }
+ else if (fun == "state()") {
+ io << (main->isShown()?"visible":"hidden");
+ return true;
+ }
+ }
+
+ return KUniqueApplication::process(fun,data,replyType,replyData);
+
+ };
+
+ bool x11EventFilter ( XEvent *event ){
+ MainWidget *main = (MainWidget *)mainWidget();
+ if (main) {
+ if (event->type==MappingNotify) {
+ XMappingEvent *e = (XMappingEvent *)event;
+ if (e->request== MappingKeyboard) {
+ main->mappingNotify(e);
+ }
+ }
+ }
+
+ return false;
+ };
+
+
+};
+
+class KvkbdApp : public QApplication
+{
+public:
+ KvkbdApp(int argc, char** argv, bool gui):QApplication(argc,argv,gui){
+
+ };
+
+ bool x11EventFilter ( XEvent *event ) {
+ if (event->type == DestroyNotify) {
+ QApplication::exit();
+ }
+ else if (event->type == MappingNotify) {
+
+ MainWidget *main = (MainWidget *)mainWidget();
+ if (main) {
+ XMappingEvent *e = (XMappingEvent *) event;
+ if (e->request==MappingKeyboard) {
+ main->mappingNotify(e);
+ }
+ }
+
+ }
+ return false;
+ };
+};
+
+int main(int argc, char **argv)
+{
+
+ KAboutData about("kvkbd", I18N_NOOP("kvkbd"), version, description,
+ KAboutData::License_GPL, "(C) 2007 Todor Gyumyushev", 0, 0, "yodor@developer.bg");
+ about.addAuthor( "Todor Gyumyushev", 0, "yodor@developer.bg" );
+
+ int alone=0;
+
+ if (argc>0) {
+ int curr=0;
+ while (curr<argc) {
+ if (strcmp(argv[curr],"-loginhelper")==0){
+ alone=1;
+
+ break;
+ }
+ curr++;
+ }
+
+ }
+ argc++;
+ if (alone==1){
+ KvkbdApp a(argc,argv,true);
+ MainWidget m( &about, true, 0, "kvkbdalone");
+ a.setMainWidget(&m);
+ m.restorePosition();
+ m.show();
+ return a.exec();
+ }
+ else
+ {
+
+ KCmdLineArgs::init(argc, argv, &about);
+ KCmdLineArgs::addCmdLineOptions( options );
+ Kvkbd::addCmdLineOptions();
+ //KCmdLineArgs *args = KCmdLineArgs::parsedArgs();
+
+ findAloneWindow();
+ Kvkbd a;
+ return a.exec();
+ }
+
+}
+