#include #include "../splash.xpm" #include "../icon.xpm" #include #include #include // pwd for home dir typedef unsigned char byte; static char cmd_args[32]; static int engine_memory; static int engine_vid_width; static int engine_vid_height; static byte engine_vid_border; static char engine_cfg_path[80]; static int iGameCnt; void launcher_settings_save() { FILE *fFile; fFile = fopen(engine_cfg_path, "w+"); fprintf(fFile, "%d\n", engine_memory); fprintf(fFile, "%d\n", engine_vid_width); fprintf(fFile, "%d\n", engine_vid_height); fprintf(fFile, "%d\n", engine_vid_border); fclose(fFile); printf("[LAUNCHER] Saved settings...\n"); } void launcher_settings_load() { FILE *fFile; uid_t uid = getuid(); struct passwd *pw = getpwuid(uid); sprintf(engine_cfg_path, "%s/.ngunixrc", pw->pw_dir); if(access(engine_cfg_path, R_OK) != -1 ) { fFile = fopen(engine_cfg_path, "r"); fscanf(fFile,"%d %d %d", &engine_memory, &engine_vid_width, &engine_vid_height, &engine_vid_border); fclose(fFile); printf("[LAUNCHER] Loaded settings... %dx%d @ %dMB memory\n", engine_vid_width, engine_vid_height, engine_memory); } else { engine_memory = 60; engine_vid_width = 640; engine_vid_height = 480; engine_vid_border = 1; launcher_settings_save(); } } enum { LIST_ITEM, LIST_DIR, N_COLUMNS }; void launcher_init_list(GtkWidget *list) { GtkCellRenderer *renderer1; GtkCellRenderer *renderer2; GtkTreeViewColumn *column1, *column2; GtkListStore *store; renderer1 = gtk_cell_renderer_text_new (); column1 = gtk_tree_view_column_new_with_attributes("Game", renderer1, "text", LIST_ITEM, NULL); renderer2 = gtk_cell_renderer_text_new (); column2 = gtk_tree_view_column_new_with_attributes("Directory", renderer1, "text", LIST_DIR, NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(list), column1); gtk_tree_view_append_column(GTK_TREE_VIEW(list), column2); store = gtk_list_store_new(N_COLUMNS, G_TYPE_STRING, G_TYPE_STRING); gtk_tree_view_set_model(GTK_TREE_VIEW(list), GTK_TREE_MODEL(store)); g_object_unref(store); } void launcher_add_to_list(GtkWidget *list, const gchar *gcTitle, const gchar *gcDir) { GtkListStore *store; GtkTreeIter iter; store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(list))); gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, LIST_ITEM, gcTitle, -1); gtk_list_store_set(store, &iter, LIST_DIR, gcDir, -1); } void launcher_list_changed(GtkWidget *widget, gpointer label) { GtkTreeIter iter; GtkTreeModel *model; gchar *value; if (gtk_tree_selection_get_selected(GTK_TREE_SELECTION(widget), &model, &iter)) { gtk_tree_model_get(model, &iter, LIST_DIR, &value, -1); sprintf(cmd_args, "%s", value); g_free(value); } } void launcher_cachefolders(const char *name, GtkWidget *list) { DIR *d; FILE *f; struct dirent *dir; char fname[32]; char cFile[80]; d = opendir(name); if (d) { while ((dir = readdir(d)) != NULL) { if (dir->d_type == DT_DIR && !(strcmp(dir->d_name, ".") == 0 || strcmp(dir->d_name, "..") == 0)) { sprintf(cFile, "%s/%s/info", name, dir->d_name); if(access(cFile, R_OK) != -1 ) { f = fopen(cFile, "r"); char cTemp[32]; fscanf(f, "%35[^\n]", cTemp); fclose(f); printf(" Found %s (%s)\n", cTemp, dir->d_name); sprintf(fname, "%s", dir->d_name); launcher_add_to_list(list, cTemp, fname); iGameCnt++; } } } closedir(d); } } void launcher_start() { char cmd[128]; if(strlen(cmd_args) > 0) sprintf(cmd, "./ngunix.x11 -data id1 -game %s -winsize %d %d -mem %d\n", cmd_args, engine_vid_width, engine_vid_height, engine_memory); else sprintf(cmd, "./ngunix.x11 -data id1 -winsize %d %d -mem %d\n", engine_vid_width, engine_vid_height, engine_memory); printf(cmd); system(cmd); } int main(int argc, char *argv[]) { GtkWidget *window; GtkWidget *ltable1; GtkWidget *ltable2; GtkWidget *ltable3; GtkWidget *btnplay; GtkWidget *btnsetting; GtkWidget *btnquit; GtkWidget *listwindow; GdkBitmap *splash_mask; GdkPixmap *splash_image; GtkWidget *x_splash_image; GdkPixbuf *icon_image; GtkWidget *listgames; GtkTreeSelection *selection; gtk_init(&argc, &argv); launcher_settings_load(); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(window), "NGUNIX Launcher"); gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); gtk_container_set_border_width(GTK_CONTAINER(window), 2); gtk_window_set_resizable(GTK_WINDOW(window), FALSE); gtk_widget_realize(window); icon_image = gdk_pixbuf_new_from_xpm_data((const char**)icon_xpm); gtk_window_set_default_icon (icon_image); ltable1 = gtk_fixed_new(); gtk_container_add(GTK_CONTAINER(window), ltable1); splash_image = gdk_pixmap_create_from_xpm_d(window->window, &splash_mask, NULL, (gchar **)splash_xpm ); x_splash_image = gtk_image_new_from_pixmap(splash_image, splash_mask); gtk_fixed_put(GTK_FIXED(ltable1), x_splash_image, 0, 0); btnplay = gtk_button_new_from_stock(GTK_STOCK_MEDIA_PLAY); btnsetting = gtk_button_new_from_stock(GTK_STOCK_PROPERTIES); btnquit = gtk_button_new_from_stock(GTK_STOCK_QUIT); gtk_fixed_put(GTK_FIXED(ltable1), btnplay, 0, 118); gtk_widget_set_size_request(btnplay, 144, 40); gtk_fixed_put(GTK_FIXED(ltable1), btnsetting, 146, 118); gtk_widget_set_size_request(btnsetting, 144, 40); gtk_fixed_put(GTK_FIXED(ltable1), btnquit, 146+146, 118); gtk_widget_set_size_request(btnquit, 144, 40); listwindow = gtk_scrolled_window_new (NULL, NULL); gtk_fixed_put(GTK_FIXED(ltable1), listwindow, 0, 118+41); listgames = gtk_tree_view_new(); gtk_scrolled_window_add_with_viewport ( GTK_SCROLLED_WINDOW (listwindow), listgames); gtk_widget_set_size_request(listwindow, 440, 160); launcher_init_list(listgames); selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(listgames)); gtk_widget_show_all(window); g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL); g_signal_connect(selection, "changed", G_CALLBACK(launcher_list_changed), listgames); gtk_signal_connect (GTK_OBJECT (btnplay), "clicked", GTK_SIGNAL_FUNC (launcher_start),NULL); gtk_signal_connect (GTK_OBJECT (btnquit), "clicked", GTK_SIGNAL_FUNC (gtk_main_quit),NULL); iGameCnt = 1; printf("[LAUNCHER] Scanning directories....\n"); launcher_cachefolders(".", listgames); printf(".......... %d folder(s) found\n", iGameCnt); gtk_main(); return 0; }