ngunix/launcher/main.c

342 lines
10 KiB
C
Raw Normal View History

#include <gtk/gtk.h>
#include "../splash.xpm"
#include "../icon.xpm"
#include <dirent.h>
#include <stdio.h>
#include <pwd.h>
typedef unsigned char byte;
static char cmd_args[128];
static char engine_game[16];
static int engine_memory;
static int engine_vid_width;
static int engine_vid_height;
static byte engine_vid_border;
static byte engine_hidden;
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);
fprintf(fFile, "%d\n", engine_hidden);
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");
2016-01-10 23:30:13 +00:00
fscanf(fFile,"%d %d %d %d %d", &engine_memory, &engine_vid_width, &engine_vid_height, &engine_vid_border, &engine_hidden);
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;
engine_hidden = 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);
2016-01-08 11:51:14 +00:00
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);
2016-01-08 11:51:14 +00:00
gtk_tree_view_column_set_sort_column_id (column2, LIST_DIR);
gtk_tree_view_column_set_expand(column1, TRUE);
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);
}
2016-01-08 11:51:14 +00:00
void launcher_list_changed(GtkWidget *widget, gpointer label)
{
GtkTreeModel *model;
2016-01-08 11:51:14 +00:00
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(engine_game, "%s", value);
g_free(value);
}
}
void launcher_cachefolders(GtkWidget *list)
{
DIR *d;
FILE *f;
struct dirent *dir;
char cFile[32];
d = opendir(".");
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/info", dir->d_name);
if(access(cFile, R_OK) != -1 )
{
f = fopen(cFile, "r");
char cTemp[64];
fscanf(f, "%63[^\n]", cTemp);
fclose(f);
printf(" Found %s (%s)\n", cTemp, dir->d_name);
launcher_add_to_list(list, cTemp, dir->d_name);
iGameCnt++;
}
else if(engine_hidden == 0)
launcher_add_to_list(list, dir->d_name, dir->d_name);
}
}
closedir(d);
}
}
void launcher_start()
{
char cmd[128];
char cbase[64];
char cFile[32];
char cArgs[64];
sprintf(cFile, "./%s/cmdline", engine_game);
if(access(cFile, R_OK) != -1 )
{
FILE *f;
f = fopen(cFile, "r");
fscanf(f, "%63[^\n]", cArgs);
fclose(f);
}
else
sprintf(cArgs, "");
sprintf(cbase, "./ngunix.x11 -data id1 -winsize %d %d -mem %d", engine_vid_width, engine_vid_height, engine_memory);
if(engine_vid_border == 1)
sprintf(cmd, "%s -game %s %s\n", cbase, engine_game, cArgs);
else
sprintf(cmd, "%s -noborder -game %s %s\n", cbase, engine_game, cArgs);
system(cmd);
}
2016-01-08 12:42:26 +00:00
gboolean resize_list(GtkWidget *window, GdkEvent *event, GtkWidget *widget)
{
gint width, height;
iGameCnt = 1;
gtk_window_get_size(GTK_WINDOW(window), &width, &height);
2016-01-08 12:42:26 +00:00
gtk_widget_set_size_request(widget, 440, height - (118+41));
}
2016-01-10 23:30:13 +00:00
void launcher_settings_window()
{
/* GtkWidget *prefwindow;
GtkWidget *hbox1, *hbox2;
GtkWidget *vbox1, *vbox2;
2016-01-10 23:30:13 +00:00
vbox1 = gtk_vbox_new(TRUE, 1);
vbox2 = gtk_vbox_new(TRUE, 1);
hbox1 = gtk_hbox_new(TRUE, 1);
hbox2 = gtk_hbox_new(TRUE, 1);
2016-01-10 23:30:13 +00:00
prefwindow = gtk_window_new (GTK_WINDOW_TOPLEVEL);
2016-01-10 23:30:13 +00:00
gtk_window_set_title (prefwindow, "NGUNIX - Engine Settings");
gtk_container_set_border_width(GTK_CONTAINER(prefwindow), 10);
gtk_container_add(GTK_CONTAINER(prefwindow), vbox1);
gtk_container_add(GTK_CONTAINER(vbox1), hbox1);
gtk_container_add(GTK_CONTAINER(vbox1), hbox2);
2016-01-10 23:30:13 +00:00
GtkLabel *label1 = gtk_label_new("Video Width");
GtkLabel *label2 = gtk_label_new("Video Height");
GtkLabel *label3 = gtk_label_new("Video Memory");
gtk_fixed_put(GTK_FIXED(ltable1), label1, 0, 0);
gtk_fixed_put(GTK_FIXED(ltable1), label2, 0, 20);
gtk_fixed_put(GTK_FIXED(ltable1), label3, 0, 40);
GtkWidget *entry1 = gtk_entry_new();
GtkWidget *entry2 = gtk_entry_new();
GtkWidget *entry3 = gtk_entry_new();
char vid_width[4], vid_height[4], vid_mem[3];
sprintf(vid_width, "%d", engine_vid_width);
sprintf(vid_height, "%d", engine_vid_height);
sprintf(vid_mem, "%d", engine_memory);
GtkEntryBuffer *buf1 = gtk_entry_buffer_new(vid_width, 4);
GtkEntryBuffer *buf2 = gtk_entry_buffer_new(vid_height, 4);
GtkEntryBuffer *buf3 = gtk_entry_buffer_new(vid_mem, 3);
2016-01-10 23:30:13 +00:00
gtk_fixed_put(GTK_FIXED(ltable1), entry1, 90, 0);
gtk_fixed_put(GTK_FIXED(ltable1), entry2, 90, 20);
gtk_fixed_put(GTK_FIXED(ltable1), entry3, 90, 40);
gtk_entry_set_buffer(entry1, buf1);
gtk_entry_set_buffer(entry2, buf2);
gtk_entry_set_buffer(entry3, buf3);
2016-01-10 23:30:13 +00:00
GtkWidget *check1 = gtk_check_button_new_with_label("Window Borders");
GtkWidget *check2 = gtk_check_button_new_with_label("Hide Unknown Mods");
gtk_fixed_put(GTK_FIXED(ltable1), check1, 0, 60);
gtk_fixed_put(GTK_FIXED(ltable1), check2, 0, 80);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check1), engine_vid_border ? TRUE : FALSE);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check2), engine_hidden ? TRUE : FALSE);
gtk_widget_show_all(prefwindow);
2016-01-10 23:30:13 +00:00
g_signal_connect(prefwindow, "destroy", G_CALLBACK(gtk_widget_hide), NULL);*/
2016-01-10 23:30:13 +00:00
}
int main(int argc, char *argv[])
{
GtkWidget *window;
GtkWidget *ltable1;
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;
if(argv[1])
{
chdir(argv[1]);
printf("[LAUNCHER] Using Directory %s\n", argv[1]);
}
sprintf(engine_game, "data");
gtk_init(&argc, &argv);
launcher_settings_load();
2016-01-08 12:42:26 +00:00
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);
2016-01-08 12:42:26 +00:00
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 );
if(!access("./splash.xpm", R_OK))
x_splash_image = gtk_image_new_from_file("./splash.xpm");
else
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);
2016-01-08 12:42:26 +00:00
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);
2016-01-08 12:42:26 +00:00
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();
2016-01-08 11:51:14 +00:00
gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW (listwindow), listgames);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(listwindow), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
2016-01-08 11:51:14 +00:00
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);
2016-01-10 23:30:13 +00:00
gtk_signal_connect (GTK_OBJECT (btnsetting), "clicked", GTK_SIGNAL_FUNC (launcher_settings_window),NULL);
gtk_signal_connect (GTK_OBJECT (btnquit), "clicked", GTK_SIGNAL_FUNC (gtk_main_quit),NULL);
2016-01-08 12:42:26 +00:00
g_signal_connect(G_OBJECT(window), "configure-event", G_CALLBACK(resize_list), (gpointer)listwindow);
printf("[LAUNCHER] Scanning directories....\n");
launcher_cachefolders(listgames);
printf(".......... %d folder(s) found\n", iGameCnt);
gtk_main();
return 0;
}