damdoum 2007-01:

gtk-glade ui files
This commit is contained in:
damdoum 2007-01-03 23:54:08 +00:00
parent daf5d2713d
commit 55cfb520b8
10 changed files with 2468 additions and 0 deletions

235
desmume/src/gtk-glade/callbacks.c Executable file
View File

@ -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); }

View File

@ -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);

View File

@ -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); }

View File

@ -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);

159
desmume/src/gtk-glade/desmume.c Executable file
View File

@ -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;
}

42
desmume/src/gtk-glade/desmume.h Executable file
View File

@ -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__*/

44
desmume/src/gtk-glade/globals.h Executable file
View File

@ -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

179
desmume/src/gtk-glade/main.c Executable file
View File

@ -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;
}

View File

@ -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;
}