/* * This thread will read the buttons in an interrupt like fashion, and * also initializes SDL_INIT_VIDEO and the surfaces * * it must be done in the same thread (at least on windows) because events only * work in the thread which called SDL_Init(SubSystem) with SDL_INIT_VIDEO * * This is an SDL thread and relies on preemptive behavoir of the host **/ static int sdl_event_thread(void * param) { SDL_InitSubSystem(SDL_INIT_VIDEO); #if (CONFIG_PLATFORM & PLATFORM_MAEMO) SDL_sem *wait_for_maemo_startup; #endif SDL_Surface *picture_surface = NULL; int width, height; int depth; Uint32 flags; /* Try and load the background image. If it fails go without */ if (background) { picture_surface = SDL_LoadBMP("UI256.bmp"); if (picture_surface == NULL) { background = false; DEBUGF("warn: %s\n", SDL_GetError()); } } /* Set things up */ if (background) { width = UI_WIDTH; height = UI_HEIGHT; } else { #ifdef HAVE_REMOTE_LCD if (showremote) { width = SIM_LCD_WIDTH > SIM_REMOTE_WIDTH ? SIM_LCD_WIDTH : SIM_REMOTE_WIDTH; height = SIM_LCD_HEIGHT + SIM_REMOTE_HEIGHT; } else #endif { width = SIM_LCD_WIDTH; height = SIM_LCD_HEIGHT; } } depth = LCD_DEPTH; if (depth < 8) depth = 16; flags = SDL_HWSURFACE|SDL_DOUBLEBUF; #if (CONFIG_PLATFORM & (PLATFORM_MAEMO|PLATFORM_PANDORA)) /* Fullscreen mode for maemo app */ flags |= SDL_FULLSCREEN; #endif SDL_WM_SetCaption(UI_TITLE, NULL); if ((gui_surface = SDL_SetVideoMode(width * display_zoom, height * display_zoom, depth, flags)) == NULL) { panicf("%s", SDL_GetError()); } #if (CONFIG_PLATFORM & (PLATFORM_MAEMO|PLATFORM_PANDORA)) /* SDL touch screen fix: Work around a SDL assumption that returns relative mouse coordinates when you get to the screen edges using the touchscreen and a disabled mouse cursor. */ uint8_t hiddenCursorData = 0; SDL_Cursor *hiddenCursor = SDL_CreateCursor(&hiddenCursorData, &hiddenCursorData, 8, 1, 0, 0); SDL_ShowCursor(SDL_ENABLE); SDL_SetCursor(hiddenCursor); #endif if (background && picture_surface != NULL) SDL_BlitSurface(picture_surface, NULL, gui_surface, NULL); /* let system_init proceed */ SDL_SemPost((SDL_sem *)param); #if (CONFIG_PLATFORM & PLATFORM_MAEMO) /* Start maemo thread: Listen to display on/off events and battery monitoring */ wait_for_maemo_startup = SDL_CreateSemaphore(0); /* 0-count so it blocks */ SDL_Thread *maemo_thread = SDL_CreateThread(maemo_thread_func, wait_for_maemo_startup); #endif /* * finally enter the button loop */ gui_message_loop(); #if (CONFIG_PLATFORM & PLATFORM_MAEMO) /* Ensure maemo thread is up and running */ SDL_SemWait(wait_for_maemo_startup); SDL_DestroySemaphore(wait_for_maemo_startup); #if (CONFIG_PLATFORM & PLATFORM_MAEMO5) pcm_shutdown_gstreamer(); #endif g_main_loop_quit (maemo_main_loop); g_main_loop_unref(maemo_main_loop); SDL_WaitThread(maemo_thread, NULL); #endif #if (CONFIG_PLATFORM & (PLATFORM_MAEMO|PLATFORM_PANDORA)) SDL_FreeCursor(hiddenCursor); #endif if(picture_surface) SDL_FreeSurface(picture_surface); /* Order here is relevent to prevent deadlocks and use of destroyed sync primitives by kernel threads */ #ifdef HAVE_SDL_THREADS sim_thread_shutdown(); /* not needed for native threads */ #endif return 0; }
/* * This thread will read the buttons in an interrupt like fashion, and * also initializes SDL_INIT_VIDEO and the surfaces * * it must be done in the same thread (at least on windows) because events only * work in the thread which called SDL_Init(SubSystem) with SDL_INIT_VIDEO * * This is an SDL thread and relies on preemptive behavoir of the host **/ static int sdl_event_thread(void * param) { SDL_InitSubSystem(SDL_INIT_VIDEO); SDL_Surface *picture_surface; int width, height; /* Try and load the background image. If it fails go without */ if (background) { picture_surface = SDL_LoadBMP("UI256.bmp"); if (picture_surface == NULL) { background = false; DEBUGF("warn: %s\n", SDL_GetError()); } } /* Set things up */ if (background) { width = UI_WIDTH; height = UI_HEIGHT; } else { #ifdef HAVE_REMOTE_LCD if (showremote) { width = SIM_LCD_WIDTH > SIM_REMOTE_WIDTH ? SIM_LCD_WIDTH : SIM_REMOTE_WIDTH; height = SIM_LCD_HEIGHT + SIM_REMOTE_HEIGHT; } else #endif { width = SIM_LCD_WIDTH; height = SIM_LCD_HEIGHT; } } if ((gui_surface = SDL_SetVideoMode(width * display_zoom, height * display_zoom, 24, SDL_HWSURFACE|SDL_DOUBLEBUF)) == NULL) { panicf("%s", SDL_GetError()); } SDL_WM_SetCaption(UI_TITLE, NULL); if (background && picture_surface != NULL) SDL_BlitSurface(picture_surface, NULL, gui_surface, NULL); /* let system_init proceed */ SDL_SemPost((SDL_sem *)param); /* * finally enter the button loop */ while(gui_message_loop()); /* Order here is relevent to prevent deadlocks and use of destroyed sync primitives by kernel threads */ sim_thread_shutdown(); sim_kernel_shutdown(); return 0; }