parent
daf5d2713d
commit
55cfb520b8
|
@ -0,0 +1,235 @@
|
|||
#include "callbacks.h"
|
||||
#include "DeSmuME.xpm"
|
||||
|
||||
/* globals */
|
||||
uint Frameskip = 0;
|
||||
static int ScreenCoeff_Size=1;
|
||||
|
||||
/* inline & protos */
|
||||
|
||||
void inline MAINWINDOW_RESIZE() {
|
||||
gtk_window_resize ((GtkWindow*)pWindow,1,1);
|
||||
}
|
||||
|
||||
void inline SET_SENSITIVE(gchar *w, gboolean b) {
|
||||
gtk_widget_set_sensitive(
|
||||
glade_xml_get_widget(xml, w), TRUE);
|
||||
}
|
||||
|
||||
|
||||
/* MENU FILE ***** ***** ***** ***** */
|
||||
void inline ADD_FILTER(GtkWidget * filech, const char * pattern, const char * name) {
|
||||
GtkFileFilter *pFilter;
|
||||
pFilter = gtk_file_filter_new();
|
||||
gtk_file_filter_add_pattern(pFilter, pattern);
|
||||
gtk_file_filter_set_name(pFilter, name);
|
||||
gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(filech), pFilter);
|
||||
}
|
||||
|
||||
void file_open() {
|
||||
desmume_pause();
|
||||
|
||||
GtkWidget *pFileSelection;
|
||||
GtkWidget *pParent;
|
||||
gchar *sChemin;
|
||||
|
||||
pParent = GTK_WIDGET(pWindow);
|
||||
|
||||
/* Creating the selection window */
|
||||
pFileSelection = gtk_file_chooser_dialog_new("Open...",
|
||||
GTK_WINDOW(pParent),
|
||||
GTK_FILE_CHOOSER_ACTION_OPEN,
|
||||
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
|
||||
GTK_STOCK_OPEN, GTK_RESPONSE_OK,
|
||||
NULL);
|
||||
/* On limite les actions a cette fenetre */
|
||||
gtk_window_set_modal(GTK_WINDOW(pFileSelection), TRUE);
|
||||
|
||||
ADD_FILTER(pFileSelection, "*.nds", "Nds binary (.nds)");
|
||||
ADD_FILTER(pFileSelection, "*.ds.gba", "Nds binary with loader (.ds.gba)");
|
||||
ADD_FILTER(pFileSelection, "*", "All files");
|
||||
//ADD_FILTER(pFileSelection, "*.zip", "Nds zipped binary");
|
||||
|
||||
/* Affichage fenetre*/
|
||||
switch(gtk_dialog_run(GTK_DIALOG(pFileSelection)))
|
||||
{
|
||||
case GTK_RESPONSE_OK:
|
||||
/* Recuperation du chemin */
|
||||
sChemin = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(pFileSelection));
|
||||
if(desmume_open((const char*)sChemin) < 0)
|
||||
{
|
||||
GtkWidget *pDialog = gtk_message_dialog_new(GTK_WINDOW(pFileSelection),
|
||||
GTK_DIALOG_MODAL,
|
||||
GTK_MESSAGE_ERROR,
|
||||
GTK_BUTTONS_OK,
|
||||
"Unable to load :\n%s", sChemin);
|
||||
gtk_dialog_run(GTK_DIALOG(pDialog));
|
||||
gtk_widget_destroy(pDialog);
|
||||
} else {
|
||||
SET_SENSITIVE("menu_exec", TRUE);
|
||||
SET_SENSITIVE("menu_pause", TRUE);
|
||||
SET_SENSITIVE("menu_reset", TRUE);
|
||||
SET_SENSITIVE("wgt_Exec", TRUE);
|
||||
SET_SENSITIVE("wgt_Reset", TRUE);
|
||||
desmume_resume();
|
||||
}
|
||||
|
||||
g_free(sChemin);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
gtk_widget_destroy(pFileSelection);
|
||||
}
|
||||
|
||||
void on_menu_ouvrir_activate (GtkMenuItem *menuitem, gpointer user_data) { file_open();}
|
||||
void on_menu_pscreen_activate (GtkMenuItem *menuitem, gpointer user_data) { WriteBMP("./test.bmp",GPU_screen); }
|
||||
void on_menu_quit_activate (GtkMenuItem *menuitem, gpointer user_data) { gtk_main_quit(); }
|
||||
|
||||
|
||||
|
||||
/* MENU EMULATION ***** ***** ***** ***** */
|
||||
void on_menu_exec_activate (GtkMenuItem *menuitem, gpointer user_data) { desmume_resume(); }
|
||||
void on_menu_pause_activate (GtkMenuItem *menuitem, gpointer user_data) { desmume_pause(); }
|
||||
void on_menu_reset_activate (GtkMenuItem *menuitem, gpointer user_data) { desmume_reset(); }
|
||||
void on_menu_layers_activate (GtkMenuItem *menuitem, gpointer user_data) {
|
||||
/* we want to hide or show the checkbox for the layers */
|
||||
GtkWidget * w1 = glade_xml_get_widget(xml, "wvb_1_Main");
|
||||
GtkWidget * w2 = glade_xml_get_widget(xml, "wvb_2_Sub");
|
||||
if (gtk_check_menu_item_get_active((GtkCheckMenuItem*)menuitem)==TRUE) {
|
||||
gtk_widget_show(w1);
|
||||
gtk_widget_show(w2);
|
||||
} else {
|
||||
gtk_widget_hide(w1);
|
||||
gtk_widget_hide(w2);
|
||||
}
|
||||
/* pack the window */
|
||||
MAINWINDOW_RESIZE();
|
||||
}
|
||||
|
||||
|
||||
/* SUBMENU FRAMESKIP ***** ***** ***** ***** */
|
||||
void on_fs0_activate (GtkMenuItem *menuitem,gpointer user_data) { Frameskip = 0; }
|
||||
void on_fs1_activate (GtkMenuItem *menuitem,gpointer user_data) { Frameskip = 1; }
|
||||
void on_fs2_activate (GtkMenuItem *menuitem,gpointer user_data) { Frameskip = 2; }
|
||||
void on_fs3_activate (GtkMenuItem *menuitem,gpointer user_data) { Frameskip = 3; }
|
||||
void on_fs4_activate (GtkMenuItem *menuitem,gpointer user_data) { Frameskip = 4; }
|
||||
void on_fs5_activate (GtkMenuItem *menuitem,gpointer user_data) { Frameskip = 5; }
|
||||
void on_fs6_activate (GtkMenuItem *menuitem,gpointer user_data) { Frameskip = 6; }
|
||||
void on_fs7_activate (GtkMenuItem *menuitem,gpointer user_data) { Frameskip = 7; }
|
||||
void on_fs8_activate (GtkMenuItem *menuitem,gpointer user_data) { Frameskip = 8; }
|
||||
void on_fs9_activate (GtkMenuItem *menuitem,gpointer user_data) { Frameskip = 9; }
|
||||
|
||||
|
||||
/* SUBMENU SIZE ***** ***** ***** ***** */
|
||||
void resize (int Size) {
|
||||
/* we want to scale drawing areas by a factor (1x,2x or 3x) */
|
||||
gtk_drawing_area_size(GTK_DRAWING_AREA(pDrawingArea), 256 * Size, 192 * Size);
|
||||
gtk_widget_set_usize (pDrawingArea, 256 * Size, 192 * Size);
|
||||
gtk_drawing_area_size(GTK_DRAWING_AREA(pDrawingArea2), 256 * Size, 192 * Size);
|
||||
gtk_widget_set_usize (pDrawingArea2, 256 * Size, 192 * Size);
|
||||
ScreenCoeff_Size = Size;
|
||||
/* pack the window */
|
||||
MAINWINDOW_RESIZE();
|
||||
}
|
||||
|
||||
void on_size1x_activate (GtkMenuItem *menuitem, gpointer user_data) { resize(1); }
|
||||
void on_size2x_activate (GtkMenuItem *menuitem, gpointer user_data) { resize(2); }
|
||||
void on_size3x_activate (GtkMenuItem *menuitem, gpointer user_data) { resize(3); }
|
||||
|
||||
|
||||
/* MENU CONFIG ***** ***** ***** ***** */
|
||||
gint Keypad_Temp[DESMUME_NB_KEYS];
|
||||
|
||||
void on_menu_controls_activate (GtkMenuItem *menuitem, gpointer user_data) {
|
||||
edit_controls();
|
||||
}
|
||||
|
||||
void on_menu_rightscreen_activate (GtkMenuItem *menuitem, gpointer user_data) {
|
||||
GtkBox * sbox = (GtkBox*)glade_xml_get_widget(xml, "whb_Sub");
|
||||
GtkWidget * mbox = glade_xml_get_widget(xml, "whb_Main");
|
||||
GtkWidget * vbox = glade_xml_get_widget(xml, "wvb_Layout");
|
||||
GtkWidget * w = glade_xml_get_widget(xml, "wvb_2_Sub");
|
||||
|
||||
/* we want to change the layout, lower screen goes left */
|
||||
if (gtk_check_menu_item_get_active((GtkCheckMenuItem*)menuitem)==TRUE) {
|
||||
gtk_box_reorder_child(sbox,w,-1);
|
||||
gtk_widget_reparent((GtkWidget*)sbox,mbox);
|
||||
} else {
|
||||
/* we want to change the layout, lower screen goes down */
|
||||
gtk_box_reorder_child(sbox,w,0);
|
||||
gtk_widget_reparent((GtkWidget*)sbox,vbox);
|
||||
}
|
||||
/* pack the window */
|
||||
MAINWINDOW_RESIZE();
|
||||
}
|
||||
|
||||
|
||||
/* MENU TOOLS ***** ***** ***** ***** */
|
||||
void on_menu_IO_regs_activate (GtkMenuItem *menuitem, gpointer user_data) {
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* MENU ? ***** ***** ***** ***** */
|
||||
void on_menu_apropos_activate (GtkMenuItem *menuitem, gpointer user_data) {
|
||||
GtkAboutDialog * wAbout = (GtkAboutDialog*)glade_xml_get_widget(xml, "wAboutDlg");
|
||||
gtk_about_dialog_set_version(wAbout, VERSION);
|
||||
gtk_widget_show((GtkWidget*)wAbout);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/* TOOLBAR ***** ***** ***** ***** */
|
||||
void on_wgt_Open_clicked (GtkToolButton *toolbutton, gpointer user_data) { file_open(); }
|
||||
void on_wgt_Reset_clicked (GtkToolButton *toolbutton, gpointer user_data) { desmume_reset(); }
|
||||
void on_wgt_Quit_clicked (GtkToolButton *toolbutton, gpointer user_data) { gtk_main_quit(); }
|
||||
void on_wgt_Exec_toggled (GtkToggleToolButton *toggletoolbutton, gpointer user_data) {
|
||||
if (gtk_toggle_tool_button_get_active(toggletoolbutton)==TRUE)
|
||||
desmume_resume();
|
||||
else
|
||||
desmume_pause();
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* LAYERS ***** ***** ***** ***** */
|
||||
void change_bgx_layer(int layer, gboolean state, Screen scr) {
|
||||
//if(!desmume_running()) return;
|
||||
if(state==TRUE) {
|
||||
if (!scr.gpu->dispBG[layer]) GPU_addBack(scr.gpu, layer);
|
||||
} else {
|
||||
if (scr.gpu->dispBG[layer]) GPU_remove(scr.gpu, layer);
|
||||
}
|
||||
//fprintf(stderr,"Changed Layer %s to %d\n",layer,state);
|
||||
}
|
||||
void change_obj_layer(gboolean state, Screen scr) {
|
||||
// TODO
|
||||
}
|
||||
|
||||
/* LAYERS MAIN SCREEN ***** ***** ***** ***** */
|
||||
void on_wc_1_BG0_toggled (GtkToggleButton *togglebutton, gpointer user_data) {
|
||||
change_bgx_layer(0, gtk_toggle_button_get_active(togglebutton), MainScreen); }
|
||||
void on_wc_1_BG1_toggled (GtkToggleButton *togglebutton, gpointer user_data) {
|
||||
change_bgx_layer(1, gtk_toggle_button_get_active(togglebutton), MainScreen); }
|
||||
void on_wc_1_BG2_toggled (GtkToggleButton *togglebutton, gpointer user_data) {
|
||||
change_bgx_layer(2, gtk_toggle_button_get_active(togglebutton), MainScreen); }
|
||||
void on_wc_1_BG3_toggled (GtkToggleButton *togglebutton, gpointer user_data) {
|
||||
change_bgx_layer(3, gtk_toggle_button_get_active(togglebutton), MainScreen); }
|
||||
void on_wc_1_OBJ_toggled (GtkToggleButton *togglebutton, gpointer user_data) {
|
||||
change_obj_layer(gtk_toggle_button_get_active(togglebutton), MainScreen); }
|
||||
|
||||
/* LAYERS SECOND SCREEN ***** ***** ***** ***** */
|
||||
void on_wc_2b_BG0_toggled (GtkToggleButton *togglebutton, gpointer user_data) {
|
||||
change_bgx_layer(0, gtk_toggle_button_get_active(togglebutton), SubScreen); }
|
||||
void on_wc_2b_BG1_toggled (GtkToggleButton *togglebutton, gpointer user_data) {
|
||||
change_bgx_layer(1, gtk_toggle_button_get_active(togglebutton), SubScreen); }
|
||||
void on_wc_2b_BG2_toggled (GtkToggleButton *togglebutton, gpointer user_data) {
|
||||
change_bgx_layer(2, gtk_toggle_button_get_active(togglebutton), SubScreen); }
|
||||
void on_wc_2b_BG3_toggled (GtkToggleButton *togglebutton, gpointer user_data) {
|
||||
change_bgx_layer(3, gtk_toggle_button_get_active(togglebutton), SubScreen); }
|
||||
void on_wc_2b_OBJ_toggled (GtkToggleButton *togglebutton, gpointer user_data) {
|
||||
change_obj_layer(gtk_toggle_button_get_active(togglebutton), SubScreen); }
|
|
@ -0,0 +1,60 @@
|
|||
#include "globals.h"
|
||||
|
||||
/* MENU FILE */
|
||||
void on_menu_ouvrir_activate (GtkMenuItem *menuitem, gpointer user_data);
|
||||
void on_menu_pscreen_activate (GtkMenuItem *menuitem, gpointer user_data);
|
||||
void on_menu_quit_activate (GtkMenuItem *menuitem, gpointer user_data);
|
||||
|
||||
/* MENU EMULATION */
|
||||
void on_menu_exec_activate (GtkMenuItem *menuitem, gpointer user_data);
|
||||
void on_menu_pause_activate (GtkMenuItem *menuitem, gpointer user_data);
|
||||
void on_menu_reset_activate (GtkMenuItem *menuitem, gpointer user_data);
|
||||
void on_menu_layers_activate (GtkMenuItem *menuitem, gpointer user_data);
|
||||
/* SUBMENU FRAMESKIP */
|
||||
void on_fsXX_activate (GtkMenuItem *menuitem, gpointer user_data);
|
||||
void on_fs0_activate (GtkMenuItem *menuitem, gpointer user_data);
|
||||
void on_fs1_activate (GtkMenuItem *menuitem, gpointer user_data);
|
||||
void on_fs2_activate (GtkMenuItem *menuitem, gpointer user_data);
|
||||
void on_fs3_activate (GtkMenuItem *menuitem, gpointer user_data);
|
||||
void on_fs4_activate (GtkMenuItem *menuitem, gpointer user_data);
|
||||
void on_fs5_activate (GtkMenuItem *menuitem, gpointer user_data);
|
||||
void on_fs6_activate (GtkMenuItem *menuitem, gpointer user_data);
|
||||
void on_fs7_activate (GtkMenuItem *menuitem, gpointer user_data);
|
||||
void on_fs8_activate (GtkMenuItem *menuitem, gpointer user_data);
|
||||
void on_fs9_activate (GtkMenuItem *menuitem, gpointer user_data);
|
||||
/* SUBMENU SIZE */
|
||||
void on_size1x_activate (GtkMenuItem *menuitem, gpointer user_data);
|
||||
void on_size2x_activate (GtkMenuItem *menuitem, gpointer user_data);
|
||||
void on_size3x_activate (GtkMenuItem *menuitem, gpointer user_data);
|
||||
|
||||
|
||||
/* MENU CONFIG */
|
||||
void on_menu_controls_activate (GtkMenuItem *menuitem, gpointer user_data);
|
||||
void on_menu_rightscreen_activate (GtkMenuItem *menuitem, gpointer user_data);
|
||||
/* MENU TOOLS */
|
||||
void on_menu_IO_regs_activate (GtkMenuItem *menuitem, gpointer user_data);
|
||||
/* MENU ? */
|
||||
void on_menu_apropos_activate (GtkMenuItem *menuitem, gpointer user_data);
|
||||
|
||||
|
||||
/* TOOLBAR */
|
||||
void on_wgt_Open_clicked (GtkToolButton *toolbutton, gpointer user_data);
|
||||
void on_wgt_Exec_toggled (GtkToggleToolButton *toggletoolbutton,
|
||||
gpointer user_data);
|
||||
void on_wgt_Reset_clicked (GtkToolButton *toolbutton, gpointer user_data);
|
||||
void on_wgt_Quit_clicked (GtkToolButton *toolbutton, gpointer user_data);
|
||||
|
||||
|
||||
/* LAYERS MAIN SCREEN */
|
||||
void on_wc_1_BG0_toggled (GtkToggleButton *togglebutton, gpointer user_data);
|
||||
void on_wc_1_BG1_toggled (GtkToggleButton *togglebutton, gpointer user_data);
|
||||
void on_wc_1_BG2_toggled (GtkToggleButton *togglebutton, gpointer user_data);
|
||||
void on_wc_1_BG3_toggled (GtkToggleButton *togglebutton, gpointer user_data);
|
||||
void on_wc_1_OBJ_toggled (GtkToggleButton *togglebutton, gpointer user_data);
|
||||
|
||||
/* LAYERS SECOND SCREEN */
|
||||
void on_wc_2b_BG0_toggled (GtkToggleButton *togglebutton, gpointer user_data);
|
||||
void on_wc_2b_BG1_toggled (GtkToggleButton *togglebutton, gpointer user_data);
|
||||
void on_wc_2b_BG2_toggled (GtkToggleButton *togglebutton, gpointer user_data);
|
||||
void on_wc_2b_BG3_toggled (GtkToggleButton *togglebutton, gpointer user_data);
|
||||
void on_wc_2b_BG4_toggled (GtkToggleButton *togglebutton, gpointer user_data);
|
|
@ -0,0 +1,253 @@
|
|||
#include "callbacks_IO.h"
|
||||
|
||||
static u16 Cur_Keypad = 0;
|
||||
|
||||
|
||||
|
||||
/* ***** ***** INPUT BUTTONS / KEYBOARD ***** ***** */
|
||||
|
||||
|
||||
|
||||
u16 inline lookup_key (guint keyval) {
|
||||
int i;
|
||||
u16 Key = 0;
|
||||
for(i = 0; i < DESMUME_NB_KEYS; i++)
|
||||
if(keyval == Keypad_Config[i]) break;
|
||||
if(i < DESMUME_NB_KEYS)
|
||||
Key = DESMUME_KEYMASK_(i);
|
||||
//fprintf(stderr,"K:%d(%d)->%X => [%X]\n", e->keyval, e->hardware_keycode, Key, Cur_Keypad);
|
||||
return Key;
|
||||
}
|
||||
|
||||
gboolean on_wMainW_key_press_event (GtkWidget *widget, GdkEventKey *event, gpointer user_data) {
|
||||
u16 Key = lookup_key(event->keyval);
|
||||
if (Key != 0) {
|
||||
Cur_Keypad |= Key;
|
||||
if(desmume_running()) desmume_keypad(Cur_Keypad);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
gboolean on_wMainW_key_release_event (GtkWidget *widget, GdkEventKey *event, gpointer user_data) {
|
||||
u16 Key = lookup_key(event->keyval);
|
||||
if (Key != 0) {
|
||||
Cur_Keypad &= ~Key;
|
||||
if(desmume_running()) desmume_keypad(Cur_Keypad);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* ***** ***** SCREEN DRAWING ***** ***** */
|
||||
|
||||
|
||||
|
||||
|
||||
const int offset_pixels_lower_screen = 256*2*192; // w * bpp * h
|
||||
|
||||
int screen (GtkWidget * widget, int offset_pix) {
|
||||
SDL_PixelFormat screenPixFormat;
|
||||
SDL_Surface *rawImage, *screenImage;
|
||||
|
||||
rawImage = SDL_CreateRGBSurfaceFrom(((char*)&GPU_screen)+offset_pix, 256, 192, 16, 512, 0x001F, 0x03E0, 0x7C00, 0);
|
||||
if(rawImage == NULL) return 1;
|
||||
|
||||
memcpy(&screenPixFormat, rawImage->format, sizeof(SDL_PixelFormat));
|
||||
|
||||
screenPixFormat.BitsPerPixel = 24;
|
||||
screenPixFormat.BytesPerPixel = 3;
|
||||
screenPixFormat.Rshift = 0;
|
||||
screenPixFormat.Gshift = 8;
|
||||
screenPixFormat.Bshift = 16;
|
||||
screenPixFormat.Rmask = 0x0000FF;
|
||||
screenPixFormat.Gmask = 0x00FF00;
|
||||
screenPixFormat.Bmask = 0xFF0000;
|
||||
|
||||
screenImage = SDL_ConvertSurface(rawImage, &screenPixFormat, 0);
|
||||
//TODO : use pixbuf for scaling...
|
||||
|
||||
gdk_draw_rgb_image (widget->window,
|
||||
widget->style->fg_gc[widget->state],0,0,screenImage->w, screenImage->h,
|
||||
GDK_RGB_DITHER_NONE,(guchar*)screenImage->pixels,screenImage->pitch);
|
||||
SDL_FreeSurface(screenImage);
|
||||
SDL_FreeSurface(rawImage);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* OUTPUT UPPER SCREEN */
|
||||
void on_wDraw_Main_realize (GtkWidget *widget, gpointer user_data) { }
|
||||
gboolean on_wDraw_Main_expose_event (GtkWidget *widget, GdkEventExpose *event, gpointer user_data) {
|
||||
return screen(widget, 0);
|
||||
}
|
||||
|
||||
/* OUTPUT LOWER SCREEN */
|
||||
void on_wDraw_Sub_realize (GtkWidget *widget, gpointer user_data) { }
|
||||
gboolean on_wDraw_Sub_expose_event (GtkWidget *widget, GdkEventExpose *event, gpointer user_data) {
|
||||
return screen(widget, offset_pixels_lower_screen);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/* ***** ***** INPUT STYLUS / MOUSE ***** ***** */
|
||||
|
||||
|
||||
|
||||
gboolean on_wDraw_Sub_button_press_event (GtkWidget *widget, GdkEventButton *event, gpointer user_data) {
|
||||
GdkModifierType state;
|
||||
gint x,y;
|
||||
s32 EmuX, EmuY;
|
||||
|
||||
if(desmume_running())
|
||||
{
|
||||
if(event->button == 1)
|
||||
{
|
||||
click = TRUE;
|
||||
|
||||
gdk_window_get_pointer(widget->window, &x, &y, &state);
|
||||
if (state & GDK_BUTTON1_MASK)
|
||||
{
|
||||
EmuX = x;
|
||||
EmuY = y;
|
||||
if(EmuX<0) EmuX = 0; else if(EmuX>255) EmuX = 255;
|
||||
if(EmuY<0) EmuY = 0; else if(EmuY>192) EmuY = 192;
|
||||
NDS_setTouchPos(EmuX, EmuY);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
gboolean on_wDraw_Sub_button_release_event (GtkWidget *widget, GdkEventButton *event, gpointer user_data) {
|
||||
if(click) NDS_releasTouch();
|
||||
click = FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
gboolean on_wDraw_Sub_motion_notify_event (GtkWidget *widget, GdkEventMotion *event, gpointer user_data) {
|
||||
GdkModifierType state;
|
||||
gint x,y;
|
||||
s32 EmuX, EmuY;
|
||||
|
||||
|
||||
if(click)
|
||||
{
|
||||
if(event->is_hint)
|
||||
gdk_window_get_pointer(widget->window, &x, &y, &state);
|
||||
else
|
||||
{
|
||||
x= (gint)event->x;
|
||||
y= (gint)event->y;
|
||||
state=(GdkModifierType)event->state;
|
||||
}
|
||||
|
||||
// fprintf(stderr,"X=%d, Y=%d, S&1=%d\n", x,y,state&GDK_BUTTON1_MASK);
|
||||
|
||||
if(state & GDK_BUTTON1_MASK)
|
||||
{
|
||||
EmuX = x;
|
||||
EmuY = y;
|
||||
if(EmuX<0) EmuX = 0; else if(EmuX>255) EmuX = 255;
|
||||
if(EmuY<0) EmuY = 0; else if(EmuY>192) EmuY = 192;
|
||||
NDS_setTouchPos(EmuX, EmuY);
|
||||
}
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/* ***** ***** KEYBOARD CONFIG / KEY DEFINITION ***** ***** */
|
||||
|
||||
|
||||
const char * DESMUME_KEY_NAMES[DESMUME_NB_KEYS]={
|
||||
"A", "B",
|
||||
"Select", "Start",
|
||||
"Right", "Left", "Up", "Down",
|
||||
"R", "L", "Y", "X", "DEBUG"
|
||||
};
|
||||
gint Keypad_Temp[DESMUME_NB_KEYS];
|
||||
guint temp_Key=0;
|
||||
|
||||
void init_labels() {
|
||||
int i;
|
||||
char text[50], bname[20];
|
||||
GtkButton *b;
|
||||
for (i=0; i<DESMUME_NB_KEYS; i++) {
|
||||
sprintf(text,"%s : %s\0\0",DESMUME_KEY_NAMES[i],KEYNAME(Keypad_Config[i]));
|
||||
sprintf(bname,"button_%s\0\0",DESMUME_KEY_NAMES[i]);
|
||||
b = (GtkButton*)glade_xml_get_widget(xml, bname);
|
||||
gtk_button_set_label(b,text);
|
||||
}
|
||||
}
|
||||
|
||||
void edit_controls() {
|
||||
GtkDialog * dlg = (GtkDialog*)glade_xml_get_widget(xml, "wKeybConfDlg");
|
||||
memcpy(&Keypad_Temp, &Keypad_Config, sizeof(Keypad_Config));
|
||||
/* we change the labels so we know keyb def */
|
||||
init_labels();
|
||||
gtk_widget_show((GtkWidget*)dlg);
|
||||
}
|
||||
|
||||
void on_wKeybConfDlg_response (GtkDialog *dialog, gint arg1, gpointer user_data) {
|
||||
/* overwrite keyb def if user selected ok */
|
||||
if (arg1 == GTK_RESPONSE_OK)
|
||||
memcpy(&Keypad_Config, &Keypad_Temp, sizeof(Keypad_Config));
|
||||
gtk_widget_hide((GtkWidget*)dialog);
|
||||
}
|
||||
|
||||
void inline current_key_label() {
|
||||
GtkLabel * lbl = (GtkLabel*)glade_xml_get_widget(xml, "label_key");
|
||||
gtk_label_set_text(lbl, KEYNAME(temp_Key));
|
||||
}
|
||||
|
||||
gboolean on_wKeyDlg_key_press_event (GtkWidget *widget, GdkEventKey *event, gpointer user_data) {
|
||||
temp_Key = event->keyval;
|
||||
current_key_label();
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void ask(GtkButton*b, int key) {
|
||||
char text[50];
|
||||
GtkDialog * dlg = (GtkDialog*)glade_xml_get_widget(xml, "wKeyDlg");
|
||||
key--; /* key = bit position, start with 1 */
|
||||
temp_Key = Keypad_Temp[key];
|
||||
current_key_label();
|
||||
switch (gtk_dialog_run(dlg))
|
||||
{
|
||||
case GTK_RESPONSE_OK:
|
||||
Keypad_Temp[key]=temp_Key;
|
||||
sprintf(text,"%s : %s\0\0",DESMUME_KEY_NAMES[key],KEYNAME(temp_Key));
|
||||
gtk_button_set_label(b,text);
|
||||
break;
|
||||
case GTK_RESPONSE_CANCEL:
|
||||
case GTK_RESPONSE_NONE:
|
||||
break;
|
||||
}
|
||||
gtk_widget_hide((GtkWidget*)dlg);
|
||||
}
|
||||
|
||||
void on_button_Left_clicked (GtkButton *b, gpointer user_data) { ask(b,DESMUME_KEY_Left); }
|
||||
void on_button_Up_clicked (GtkButton *b, gpointer user_data) { ask(b,DESMUME_KEY_Up); }
|
||||
void on_button_Right_clicked (GtkButton *b, gpointer user_data) { ask(b,DESMUME_KEY_Right); }
|
||||
void on_button_Down_clicked (GtkButton *b, gpointer user_data) { ask(b,DESMUME_KEY_Down); }
|
||||
|
||||
void on_button_L_clicked (GtkButton *b, gpointer user_data) { ask(b,DESMUME_KEY_L); }
|
||||
void on_button_R_clicked (GtkButton *b, gpointer user_data) { ask(b,DESMUME_KEY_R); }
|
||||
|
||||
void on_button_Y_clicked (GtkButton *b, gpointer user_data) { ask(b,DESMUME_KEY_Y); }
|
||||
void on_button_X_clicked (GtkButton *b, gpointer user_data) { ask(b,DESMUME_KEY_X); }
|
||||
void on_button_A_clicked (GtkButton *b, gpointer user_data) { ask(b,DESMUME_KEY_A); }
|
||||
void on_button_B_clicked (GtkButton *b, gpointer user_data) { ask(b,DESMUME_KEY_B); }
|
||||
|
||||
void on_button_Start_clicked (GtkButton *b, gpointer user_data) { ask(b,DESMUME_KEY_Start); }
|
||||
void on_button_Select_clicked (GtkButton *b, gpointer user_data) { ask(b,DESMUME_KEY_Select); }
|
||||
void on_button_Debug_clicked (GtkButton *b, gpointer user_data) { ask(b,DESMUME_KEY_DEBUG); }
|
|
@ -0,0 +1,43 @@
|
|||
#include "globals.h"
|
||||
|
||||
/* INPUT BUTTONS / KEYBOARD */
|
||||
gboolean on_wMainW_key_press_event (GtkWidget *widget, GdkEventKey *event, gpointer user_data);
|
||||
gboolean on_wMainW_key_release_event (GtkWidget *widget, GdkEventKey *event, gpointer user_data);
|
||||
|
||||
/* OUTPUT UPPER SCREEN */
|
||||
void on_wDraw_Main_realize (GtkWidget *widget, gpointer user_data);
|
||||
gboolean on_wDraw_Main_expose_event (GtkWidget *widget, GdkEventExpose *event, gpointer user_data);
|
||||
|
||||
/* OUTPUT LOWER SCREEN */
|
||||
void on_wDraw_Sub_realize (GtkWidget *widget, gpointer user_data);
|
||||
gboolean on_wDraw_Sub_expose_event (GtkWidget *widget, GdkEventExpose *event, gpointer user_data);
|
||||
|
||||
/* INPUT STYLUS / MOUSE */
|
||||
gboolean on_wDraw_Sub_button_press_event (GtkWidget *widget, GdkEventButton *event, gpointer user_data);
|
||||
gboolean on_wDraw_Sub_button_release_event (GtkWidget *widget, GdkEventButton *event, gpointer user_data);
|
||||
gboolean on_wDraw_Sub_motion_notify_event (GtkWidget *widget, GdkEventMotion *event, gpointer user_data);
|
||||
|
||||
|
||||
|
||||
|
||||
/* KEYBOARD CONFIG / KEY DEFINITION */
|
||||
|
||||
gboolean on_wKeyDlg_key_press_event (GtkWidget *widget, GdkEventKey *event, gpointer user_data);
|
||||
void on_wKeybConfDlg_response (GtkDialog *dialog, gint arg1, gpointer user_data);
|
||||
|
||||
void on_button_Left_clicked (GtkButton *button, gpointer user_data);
|
||||
void on_button_Up_clicked (GtkButton *button, gpointer user_data);
|
||||
void on_button_Right_clicked (GtkButton *button, gpointer user_data);
|
||||
void on_button_Down_clicked (GtkButton *button, gpointer user_data);
|
||||
|
||||
void on_button_L_clicked (GtkButton *button, gpointer user_data);
|
||||
void on_button_R_clicked (GtkButton *button, gpointer user_data);
|
||||
|
||||
void on_button_Y_clicked (GtkButton *button, gpointer user_data);
|
||||
void on_button_X_clicked (GtkButton *button, gpointer user_data);
|
||||
void on_button_A_clicked (GtkButton *button, gpointer user_data);
|
||||
void on_button_B_clicked (GtkButton *button, gpointer user_data);
|
||||
|
||||
void on_button_Start_clicked (GtkButton *button, gpointer user_data);
|
||||
void on_button_Select_clicked (GtkButton *button, gpointer user_data);
|
||||
void on_button_Debug_clicked (GtkButton *button, gpointer user_data);
|
|
@ -0,0 +1,159 @@
|
|||
#include "desmume.h"
|
||||
|
||||
#define EMULOOP_PRIO (G_PRIORITY_HIGH_IDLE + 20)
|
||||
gboolean EmuLoop(gpointer data);
|
||||
static BOOL regMainLoop = FALSE;
|
||||
|
||||
|
||||
volatile BOOL execute = FALSE;
|
||||
BOOL click = FALSE;
|
||||
BOOL fini = FALSE;
|
||||
unsigned long glock = 0;
|
||||
|
||||
void desmume_mem_init();
|
||||
|
||||
u8 *desmume_rom_data = NULL;
|
||||
u32 desmume_last_cycle;
|
||||
|
||||
void desmume_init()
|
||||
{
|
||||
NDS_Init();
|
||||
SPU_ChangeSoundCore(SNDCORE_SDL, 735 * 4);
|
||||
execute = FALSE;
|
||||
}
|
||||
|
||||
void desmume_free()
|
||||
{
|
||||
execute = FALSE;
|
||||
NDS_DeInit();
|
||||
}
|
||||
|
||||
int desmume_open(const char *filename)
|
||||
{
|
||||
int i = NDS_LoadROM(filename, MC_TYPE_AUTODETECT, 1);
|
||||
return i;
|
||||
}
|
||||
|
||||
void desmume_pause()
|
||||
{
|
||||
execute = FALSE;
|
||||
}
|
||||
|
||||
void desmume_resume()
|
||||
{
|
||||
|
||||
execute = TRUE;
|
||||
if(!regMainLoop)
|
||||
{
|
||||
g_idle_add_full(EMULOOP_PRIO, &EmuLoop, NULL, NULL); regMainLoop = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
void desmume_reset()
|
||||
{
|
||||
NDS_Reset();
|
||||
desmume_resume();
|
||||
}
|
||||
|
||||
void desmume_toggle()
|
||||
{
|
||||
execute = (execute) ? FALSE : TRUE;
|
||||
}
|
||||
BOOL desmume_running()
|
||||
{
|
||||
return execute;
|
||||
}
|
||||
|
||||
void desmume_cycle()
|
||||
{
|
||||
desmume_last_cycle = NDS_exec((560190 << 1) - desmume_last_cycle, FALSE);
|
||||
SPU_Emulate();
|
||||
}
|
||||
|
||||
void desmume_keypad(u16 k)
|
||||
{
|
||||
unsigned short k_ext = (k >> 10) & 0x3;
|
||||
unsigned short k_pad = k & 0x3FF;
|
||||
((unsigned short *)ARM9Mem.ARM9_REG)[0x130>>1] = ~k_pad;
|
||||
((unsigned short *)MMU.ARM7_REG)[0x130>>1] = ~k_ext;
|
||||
}
|
||||
|
||||
|
||||
/////////////////////////////// TOOLS MANAGEMENT ///////////////////////////////
|
||||
#if 0
|
||||
//#include "dTool.h"
|
||||
|
||||
extern const dTool_t *dTools_list[];
|
||||
extern const int dTools_list_size;
|
||||
|
||||
BOOL *dTools_running;
|
||||
|
||||
void Start_dTool(GtkWidget *widget, gpointer data)
|
||||
{
|
||||
int tool = GPOINTER_TO_INT(data);
|
||||
|
||||
if(dTools_running[tool]) return;
|
||||
|
||||
dTools_list[tool]->open(tool);
|
||||
dTools_running[tool] = TRUE;
|
||||
}
|
||||
|
||||
void dTool_CloseCallback(int tool)
|
||||
{
|
||||
dTools_running[tool] = FALSE;
|
||||
}
|
||||
|
||||
/////////////////////////////// MAIN EMULATOR LOOP ///////////////////////////////
|
||||
|
||||
|
||||
static inline void _updateDTools()
|
||||
{
|
||||
int i;
|
||||
for(i = 0; i < dTools_list_size; i++)
|
||||
{
|
||||
if(dTools_running[i]) { dTools_list[i]->update(); }
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
Uint32 fps, fps_SecStart, fps_FrameCount;
|
||||
static void Draw()
|
||||
{
|
||||
}
|
||||
gboolean EmuLoop(gpointer data)
|
||||
{
|
||||
int i;
|
||||
|
||||
if(desmume_running()) /* Si on est en train d'executer le programme ... */
|
||||
{
|
||||
|
||||
fps_FrameCount += Frameskip + 1;
|
||||
if(!fps_SecStart) fps_SecStart = SDL_GetTicks();
|
||||
if(SDL_GetTicks() - fps_SecStart >= 1000)
|
||||
{
|
||||
fps_SecStart = SDL_GetTicks();
|
||||
fps = fps_FrameCount;
|
||||
fps_FrameCount = 0;
|
||||
|
||||
char Title[32];
|
||||
sprintf(Title, "Desmume - %dfps", fps);
|
||||
gtk_window_set_title(GTK_WINDOW(pWindow), Title);
|
||||
}
|
||||
|
||||
desmume_cycle(); /* Emule ! */
|
||||
for(i = 0; i < Frameskip; i++) desmume_cycle(); /* cycles supplémentaires pour le frameskip */
|
||||
|
||||
Draw();
|
||||
|
||||
// _updateDTools();
|
||||
gtk_widget_queue_draw(pDrawingArea);
|
||||
gtk_widget_queue_draw(pDrawingArea2);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
regMainLoop = FALSE;
|
||||
return FALSE;
|
||||
}
|
||||
|
|
@ -0,0 +1,42 @@
|
|||
#ifndef __DESMUME_H__
|
||||
#define __DESMUME_H__
|
||||
|
||||
|
||||
#define DESMUME_NB_KEYS 13
|
||||
|
||||
#define DESMUME_KEYMASK_(k) (1 << k)
|
||||
|
||||
#define DESMUME_KEY_NONE 0
|
||||
#define DESMUME_KEY_A 1
|
||||
#define DESMUME_KEY_B 2
|
||||
#define DESMUME_KEY_Select 3
|
||||
#define DESMUME_KEY_Start 4
|
||||
#define DESMUME_KEY_Right 5
|
||||
#define DESMUME_KEY_Left 6
|
||||
#define DESMUME_KEY_Up 7
|
||||
#define DESMUME_KEY_Down 8
|
||||
#define DESMUME_KEY_R 9
|
||||
#define DESMUME_KEY_L 10
|
||||
|
||||
#define DESMUME_KEY_Y 11
|
||||
#define DESMUME_KEY_X 12
|
||||
#define DESMUME_KEY_DEBUG 13
|
||||
|
||||
#include "globals.h"
|
||||
|
||||
extern void desmume_init();
|
||||
extern void desmume_free();
|
||||
|
||||
extern int desmume_open(const char *filename);
|
||||
extern void desmume_pause();
|
||||
extern void desmume_resume();
|
||||
extern void desmume_reset();
|
||||
extern void desmume_toggle();
|
||||
extern BOOL desmume_running();
|
||||
|
||||
extern void desmume_cycle();
|
||||
|
||||
extern void desmume_keypad(u16 k);
|
||||
|
||||
#endif /*__DESMUME_H__*/
|
||||
|
|
@ -0,0 +1,44 @@
|
|||
#ifndef __GLOBALS_H__
|
||||
#define __GLOBALS_H__
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <libgen.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <SDL/SDL.h>
|
||||
#include <gtk/gtk.h>
|
||||
#include <gdk/gdkkeysyms.h>
|
||||
#include <glade/glade.h>
|
||||
|
||||
#include "../MMU.h"
|
||||
#include "../armcpu.h"
|
||||
#include "../NDSSystem.h"
|
||||
#include "../cflash.h"
|
||||
#include "../sndsdl.h"
|
||||
#include "../types.h"
|
||||
#include "desmume.h"
|
||||
|
||||
uint Frameskip;
|
||||
gint Keypad_Config[DESMUME_NB_KEYS];
|
||||
gint Keypad_Temp[DESMUME_NB_KEYS];
|
||||
|
||||
/* main.c */
|
||||
GtkWidget * pWindow;
|
||||
GtkWidget * pDrawingArea;
|
||||
GtkWidget * pDrawingArea2;
|
||||
GladeXML * xml;
|
||||
|
||||
/* callbacks_IO.c */
|
||||
void edit_controls();
|
||||
|
||||
/* printscreen.c */
|
||||
int WriteBMP(const char *filename,u16 *bmp);
|
||||
|
||||
/* keyvalnames.c -see <gdk/gdkkeysyms.h>- */
|
||||
char * KEYVAL_NAMES[0x10000];
|
||||
char * KEYNAME(int k);
|
||||
void init_keyvals();
|
||||
|
||||
#endif /* __GLOBALS_H__ */
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,179 @@
|
|||
// damdoum 2007-01, released under GNU GPL.
|
||||
|
||||
#include "callbacks.h"
|
||||
#include "callbacks_IO.h"
|
||||
#include "globals.h"
|
||||
|
||||
GtkWidget * pWindow;
|
||||
GtkWidget * pDrawingArea;
|
||||
GtkWidget * pDrawingArea2;
|
||||
GladeXML * xml;
|
||||
|
||||
SoundInterface_struct *SNDCoreList[] = {
|
||||
&SNDDummy,
|
||||
&SNDFile,
|
||||
&SNDSDL,
|
||||
NULL
|
||||
};
|
||||
|
||||
/* ***** ***** CONFIG FILE ***** ***** */
|
||||
|
||||
gint Keypad_Config[DESMUME_NB_KEYS];
|
||||
|
||||
const char *Ini_Keypad_Values[DESMUME_NB_KEYS] =
|
||||
{
|
||||
"KEY_A",
|
||||
"KEY_B",
|
||||
"KEY_SELECT",
|
||||
"KEY_START",
|
||||
"KEY_RIGHT",
|
||||
"KEY_LEFT",
|
||||
"KEY_UP",
|
||||
"KEY_DOWN",
|
||||
"KEY_R",
|
||||
"KEY_L",
|
||||
"KEY_Y",
|
||||
"KEY_X",
|
||||
"KEY_DEBUG",
|
||||
};
|
||||
|
||||
const gint Default_Keypad_Config[DESMUME_NB_KEYS] =
|
||||
{
|
||||
GDK_A,
|
||||
GDK_B,
|
||||
GDK_BackSpace,
|
||||
GDK_Return,
|
||||
GDK_Right,
|
||||
GDK_Left,
|
||||
GDK_Up,
|
||||
GDK_Down,
|
||||
GDK_KP_Decimal,
|
||||
GDK_KP_0,
|
||||
GDK_Y,
|
||||
GDK_X,
|
||||
GDK_P
|
||||
};
|
||||
|
||||
char * CONFIG_FILE;
|
||||
|
||||
void inline Load_DefaultConfig()
|
||||
{
|
||||
memcpy(Keypad_Config, Default_Keypad_Config, sizeof(Keypad_Config));
|
||||
}
|
||||
|
||||
int Read_ConfigFile()
|
||||
{
|
||||
int i, tmp;
|
||||
GKeyFile * keyfile = g_key_file_new();
|
||||
GError * error = NULL;
|
||||
|
||||
Load_DefaultConfig();
|
||||
|
||||
g_key_file_load_from_file(keyfile, CONFIG_FILE, G_KEY_FILE_NONE, 0);
|
||||
|
||||
const char *c;
|
||||
|
||||
for(i = 0; i < DESMUME_NB_KEYS; i++)
|
||||
{
|
||||
tmp = g_key_file_get_integer(keyfile, "KEYS", Ini_Keypad_Values[i], &error);
|
||||
if (error != NULL) {
|
||||
g_error_free(error);
|
||||
error = NULL;
|
||||
} else {
|
||||
Keypad_Config[i] = g_key_file_get_integer(keyfile, "KEYS", Ini_Keypad_Values[i], &error);
|
||||
}
|
||||
}
|
||||
|
||||
g_key_file_free(keyfile);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int Write_ConfigFile()
|
||||
{
|
||||
int i;
|
||||
GKeyFile * keyfile;
|
||||
|
||||
keyfile = g_key_file_new();
|
||||
|
||||
for(i = 0; i < DESMUME_NB_KEYS; i++)
|
||||
{
|
||||
g_key_file_set_integer(keyfile, "KEYS", Ini_Keypad_Values[i], Keypad_Config[i]);
|
||||
}
|
||||
|
||||
g_file_set_contents(CONFIG_FILE, g_key_file_to_data(keyfile, 0, 0), -1, 0);
|
||||
g_key_file_free(keyfile);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/* ***** ***** MAIN ***** ***** */
|
||||
|
||||
|
||||
#ifdef WIN32
|
||||
int WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nFunsterStil)
|
||||
{
|
||||
main(0,NULL);
|
||||
}
|
||||
#endif
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
|
||||
const char *commandLine_File = NULL;
|
||||
|
||||
if(argc == 2) commandLine_File = argv[1];
|
||||
|
||||
#ifdef DEBUG
|
||||
LogStart();
|
||||
#endif
|
||||
init_keyvals();
|
||||
|
||||
gtk_init(&argc, &argv);
|
||||
SDL_Init(SDL_INIT_VIDEO);
|
||||
desmume_init();
|
||||
|
||||
CONFIG_FILE = g_build_filename(g_get_home_dir(), ".desmume.ini", NULL);
|
||||
Read_ConfigFile();
|
||||
|
||||
/* load the interface */
|
||||
xml = glade_xml_new("DeSmuMe.glade", NULL, NULL);
|
||||
pWindow = glade_xml_get_widget(xml, "wMainW");
|
||||
pDrawingArea = glade_xml_get_widget(xml, "wDraw_Main");
|
||||
pDrawingArea2 = glade_xml_get_widget(xml, "wDraw_Sub");
|
||||
|
||||
/* connect the signals in the interface */
|
||||
glade_xml_signal_autoconnect(xml);
|
||||
|
||||
/* Vérifie la ligne de commandes */
|
||||
if(commandLine_File) {
|
||||
if(desmume_open(commandLine_File) >= 0) {
|
||||
desmume_resume();
|
||||
} else {
|
||||
GtkWidget *pDialog = gtk_message_dialog_new(GTK_WINDOW(pWindow),
|
||||
GTK_DIALOG_MODAL,
|
||||
GTK_MESSAGE_INFO,
|
||||
GTK_BUTTONS_OK,
|
||||
"Unable to load :\n%s", commandLine_File);
|
||||
gtk_dialog_run(GTK_DIALOG(pDialog));
|
||||
gtk_widget_destroy(pDialog);
|
||||
}
|
||||
}
|
||||
|
||||
/* start event loop */
|
||||
gtk_main();
|
||||
desmume_free();
|
||||
|
||||
#ifdef DEBUG
|
||||
LogStop();
|
||||
#endif
|
||||
|
||||
SDL_Quit();
|
||||
Write_ConfigFile();
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
|
@ -0,0 +1,89 @@
|
|||
#include <gtk/gtk.h>
|
||||
|
||||
#include "../armcpu.h"
|
||||
|
||||
/////////////////////////////// PRINTSCREEN /////////////////////////////////
|
||||
// TODO: improve (let choose filename, and use png)
|
||||
|
||||
typedef struct
|
||||
{
|
||||
u32 header_size;
|
||||
s32 width;
|
||||
s32 height;
|
||||
u16 r1;
|
||||
u16 depth;
|
||||
u32 r2;
|
||||
u32 size;
|
||||
s32 r3,r4;
|
||||
u32 r5,r6;
|
||||
}BmpImageHeader;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
u16 type;
|
||||
u32 size;
|
||||
u16 r1, r2;
|
||||
u32 data_offset;
|
||||
}BmpFileHeader;
|
||||
|
||||
|
||||
int WriteBMP(const char *filename,u16 *bmp){
|
||||
BmpFileHeader fileheader;
|
||||
BmpImageHeader imageheader;
|
||||
fileheader.size = 14;
|
||||
fileheader.type = 0x4D42;
|
||||
fileheader.r1 = 0;
|
||||
fileheader.r2=0;
|
||||
fileheader.data_offset = 14+40;
|
||||
|
||||
imageheader.header_size = 40;
|
||||
imageheader.r1 = 1;
|
||||
imageheader.depth = 24;
|
||||
imageheader.r2 = 0;
|
||||
imageheader.size = 256 * 192*2 * 3;
|
||||
imageheader.r3 = 0;
|
||||
imageheader.r4 = 0;
|
||||
imageheader.r5 = 0;
|
||||
imageheader.r6 = 0;
|
||||
imageheader.width = 256;
|
||||
imageheader.height = 192*2;
|
||||
|
||||
FILE *fichier = fopen(filename,"wb");
|
||||
//fwrite(&fileheader, 1, 14, fichier);
|
||||
|
||||
//fwrite(&imageheader, 1, 40, fichier);
|
||||
fwrite( &fileheader.type, sizeof(fileheader.type), 1, fichier);
|
||||
fwrite( &fileheader.size, sizeof(fileheader.size), 1, fichier);
|
||||
fwrite( &fileheader.r1, sizeof(fileheader.r1), 1, fichier);
|
||||
fwrite( &fileheader.r2, sizeof(fileheader.r2), 1, fichier);
|
||||
fwrite( &fileheader.data_offset, sizeof(fileheader.data_offset), 1, fichier);
|
||||
fwrite( &imageheader.header_size, sizeof(imageheader.header_size), 1, fichier);
|
||||
fwrite( &imageheader.width, sizeof(imageheader.width), 1, fichier);
|
||||
fwrite( &imageheader.height, sizeof(imageheader.height), 1, fichier);
|
||||
fwrite( &imageheader.r1, sizeof(imageheader.r1), 1, fichier);
|
||||
fwrite( &imageheader.depth, sizeof(imageheader.depth), 1, fichier);
|
||||
fwrite( &imageheader.r2, sizeof(imageheader.r2), 1, fichier);
|
||||
fwrite( &imageheader.size, sizeof(imageheader.size), 1, fichier);
|
||||
fwrite( &imageheader.r3, sizeof(imageheader.r3), 1, fichier);
|
||||
fwrite( &imageheader.r4, sizeof(imageheader.r4), 1, fichier);
|
||||
fwrite( &imageheader.r5, sizeof(imageheader.r5), 1, fichier);
|
||||
fwrite( &imageheader.r6, sizeof(imageheader.r6), 1, fichier);
|
||||
int i,j,k;
|
||||
for(j=0;j<192*2;j++)for(i=0;i<256;i++){
|
||||
u8 r,g,b;
|
||||
u16 pixel = bmp[i+(192*2-j)*256];
|
||||
r = pixel>>10;
|
||||
pixel-=r<<10;
|
||||
g = pixel>>5;
|
||||
pixel-=g<<5;
|
||||
b = pixel;
|
||||
r*=255/31;
|
||||
g*=255/31;
|
||||
b*=255/31;
|
||||
fwrite(&r, 1, sizeof(char), fichier);
|
||||
fwrite(&g, 1, sizeof(char), fichier);
|
||||
fwrite(&b, 1, sizeof(char), fichier);
|
||||
}
|
||||
fclose(fichier);
|
||||
return 1;
|
||||
}
|
Loading…
Reference in New Issue