diff -Naur SDL-1.2.9-orig/configure.in SDL-1.2.9/configure.in
--- SDL-1.2.9-orig/configure.in	2005-08-28 08:31:18.000000000 +0200
+++ SDL-1.2.9/configure.in	2007-03-12 20:55:18.000000000 +0100
@@ -1912,7 +1912,7 @@
         # Set up files for the main() stub
         if test "x$video_qtopia" = "xyes"; then
           SDL_CFLAGS="$SDL_CFLAGS -Dmain=SDL_main"
-          SDL_LIBS="-lSDLmain $SDL_LIBS"
+
         fi
         # Set up files for the audio library
         # We use the OSS and ALSA API's, not the Sun audio API
diff -Naur SDL-1.2.9-orig/src/main/Makefile.am SDL-1.2.9/src/main/Makefile.am
--- SDL-1.2.9-orig/src/main/Makefile.am	2004-02-12 07:21:13.000000000 +0100
+++ SDL-1.2.9/src/main/Makefile.am	2007-03-12 20:55:18.000000000 +0100
@@ -21,11 +21,7 @@
 if TARGET_MACOSX
 MAINLIB_ARCH_SRCS = macosx/SDLMain.m macosx/SDLMain.h
 else
-if TARGET_QTOPIA
-MAINLIB_ARCH_SRCS = qtopia/SDL_qtopia_main.cc
-else
 MAINLIB_ARCH_SRCS = dummy/SDL_dummy_main.c
-endif # !TARGET_QTOPIA
 endif # !TARGET_MACOSX
 endif # !TARGET_WIN32
 libSDLmain_a_SOURCES = $(MAINLIB_ARCH_SRCS)
diff -Naur SDL-1.2.9-orig/src/main/qtopia/SDL_qtopia_main.cc SDL-1.2.9/src/main/qtopia/SDL_qtopia_main.cc
--- SDL-1.2.9-orig/src/main/qtopia/SDL_qtopia_main.cc	2003-12-14 07:25:53.000000000 +0100
+++ SDL-1.2.9/src/main/qtopia/SDL_qtopia_main.cc	1970-01-01 01:00:00.000000000 +0100
@@ -1,47 +0,0 @@
-
-/* Include the SDL main definition header */
-#include "SDL_main.h"
-#include <stdlib.h>
-#include <unistd.h>
-#ifdef main
-#undef main
-#endif
-#ifdef QWS
-#include <qpe/qpeapplication.h>
-#include <qapplication.h>
-#include <qpe/qpeapplication.h>
-#include <stdlib.h>
-
-// Workaround for OPIE to remove taskbar icon. Also fixes
-// some issues in Qtopia where there are left-over qcop files in /tmp/.
-// I'm guessing this will also clean up the taskbar in the Sharp version
-// of Qtopia.
-static inline void cleanupQCop() {
-  QString appname(qApp->argv()[0]);
-  int slash = appname.findRev("/");
-  if(slash != -1) {  appname = appname.mid(slash+1); }
-  QString cmd = QPEApplication::qpeDir() + "bin/qcop QPE/System 'closing(QString)' '"+appname+"'";
-  system(cmd.latin1());
-  cmd = "/tmp/qcop-msg-"+appname;
-  unlink(cmd.latin1());
-}
-
-static QPEApplication *app;
-#endif
-
-extern int SDL_main(int argc, char *argv[]);
-
-int main(int argc, char *argv[])
-{
-#ifdef QWS
-  // This initializes the Qtopia application. It needs to be done here
-  // because it parses command line options.
-  app = new QPEApplication(argc, argv);
-  QWidget dummy;
-  app->showMainWidget(&dummy);
-  atexit(cleanupQCop);
-#endif
-  // Exit here because if return is used, the application
-  // doesn't seem to quit correctly.
-  exit(SDL_main(argc, argv));
-}
diff -Naur SDL-1.2.9-orig/src/video/qtopia/Makefile.am SDL-1.2.9/src/video/qtopia/Makefile.am
--- SDL-1.2.9-orig/src/video/qtopia/Makefile.am	2002-05-28 21:24:11.000000000 +0200
+++ SDL-1.2.9/src/video/qtopia/Makefile.am	2007-03-12 20:55:18.000000000 +0100
@@ -15,4 +15,5 @@
 	SDL_syswm.cc		\
 	SDL_syswm_c.h		\
 	SDL_sysevents.cc	\
-	SDL_sysevents_c.h	
+	SDL_sysevents_c.h       \
+	SDL_qmain.cc
diff -Naur SDL-1.2.9-orig/src/video/qtopia/SDL_qmain.cc SDL-1.2.9/src/video/qtopia/SDL_qmain.cc
--- SDL-1.2.9-orig/src/video/qtopia/SDL_qmain.cc	1970-01-01 01:00:00.000000000 +0100
+++ SDL-1.2.9/src/video/qtopia/SDL_qmain.cc	2007-03-12 20:55:18.000000000 +0100
@@ -0,0 +1,99 @@
+/* Include the SDL main definition header */
+#include "SDL_main.h"
+#include <stdlib.h>
+
+#include <sys/types.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+
+#ifdef QWS
+#include <qpe/qpeapplication.h>
+#include <stdlib.h>
+#include <string.h>
+
+
+
+static QWidget        *dummyW = 0;
+static QPEApplication *theApp = 0;
+static char          **cmdline= 0;
+static int             size   = 0;
+
+static void parse_cmd_line() {
+    /*
+     * find the number
+     */
+    char buf[1024];
+    int available = 0;
+    char *string_start = 0;
+    int fd = ::open( "/proc/self/cmdline", O_RDONLY );
+    if ( fd < 0 ) {
+        qWarning( "Error getting  the cmdline, can't be" );
+        goto error_out;
+    }
+
+    available = ::read( fd, &buf, sizeof(buf) );
+    if ( available <= 0 )
+        goto error_out;
+
+    /*
+     * find out the number of arguments
+     */
+    size = 0;
+    for (int i = 0; i < available; ++i )
+        if ( buf[i] == '\0' )
+            ++size;
+
+    /* now create a the cmdline */
+    cmdline = new char*[size+1];
+    cmdline[size] = '\0'; // parnoid...
+
+    string_start = &buf[0];
+    for ( int i = 0; i < size; ++i ) {
+       /*
+        * find the end of the string
+        */
+        size_t sz  = ::strlen(string_start);
+        cmdline[i] = new char[sz+1];
+	memcpy( cmdline[i], string_start, sz+1 );	
+        string_start += (sz+1); // +1 for '\0' +1 to set it beyond
+    }
+
+    ::close(fd);
+
+    return;
+
+/* error code */
+error_out:
+    cmdline = new char*[2];
+    cmdline[0] = "unknown_app";
+    cmdline[1] = '\0';
+    size = 1;
+}
+
+static void free_cmd_line() {
+    /*
+     * free each string and then free the array
+     */
+    for ( int i = 0; i < size; ++i )
+        delete [] cmdline[i];
+
+    delete [] cmdline;
+}
+
+static void __attribute__((constructor)) initialize_qpe_app() {
+    parse_cmd_line();
+
+    theApp = new QPEApplication( size, cmdline );
+    dummyW = new QWidget;
+    theApp->showMainWidget(dummyW);
+}
+
+static void __attribute__((destructor)) deinitialize_qpe_app() {
+    free_cmd_line();
+    delete dummyW;
+    delete theApp;
+}
+
+
+#endif