added WTimer to evaluate the UI calls in the correct thread, does not
authorvisnov <visnov@e0cc52ee-31ee-0310-8b87-e83c4596d67c>
Tue, 13 Nov 2007 14:34:07 +0000 (14:34 +0000)
committervisnov <visnov@e0cc52ee-31ee-0310-8b87-e83c4596d67c>
Tue, 13 Nov 2007 14:34:07 +0000 (14:34 +0000)
work so far

git-svn-id: http://svn.opensuse.org/svn/yast/branches/tmp/sh/mod-ui/web-wt@42023 e0cc52ee-31ee-0310-8b87-e83c4596d67c

src/Makefile.am
src/YWebPushButton.cc
src/YWebUI.h
src/YWebUI_core.cc

index 91504cc..dcf4cdf 100644 (file)
@@ -23,6 +23,7 @@ noinst_HEADERS = $(wildcard *.h)
 libpy2web_la_SOURCES =                         \
        Y2CCWeb.cc                              \
                                                \
+       YWebUIComponent.cc                      \
        YWebUI_core.cc                          \
        YWebUI_widgets.cc                       \
        YWebUI_builtins.cc                      \
index 7b59c2a..da989b6 100644 (file)
 #define y2log_component "web-ui"
 #include <ycp/y2log.h>
 
+#include <sys/types.h>
+
 #include "YWebPushButton.h"
 
+#include <WPushButton>
+#include <WApplication>
 
 using std::string;
+using namespace Wt;
+
+#include <unistd.h>
+#include <sys/syscall.h>
+#include <sys/types.h>
 
+pid_t gettid()
+{
+    pid_t tid;
+    tid = syscall(SYS_gettid);
+    return tid;
+}
+
+
+// HACK
+extern WApplication* _wApp;
 
 YWebPushButton::YWebPushButton( YWidget * parent, const string & label )
     : YPushButton( parent, label )
 {
+    if( ! widgetRep() ) {
+
+       y2security( "Using application %p, tid %d",  _wApp, gettid());
+        setWidgetRep( new WPushButton(label,  _wApp->root() ) );
+        y2milestone( "Pushbutton %s created", label.c_str());
+    }
 }
 
 
index 3b97bc7..38defd9 100644 (file)
@@ -24,6 +24,7 @@
 #include <YUI.h>
 
 #include <WApplication>
+#include <WTimer>
 #include <WEnvironment>
 
 class YEvent;
@@ -394,6 +395,14 @@ protected:
     YSimpleEventHandler _event_handler;
 
 public:
+    void createTimer() ;
+
+    void triggeredTimer();
+
+    Wt::WTimer* _timer;
+    
+    bool _wtimer_work;
+    
     static int _argc;
     static char** _argv;
 };
index bd9d95c..befb670 100644 (file)
@@ -23,6 +23,8 @@
 #include <ycp/YCPTerm.h>
 #include <ycp/YCPCode.h>
 
+#include <yui/Y2UINamespace.h>
+
 #define y2log_component "web-ui"
 #include <ycp/y2log.h>
 
@@ -38,7 +40,9 @@ using namespace Wt;
 
 YWebUI * YWebUI::_ui = 0;
 int YWebUI::_argc = 0;
-char ** YWebUI::_argv = 0L;
+char ** YWebUI::_argv = 0;
+
+WApplication* _wApp = 0;
 
 YWebUI::YWebUI( const Wt::WEnvironment& env, const char * macro_file )
     : WApplication(env),
@@ -49,6 +53,7 @@ YWebUI::YWebUI( const Wt::WEnvironment& env, const char * macro_file )
     _ui                                = this;
     _fatal_error               = false;
 
+    _builtinCallData.function = 0;
 //    processCommandLineArgs( argc, argv );
 
     topmostConstructorHasFinished();
@@ -118,8 +123,37 @@ void YWebUI::internalError( const char * msg )
 
 void YWebUI::idleLoop( int fd_ycp )
 {
-    // FIXME
-    _leave_idle_loop = true;
+    while ( true )
+    {
+        sleep(1);      // idleLoop ( pipe_to_ui[0] );
+
+        // The pipe is non-blocking, so we have to check if we really read a
+        // signal byte. Although idleLoop already makes a select, this seems to
+        // be necessary.  Anyway: Why do we set the pipe to non-blocking if we
+        // wait in idleLoop for it to become readable? It is needed in
+        // YUIQt::idleLoop for QSocketNotifier.
+
+       y2milestone( "Waiting for work from YCP" );
+       
+        if ( ! waitForYCPThread () )
+            continue;
+
+        if ( terminate_ui_thread )
+            return;
+
+       _wtimer_work = true;
+        
+       y2security( "%s", _builtinCallData.function->name().c_str());
+       
+       while( _wtimer_work )
+       {
+           sleep(1);
+       }
+       // _builtinCallData.result = _builtinCallData.function->evaluateCall_int();
+
+        signalYCPThread();
+    }
+
 }
 
 
@@ -234,12 +268,18 @@ void YWebUI::closeDialog( YDialog * dialog )
     // FIXME
 }
 
+extern pid_t gettid();
 
 WApplication *createApplication(const WEnvironment& env)
 {
   // Instantiate the Wt application.
   YWebUI *appl = new YWebUI( env, 0 );
 
+  // HACK!!!! - not a singleton
+  _wApp = appl;
+  
+  y2security( "Application: %p, thread %d", _wApp, gettid());
+
     // Set window title
 
     std::string title( "YaST2" );
@@ -266,13 +306,9 @@ WApplication *createApplication(const WEnvironment& env)
   // Set application title
   appl->setTitle(title);
 
-#if 0
   // Set up a timer for handling YaST requests
   appl->createTimer();
 
-  _wtimer_work = true;
-#endif
-
   return appl;
 }
 
@@ -285,3 +321,35 @@ void *start_webserver_thread( void * yui )
 
     return 0;
 }
+
+void YWebUI::createTimer()
+{
+    _timer = new WTimer();
+    _timer->setInterval( 1000 ); // 1 sec
+
+    _timer->timeout.connect( SLOT(this, YWebUI::triggeredTimer ) );
+
+    _timer->start();
+}
+
+void YWebUI::triggeredTimer()
+{
+    y2debug ("Timer triggered");
+    if( _wtimer_work && _builtinCallData.function )
+    {
+
+        y2milestone("Work to do in %p, function '%s'", this, _builtinCallData.function->name().c_str());
+
+        // callFunction() checks for NULL function pointers
+        //      (dynamic_cast<WTimer*>(WObject::sender()))->stop ();
+
+       _builtinCallData.result = _builtinCallData.function->evaluateCall_int();
+       
+       _builtinCallData.function = 0;
+       
+        _wtimer_work = false;
+       
+       signalYCPThread();
+    }
+}
+