view src/main/qtopia/SDL_qtopia_main.cc @ 4137:be12463f31ea SDL-1.2

Date: Sat, 2 Feb 2008 22:08:05 +0100 From: Marcus von Appen To: sdl@lists.libsdl.org Subject: [SDL] [Patch] SDL-1.2 SDL_revcpy() asm patch for the cld flag Hi, as reported through the FreeBSD bug tracking system in SDL 1.2.13 (and in the 1.2 branch, if I see that correctly) the SDL_revcpy() macro sets the direction flag (std), but does not clear it afterwards (cld), which is wrong according to the GCC and SYS V specs. This can cause some weird side effects, which in turn can lead to memory corruption. You can read the full report with a detailed description and test program at http://www.freebsd.org/cgi/query-pr.cgi?pr=ports/120052 Attached is the submitted patch, which fixes the issue. Regards Marcus
author Ryan C. Gordon <icculus@icculus.org>
date Mon, 04 Feb 2008 17:22:56 +0000
parents 623b453a3219
children 782fd950bd46 c121d94672cb
line wrap: on
line source


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