#include #include "../splash.xpm" #include "../icon.xpm" #include #include #include // pwd for home dir static char cmd_args[32]; static int engine_memory; static int engine_vid_width; static int engine_vid_height; static char engine_cfg_path[80]; 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); 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); 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; launcher_settings_save(); } } enum { LIST_ITEM = 0, N_COLUMNS }; void launcher_init_list(GtkWidget *list) { GtkCellRenderer *renderer; GtkTreeViewColumn *column; GtkListStore *store; renderer = gtk_cell_renderer_text_new (); column = gtk_tree_view_column_new_with_attributes("Custom Game", renderer, "text", LIST_ITEM, NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(list), column); store = gtk_list_store_new(N_COLUMNS, 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 *str) { 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, str, -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_ITEM, &value, -1); //gtk_label_set_text(GTK_LABEL(label), value); sprintf(cmd_args, "%s", value); g_free(value); } } void launcher_cachefolders(const char *name, GtkWidget *list) { DIR *d; struct dirent *dir; char fname[32]; 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)) { printf("[LAUNCHER] Found directory: %s\n", dir->d_name); sprintf(fname, "%s", dir->d_name); launcher_add_to_list(list, fname); } } closedir(d); } } void launcher_start() { char cmd[128]; sprintf(cmd, "./ngunix.x11 -data id1 -game %s -winsize %d %d -mem %d\n", cmd_args, 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, 144, 160); //gtk_widget_set_size_request(listgames, 143, 159); 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); launcher_cachefolders(".", listgames); gtk_main(); return 0; }