void KprSoundSetup() { FskErr err = kFskErrNone; FskMediaPropertyValueRecord ambientAudio = {kFskMediaPropertyTypeInteger, {kFskAudioOutCategoryAmbient}}; #if FSK_EXTENSION_EMBED #else char* applicationPath = NULL; char* libraryPath = NULL; #if TARGET_OS_WIN32 char* libraryName = "mediareader.dll"; #else char* libraryName = "mediareader.so"; #endif FskLibrary library = NULL; #endif if (gSoundChannel) goto bail; #if FSK_EXTENSION_EMBED FskMediaReaderNewProc = FskMediaReaderNew; FskMediaReaderDisposeProc = FskMediaReaderDispose; FskMediaReaderExtractProc = FskMediaReaderExtract; FskMediaReaderGetPropertyProc = FskMediaReaderGetProperty; FskMediaReaderGetTrackProc = FskMediaReaderGetTrack; FskMediaReaderStartProc = FskMediaReaderStart; FskMediaReaderStopProc = FskMediaReaderStop; FskMediaReaderTrackGetPropertyProc = FskMediaReaderTrackGetProperty; #else applicationPath = FskGetApplicationPath(); bailIfNULL(applicationPath); bailIfError(FskMemPtrNewClear(FskStrLen(applicationPath) + FskStrLen(libraryName) + 1, &libraryPath)); FskStrCopy(libraryPath, applicationPath); FskStrCat(libraryPath, libraryName); bailIfError(FskLibraryLoad(&library, libraryPath)); bailIfError(FskLibraryGetSymbolAddress(library, "FskMediaReaderNew", &FskMediaReaderNewProc)); bailIfError(FskLibraryGetSymbolAddress(library, "FskMediaReaderDispose", &FskMediaReaderDisposeProc)); bailIfError(FskLibraryGetSymbolAddress(library, "FskMediaReaderExtract", &FskMediaReaderExtractProc)); bailIfError(FskLibraryGetSymbolAddress(library, "FskMediaReaderGetProperty", &FskMediaReaderGetPropertyProc)); bailIfError(FskLibraryGetSymbolAddress(library, "FskMediaReaderGetTrack", &FskMediaReaderGetTrackProc)); bailIfError(FskLibraryGetSymbolAddress(library, "FskMediaReaderStart", &FskMediaReaderStartProc)); bailIfError(FskLibraryGetSymbolAddress(library, "FskMediaReaderStop", &FskMediaReaderStopProc)); bailIfError(FskLibraryGetSymbolAddress(library, "FskMediaReaderTrackGetProperty", &FskMediaReaderTrackGetPropertyProc)); #endif bailIfError(FskSndChannelNew(&gSoundChannel, 0, kFskAudioFormatUndefined, 0)); FskTimeCallbackNew(&gSoundTimer); FskSndChannelSetProperty(gSoundChannel, kFskMediaPropertyAudioCategory, &ambientAudio); bail: #if FSK_EXTENSION_EMBED #else if (err) FskLibraryUnload(library); else FskMemPtrDispose(library); FskMemPtrDispose(libraryPath); FskMemPtrDispose(applicationPath); #endif return; }
////////////// Main and Init ///////////////// static void FskGtkWindowInit(void *refcon) { FskWindow fskWindow = (FskWindow)refcon; FskGtkWindow gtkWin = (FskGtkWindow)fskWindow->gtkWin; GtkWidget *win; GdkPixbuf *iconBuf; // Ubuntu Unity prevent signals to reach menu inside menubars. Disable it! setenv("UBUNTU_MENUPROXY", "0", true); // 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((GtkWindow*)win, 800, 600); // 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"); FskMutexNew(>kWin->menuMutex, "GTKMenuItems"); gtkWin->menuStatus = true; 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); g_signal_connect(win, "window-state-event", G_CALLBACK(window_state_cb), fskWindow); // If want to resize draw-area, it will be the event receiver. g_signal_connect(gtkWin->da, "configure-event", G_CALLBACK(on_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(on_motion_notify), gtkWin); g_signal_connect(gtkWin->da, "scroll-event", G_CALLBACK(on_scroll_cb), gtkWin); gtk_box_pack_start(GTK_BOX(gtkWin->vbox), gtkWin->menubar, FALSE, TRUE, 0); gtk_box_pack_start(GTK_BOX(gtkWin->vbox), gtkWin->da, TRUE, TRUE, 0); // Set all to true! gtk_widget_show_all(win); }
FskErr FskECMAScriptLoadLibrary(const char *name) { FskErr err = kFskErrBadData; FskLibraryLoadProc libLoad; char *extension = NULL, *symbolName = NULL, *dot, *slash, *fullPath = NULL, *temp = NULL; FskLibrary library = NULL; char* root = NULL; FskFileInfo itemInfo; FskDebugStr("FskECMAScriptLoadLibrary: %s", name); dot = FskStrRChr(name, '.'); slash = FskStrRChr(name, '/'); if ((NULL == dot) || (slash && (slash > dot))) { #if TARGET_OS_WIN32 extension = ".dll"; #elif TARGET_OS_MAC || TARGET_OS_LINUX extension = ".so"; #elif TARGET_OS_KPL extension = (char*)KplECMAScriptGetExtension(); #endif } if (extension) fullPath = FskStrDoCat(name, extension); else fullPath = FskStrDoCopy(name); if (kFskErrNone != FskFileGetFileInfo(fullPath, &itemInfo)) { #if TARGET_OS_ANDROID char *libDir; libDir = FskStrDoCat(gAndroidCallbacks->getStaticDataDirCB(), "../lib/lib"); temp = FskStrDoCat(libDir, fullPath); FskMemPtrDispose(libDir); #else root = FskGetApplicationPath(); temp = FskStrDoCat(root, fullPath); FskMemPtrDispose(root); #endif if (kFskErrNone != FskFileGetFileInfo(temp, &itemInfo)) { FskDebugStr(" - no file: %s", temp); goto bail; } FskMemPtrDispose(fullPath); fullPath = temp; temp = NULL; } err = FskLibraryLoad(&library, fullPath); FskDebugStr(" - try: %s -> %d", fullPath, err); if (err) goto bail; symbolName = FskStrDoCat(name, "_fskLoad"); if ((kFskErrNone == FskLibraryGetSymbolAddress(library, symbolName, &libLoad)) || (kFskErrNone == FskLibraryGetSymbolAddress(library, "fskLoad", &libLoad))) { err = (libLoad)(library); FskDebugStr(" - symbolName: %x -> %d", libLoad, err); if (err) goto bail; err = kFskErrNone; } bail: if (err) { FskLibraryUnload(library); } FskMemPtrDispose(symbolName); FskMemPtrDispose(fullPath); return err; }
FskErr FskEnvironmentInitialize(void) { char *appPath; gEnvironment = FskAssociativeArrayNew(); appPath = FskGetApplicationPath(); FskEnvironmentSet("applicationPath", appPath); FskMemPtrDispose(appPath); #if TARGET_OS_KPL KplEnvironmentInitialize(gEnvironment); #elif TARGET_OS_ANDROID FskEnvironmentSet("application", "PLAY"); #elif TARGET_OS_WIN32 || TARGET_OS_MAC || TARGET_OS_LINUX FskEnvironmentSet("application", FSK_APPLICATION); #else FskEnvironmentSet("application", "PLAY"); #endif #if TARGET_OS_WIN32 { char name[256], *nameTemp = NULL; UInt16 nameW[256]; char num[32]; DWORD nameSize = sizeof(nameW) / sizeof(UInt16); EXTENDED_NAME_FORMAT exNameFormat = NameSamCompatible; if (GetUserNameExW(exNameFormat, (LPWSTR)nameW, &nameSize)) { FskTextUnicode16LEToUTF8(nameW, nameSize * 2, &nameTemp, NULL); FskStrCopy(name, nameTemp); FskEnvironmentSet("loginName", name); FskMemPtrDispose(nameTemp); } FskEnvironmentSet("OS", "Windows"); FskStrNumToStr(gWindowsVersionInfo.dwMajorVersion, name, sizeof(name)); FskStrCat(name, "."); FskStrNumToStr(gWindowsVersionInfo.dwMinorVersion, num, sizeof(num)); FskStrCat(name, num); FskEnvironmentSet("OSVersion", name); } #elif TARGET_OS_MAC { struct utsname un; char name[256], *model; SInt32 gen; #if TARGET_OS_IPHONE FskEnvironmentSet("OS", "iPhone"); #else FskEnvironmentSet("OS", "Mac"); #endif FskCocoaSystemGetVersion(name); FskEnvironmentSet("OSVersion", name); if (uname(&un) == 0) { model = un.machine; if (FskStrCompareWithLength(model, "iPhone", 6) == 0) gen = FskStrToNum(model + 6); else if (FskStrCompareWithLength(model, "iPad", 4) == 0) { gen = FskStrToNum(model + 4); if (gen == 3) { SInt32 minor = FskStrToNum(model + 6); if (minor == 4) /* 4th gen */ gen = 5; else gen = 4; /* Only the 3rd gen iPad doesn't follow the numbering system */ } else gen += 2; } else if (FskStrCompareWithLength(model, "iPod", 4) == 0) { gen = FskStrToNum(model + 4); if (gen > 1) --gen; } else gen = 99; } else { model = "unknown"; gen = 99; } FskEnvironmentSet("Model", model); FskStrNumToStr(gen, name, sizeof(name)); FskEnvironmentSet("Generation", name); } #elif TARGET_OS_LINUX { struct utsname name; uname(&name); if (getlogin()) FskEnvironmentSet("loginName", getlogin()); else FskEnvironmentSet("loginName", "User"); FskEnvironmentSet("OS", name.sysname); FskEnvironmentSet("OSVersion", name.release); //@@ } #endif return kFskErrNone; }