254 lines
7.2 KiB
C
254 lines
7.2 KiB
C
#include <gtk/gtk.h>
|
|
#include "../splash.xpm"
|
|
#include "../icon.xpm"
|
|
|
|
#include <dirent.h>
|
|
#include <stdio.h>
|
|
#include <pwd.h> // 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);
|
|
gtk_tree_view_column_set_sort_column_id (column1, LIST_ITEM);
|
|
gtk_tree_view_column_set_expand(column1, TRUE);
|
|
|
|
renderer2 = gtk_cell_renderer_text_new ();
|
|
column2 = gtk_tree_view_column_new_with_attributes("Directory", renderer1, "text", LIST_DIR, NULL);
|
|
gtk_tree_view_column_set_sort_column_id (column2, LIST_DIR);
|
|
|
|
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)
|
|
{
|
|
GtkTreeModel *model;
|
|
GtkTreeIter iter;
|
|
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);
|
|
}
|
|
|
|
gboolean resize_list(GtkWidget *window, GdkEvent *event, GtkWidget *widget)
|
|
{
|
|
gint width, height;
|
|
gtk_window_get_size(window, &width, &height);
|
|
gtk_widget_set_size_request(widget, 440, height - (118+41));
|
|
}
|
|
|
|
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();
|
|
|
|
GdkGeometry hints;
|
|
hints.min_width = 444;
|
|
hints.max_width = 444;
|
|
hints.min_height = 225;
|
|
hints.max_height = 1080;
|
|
|
|
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_window_set_geometry_hints(GTK_WINDOW(window), window, &hints, (GdkWindowHints)(GDK_HINT_MIN_SIZE | GDK_HINT_MAX_SIZE));
|
|
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, 146, 40);
|
|
gtk_fixed_put(GTK_FIXED(ltable1), btnsetting, 148, 118);
|
|
gtk_widget_set_size_request(btnsetting, 144, 40);
|
|
gtk_fixed_put(GTK_FIXED(ltable1), btnquit, 148+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_scrolled_window_set_policy(listwindow, GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
|
|
gtk_widget_set_size_request(listwindow, 440, 300);
|
|
|
|
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);
|
|
g_signal_connect(G_OBJECT(window), "configure-event", G_CALLBACK(resize_list), (gpointer)listwindow);
|
|
|
|
iGameCnt = 1;
|
|
printf("[LAUNCHER] Scanning directories....\n");
|
|
launcher_cachefolders(".", listgames);
|
|
printf(".......... %d folder(s) found\n", iGameCnt);
|
|
|
|
gtk_main();
|
|
|
|
return 0;
|
|
}
|