void flipThread(void *refcon) { KplScreen screen = refcon; FskThread mainThread = FskThreadGetMain(); FskTimeRecord later; SInt32 ms; FskThreadInitializationComplete(FskThreadGetCurrent()); while (!gQuitting) { //Save the last Flip time FskTimeGetNow(&gKplScreen->lastFlipTime); FskTimeCopy(&later, &gKplScreen->nextFlipTime); FskTimeSub(&gKplScreen->lastFlipTime, &later); ms = FskTimeInMS(&later); if (ms > 0) { FskDelay(ms); MLOG("[%s] delay %d ms\n", threadName, ms); } // Kick off the next cycle if (gKplScreen->drawingPumpEnabled) { FskSemaphoreAcquire(screen->flipSemaphore); gKplScreen->callbackPostedCount++; FskThreadPostCallback(mainThread, drawingPumpCallback, (void*)gKplScreen->callbackPostedCount, NULL, NULL, NULL); } } }
static void KprServicesLoop(void* theParameter) { xsAllocation allocation = { 1100000, // 700 * 1024, 32 * 1024, 70000, // 62000, 4096, 2048, 16000, 1993 }; FskErr err = kFskErrNone; KprService service = gServices; FskThread thread = FskThreadGetCurrent(); gServiceMachine = xsAliasMachine(&allocation, gShell->root, "services", gShell); bailIfNULL(gServiceMachine); while (service) { if (service->flags & kprServicesThread) { FskInstrumentedTypePrintfNormal(&KprServiceInstrumentation, "Starting %s", service->id); (*service->start)(service, thread, gServiceMachine); } service = service->next; } FskThreadInitializationComplete(thread); while (!gServicesThreadQuitting) FskThreadRunloopCycle(-1); service = gServices; while (service) { if (service->flags & kprServicesThread) { FskInstrumentedTypePrintfNormal(&KprServiceInstrumentation, "Stopping %s", service->id); (*service->stop)(service); } service = service->next; } bail: if (gServiceMachine) { xsDeleteMachine(gServiceMachine); gServiceMachine = NULL; } return; }
////////////// Main and Init ///////////////// static void FskGtkWindowLoop(void *refcon) { FskWindow fskWindow = (FskWindow)refcon; FskGtkWindow gtkWin = (FskGtkWindow)fskWindow->gtkWin; GtkWidget *win; GdkPixbuf *iconBuf; // Start GTK special initialization XInitThreads(); //fix a xcb issue happened when using multithread gtk, see http://stackoverflow.com/a/18690540/472927 gtk_init(NULL, NULL); gtkWin->owner = fskWindow; gtkWin->window = win = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_default_size(win, 750, 505); // Set App Icon char *iconPath = FskStrDoCat(FskGetApplicationPath(), "fsk.png"); iconBuf = gdk_pixbuf_new_from_file(iconPath, NULL); if(iconBuf != NULL) { gtk_window_set_icon(GTK_WINDOW(win), iconBuf); g_object_unref(G_OBJECT(iconBuf)); } FskMemPtrDispose(iconPath); gtkWin->vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); gtk_container_add(GTK_CONTAINER(win), gtkWin->vbox); gtk_widget_show(gtkWin->vbox); gtkWin->menubar = gtk_menu_bar_new(); gtk_widget_show(gtkWin->menubar); gtkWin->da = gtk_drawing_area_new(); gtk_widget_show(gtkWin->da); gtkWin->accelGroup = gtk_accel_group_new(); gtk_window_add_accel_group(GTK_WINDOW(win), gtkWin->accelGroup); FskMutexNew(>kWin->bufMutex, "drawAreaBuffer"); gtkWin->queue = g_async_queue_new(); gtk_widget_add_events(GTK_WIDGET(win), GDK_EXPOSURE_MASK | GDK_KEY_PRESS_MASK); gtk_widget_add_events(GTK_WIDGET(gtkWin->da), GDK_ALL_EVENTS_MASK); g_signal_connect(win, "destroy", G_CALLBACK(app_quit), gtkWin); g_signal_connect(win, "key-press-event", G_CALLBACK(on_key_press), gtkWin); g_signal_connect(win, "key-release-event", G_CALLBACK(on_key_release), gtkWin); g_signal_connect(win, "configure-event", G_CALLBACK(configure_event_win), gtkWin); // If want to resize draw-area, it will be the event receiver. g_signal_connect(gtkWin->da, "configure-event", G_CALLBACK(configure_event_cb), gtkWin); g_signal_connect(gtkWin->da, "draw", G_CALLBACK(draw_callback), gtkWin); g_signal_connect(gtkWin->da, "button-press-event", G_CALLBACK(on_button_press), gtkWin); g_signal_connect(gtkWin->da, "button-release-event",G_CALLBACK(on_button_release), gtkWin); g_signal_connect(gtkWin->da, "motion-notify-event", G_CALLBACK(motion_notify), gtkWin); gtk_box_pack_start(GTK_BOX(gtkWin->vbox), gtkWin->menubar, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(gtkWin->vbox), gtkWin->da, TRUE, TRUE, 0); // Set all to true! gdk_threads_add_idle(idle_func, gtkWin); //gtk_widget_show_all(win); FskThreadInitializationComplete(FskThreadGetCurrent()); gtk_main(); }