mirror of https://github.com/bsnes-emu/bsnes.git
178 lines
4.7 KiB
C++
Executable File
178 lines
4.7 KiB
C++
Executable File
#include "gtk.hpp"
|
|
|
|
#include "settings.cpp"
|
|
#include "font.cpp"
|
|
#include "timer.cpp"
|
|
#include "message-window.cpp"
|
|
#include "window.cpp"
|
|
|
|
#include "action/action.cpp"
|
|
#include "action/menu.cpp"
|
|
#include "action/separator.cpp"
|
|
#include "action/item.cpp"
|
|
#include "action/check-item.cpp"
|
|
#include "action/radio-item.cpp"
|
|
|
|
#include "widget/widget.cpp"
|
|
#include "widget/button.cpp"
|
|
#include "widget/canvas.cpp"
|
|
#include "widget/check-box.cpp"
|
|
#include "widget/combo-box.cpp"
|
|
#include "widget/hex-edit.cpp"
|
|
#include "widget/horizontal-scroll-bar.cpp"
|
|
#include "widget/horizontal-slider.cpp"
|
|
#include "widget/label.cpp"
|
|
#include "widget/line-edit.cpp"
|
|
#include "widget/list-view.cpp"
|
|
#include "widget/progress-bar.cpp"
|
|
#include "widget/radio-box.cpp"
|
|
#include "widget/text-edit.cpp"
|
|
#include "widget/vertical-scroll-bar.cpp"
|
|
#include "widget/vertical-slider.cpp"
|
|
#include "widget/viewport.cpp"
|
|
|
|
Font pOS::defaultFont;
|
|
|
|
Geometry pOS::availableGeometry() {
|
|
Display *display = XOpenDisplay(0);
|
|
int screen = DefaultScreen(display);
|
|
|
|
static Atom atom = X11None;
|
|
if(atom == X11None) atom = XInternAtom(display, "_NET_WORKAREA", True);
|
|
|
|
int format;
|
|
unsigned char *data = 0;
|
|
unsigned long items, after;
|
|
Atom returnAtom;
|
|
|
|
int result = XGetWindowProperty(
|
|
display, RootWindow(display, screen), atom, 0, 4, False, XA_CARDINAL, &returnAtom, &format, &items, &after, &data
|
|
);
|
|
|
|
XCloseDisplay(display);
|
|
|
|
if(result == Success && returnAtom == XA_CARDINAL && format == 32 && items == 4) {
|
|
unsigned long *workarea = (unsigned long*)data;
|
|
return { (signed)workarea[0], (signed)workarea[1], (unsigned)workarea[2], (unsigned)workarea[3] };
|
|
}
|
|
|
|
return desktopGeometry();
|
|
}
|
|
|
|
Geometry pOS::desktopGeometry() {
|
|
return {
|
|
0, 0,
|
|
gdk_screen_get_width(gdk_screen_get_default()),
|
|
gdk_screen_get_height(gdk_screen_get_default())
|
|
};
|
|
}
|
|
|
|
static string pOS_fileDialog(bool save, Window &parent, const string &path, const lstring &filter) {
|
|
string name;
|
|
|
|
GtkWidget *dialog = gtk_file_chooser_dialog_new(
|
|
save == 0 ? "Load File" : "Save File",
|
|
&parent != &Window::None ? GTK_WINDOW(parent.p.widget) : (GtkWindow*)0,
|
|
save == 0 ? GTK_FILE_CHOOSER_ACTION_OPEN : GTK_FILE_CHOOSER_ACTION_SAVE,
|
|
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
|
|
GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
|
|
(const gchar*)0
|
|
);
|
|
|
|
if(path) gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog), path);
|
|
|
|
foreach(filterItem, filter) {
|
|
GtkFileFilter *gtkFilter = gtk_file_filter_new();
|
|
gtk_file_filter_set_name(gtkFilter, filterItem);
|
|
lstring part;
|
|
part.split("(", filterItem);
|
|
part[1].rtrim<1>(")");
|
|
lstring list;
|
|
list.split(",", part[1]);
|
|
foreach(pattern, list) gtk_file_filter_add_pattern(gtkFilter, pattern);
|
|
gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog), gtkFilter);
|
|
}
|
|
|
|
if(gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
|
|
char *temp = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
|
|
name = temp;
|
|
g_free(temp);
|
|
}
|
|
|
|
gtk_widget_destroy(dialog);
|
|
return name;
|
|
}
|
|
|
|
string pOS::fileLoad(Window &parent, const string &path, const lstring &filter) {
|
|
return pOS_fileDialog(0, parent, path, filter);
|
|
}
|
|
|
|
string pOS::fileSave(Window &parent, const string &path, const lstring &filter) {
|
|
return pOS_fileDialog(1, parent, path, filter);
|
|
}
|
|
|
|
string pOS::folderSelect(Window &parent, const string &path) {
|
|
string name;
|
|
|
|
GtkWidget *dialog = gtk_file_chooser_dialog_new(
|
|
"Select Folder",
|
|
&parent != &Window::None ? GTK_WINDOW(parent.p.widget) : (GtkWindow*)0,
|
|
GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
|
|
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
|
|
GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
|
|
(const gchar*)0
|
|
);
|
|
|
|
if(path) gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog), path);
|
|
|
|
if(gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
|
|
char *temp = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
|
|
name = temp;
|
|
g_free(temp);
|
|
}
|
|
|
|
gtk_widget_destroy(dialog);
|
|
if(name == "") return "";
|
|
if(name.endswith("/") == false) name.append("/");
|
|
return name;
|
|
}
|
|
|
|
void pOS::main() {
|
|
gtk_main();
|
|
}
|
|
|
|
bool pOS::pendingEvents() {
|
|
return gtk_events_pending();
|
|
}
|
|
|
|
void pOS::processEvents() {
|
|
while(pendingEvents()) gtk_main_iteration_do(false);
|
|
}
|
|
|
|
void pOS::quit() {
|
|
settings.save();
|
|
gtk_main_quit();
|
|
}
|
|
|
|
void pOS::initialize() {
|
|
settings.load();
|
|
|
|
int argc = 1;
|
|
char *argv[2];
|
|
argv[0] = new char[8];
|
|
argv[1] = 0;
|
|
strcpy(argv[0], "phoenix");
|
|
char **argvp = argv;
|
|
gtk_init(&argc, &argvp);
|
|
|
|
gtk_rc_parse_string(
|
|
"style \"phoenix-gtk\"\n"
|
|
"{\n"
|
|
" GtkComboBox::appears-as-list = 1\n"
|
|
" GtkTreeView::vertical-separator = 0\n"
|
|
"}\n"
|
|
//"class \"GtkComboBox\" style \"phoenix-gtk\"\n"
|
|
"class \"GtkTreeView\" style \"phoenix-gtk\"\n"
|
|
);
|
|
}
|