nkeynes@435: /** nkeynes@435: * $Id: main_win.c,v 1.1 2007-10-10 11:02:04 nkeynes Exp $ nkeynes@435: * nkeynes@435: * Define the main (emu) GTK window, along with its menubars, nkeynes@435: * toolbars, etc. nkeynes@435: * nkeynes@435: * Copyright (c) 2005 Nathan Keynes. nkeynes@435: * nkeynes@435: * This program is free software; you can redistribute it and/or modify nkeynes@435: * it under the terms of the GNU General Public License as published by nkeynes@435: * the Free Software Foundation; either version 2 of the License, or nkeynes@435: * (at your option) any later version. nkeynes@435: * nkeynes@435: * This program is distributed in the hope that it will be useful, nkeynes@435: * but WITHOUT ANY WARRANTY; without even the implied warranty of nkeynes@435: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the nkeynes@435: * GNU General Public License for more details. nkeynes@435: */ nkeynes@435: nkeynes@435: #include nkeynes@435: #include nkeynes@435: #include nkeynes@435: #include nkeynes@435: #include nkeynes@435: #include nkeynes@435: #include nkeynes@435: nkeynes@435: #include nkeynes@435: nkeynes@435: #include "dream.h" nkeynes@435: #include "gui/gtkui.h" nkeynes@435: nkeynes@435: #define SET_ACTION_ENABLED(win,name,b) gtk_action_set_sensitive( gtk_action_group_get_action( win->actions, name), b) nkeynes@435: #define ENABLE_ACTION(win,name) SET_ACTION_ENABLED(win,name,TRUE) nkeynes@435: #define DISABLE_ACTION(win,name) SET_ACTION_ENABLED(win,name,FALSE) nkeynes@435: nkeynes@435: static const GtkActionEntry ui_actions[] = { nkeynes@435: { "FileMenu", NULL, "_File" }, nkeynes@435: { "SettingsMenu", NULL, "_Settings" }, nkeynes@435: { "HelpMenu", NULL, "_Help" }, nkeynes@435: { "Mount", GTK_STOCK_CDROM, "_Mount...", "O", "Mount a cdrom disc", G_CALLBACK(mount_action_callback) }, nkeynes@435: { "Reset", GTK_STOCK_REFRESH, "_Reset", "R", "Reset dreamcast", G_CALLBACK(reset_action_callback) }, nkeynes@435: { "Pause", GTK_STOCK_MEDIA_PAUSE, "_Pause", NULL, "Pause dreamcast", G_CALLBACK(pause_action_callback) }, nkeynes@435: { "Run", GTK_STOCK_MEDIA_PLAY, "Resume", NULL, "Resume", G_CALLBACK(resume_action_callback) }, nkeynes@435: { "LoadState", GTK_STOCK_REVERT_TO_SAVED, "_Load state...", "F4", "Load an lxdream save state", G_CALLBACK(load_state_action_callback) }, nkeynes@435: { "SaveState", GTK_STOCK_SAVE_AS, "_Save state...", "F3", "Create an lxdream save state", G_CALLBACK(save_state_action_callback) }, nkeynes@435: { "Exit", GTK_STOCK_QUIT, "E_xit", NULL, "Exit lxdream", G_CALLBACK(exit_action_callback) }, nkeynes@435: { "AudioSettings", NULL, "_Audio...", NULL, "Configure audio output", G_CALLBACK(audio_settings_callback) }, nkeynes@435: { "ControllerSettings", NULL, "_Controllers...", NULL, "Configure controllers", G_CALLBACK(controller_settings_callback) }, nkeynes@435: { "NetworkSettings", NULL, "_Network...", NULL, "Configure network settings", G_CALLBACK(network_settings_callback) }, nkeynes@435: { "VideoSettings", NULL, "_Video...", NULL, "Configure video output", G_CALLBACK(video_settings_callback) }, nkeynes@435: { "About", GTK_STOCK_ABOUT, "_About...", NULL, "About lxdream", G_CALLBACK(about_action_callback) } nkeynes@435: }; nkeynes@435: static const GtkToggleActionEntry ui_toggle_actions[] = { nkeynes@435: { "FullScreen", NULL, "_Full Screen", "F9", "Toggle full screen video", G_CALLBACK(fullscreen_toggle_callback), 0 }, nkeynes@435: }; nkeynes@435: nkeynes@435: nkeynes@435: static const char *ui_description = nkeynes@435: "" nkeynes@435: " " nkeynes@435: " " nkeynes@435: " " nkeynes@435: " " nkeynes@435: " " nkeynes@435: " " nkeynes@435: " " nkeynes@435: " " nkeynes@435: " " nkeynes@435: " " nkeynes@435: " " nkeynes@435: " " nkeynes@435: " " nkeynes@435: " " nkeynes@435: " " nkeynes@435: " " nkeynes@435: " " nkeynes@435: " " nkeynes@435: " " nkeynes@435: " " nkeynes@435: " " nkeynes@435: " " nkeynes@435: " " nkeynes@435: " " nkeynes@435: " " nkeynes@435: " " nkeynes@435: " " nkeynes@435: " " nkeynes@435: " " nkeynes@435: " " nkeynes@435: " " nkeynes@435: " " nkeynes@435: " " nkeynes@435: " " nkeynes@435: ""; nkeynes@435: nkeynes@435: nkeynes@435: struct main_window_info { nkeynes@435: GtkWidget *window; nkeynes@435: GtkWidget *menubar; nkeynes@435: GtkWidget *toolbar; nkeynes@435: GtkWidget *video; nkeynes@435: GtkWidget *statusbar; nkeynes@435: GtkActionGroup *actions; nkeynes@435: }; nkeynes@435: nkeynes@435: main_window_t main_window_new( const gchar *title ) nkeynes@435: { nkeynes@435: GtkWidget *vbox; nkeynes@435: GtkUIManager *ui_manager; nkeynes@435: GtkAccelGroup *accel_group; nkeynes@435: GError *error = NULL; nkeynes@435: main_window_t win = g_malloc0( sizeof(struct main_window_info) ); nkeynes@435: nkeynes@435: win->window = gtk_window_new(GTK_WINDOW_TOPLEVEL); nkeynes@435: gtk_window_set_title( GTK_WINDOW(win->window), title ); nkeynes@435: nkeynes@435: win->actions = gtk_action_group_new("MenuActions"); nkeynes@435: gtk_action_group_add_actions( win->actions, ui_actions, G_N_ELEMENTS(ui_actions), win->window ); nkeynes@435: gtk_action_group_add_toggle_actions( win->actions, ui_toggle_actions, G_N_ELEMENTS(ui_toggle_actions), win->window ); nkeynes@435: DISABLE_ACTION(win, "NetworkSettings"); nkeynes@435: nkeynes@435: ui_manager = gtk_ui_manager_new(); nkeynes@435: gtk_ui_manager_set_add_tearoffs(ui_manager, TRUE); nkeynes@435: gtk_ui_manager_insert_action_group( ui_manager, win->actions, 0 ); nkeynes@435: nkeynes@435: if (!gtk_ui_manager_add_ui_from_string (ui_manager, ui_description, -1, &error)) { nkeynes@435: g_message ("building menus failed: %s", error->message); nkeynes@435: g_error_free (error); nkeynes@435: exit(1); nkeynes@435: } nkeynes@435: nkeynes@435: accel_group = gtk_ui_manager_get_accel_group (ui_manager); nkeynes@435: gtk_window_add_accel_group (GTK_WINDOW (win->window), accel_group); nkeynes@435: nkeynes@435: win->menubar = gtk_ui_manager_get_widget(ui_manager, "/MainMenu"); nkeynes@435: win->toolbar = gtk_ui_manager_get_widget(ui_manager, "/MainToolbar"); nkeynes@435: nkeynes@435: gtk_toolbar_set_style( GTK_TOOLBAR(win->toolbar), GTK_TOOLBAR_ICONS ); nkeynes@435: nkeynes@435: win->video = gtk_drawing_area_new(); nkeynes@435: GTK_WIDGET_SET_FLAGS(win->video, GTK_CAN_FOCUS|GTK_CAN_DEFAULT); nkeynes@435: gtk_widget_set_size_request( win->video, 640, 480 ); nkeynes@435: win->statusbar = gtk_statusbar_new(); nkeynes@435: nkeynes@435: vbox = gtk_vbox_new(FALSE, 0); nkeynes@435: gtk_container_add( GTK_CONTAINER(win->window), vbox ); nkeynes@435: gtk_box_pack_start( GTK_BOX(vbox), win->menubar, FALSE, FALSE, 0 ); nkeynes@435: gtk_box_pack_start( GTK_BOX(vbox), win->toolbar, FALSE, FALSE, 0 ); nkeynes@435: gtk_box_pack_start( GTK_BOX(vbox), win->video, TRUE, TRUE, 1 ); nkeynes@435: gtk_box_pack_start( GTK_BOX(vbox), win->statusbar, FALSE, FALSE, 0 ); nkeynes@435: gtk_widget_show_all( win->window ); nkeynes@435: gtk_widget_grab_focus( win->video ); nkeynes@435: nkeynes@435: return win; nkeynes@435: } nkeynes@435: nkeynes@435: void main_window_set_running( main_window_t win, gboolean running ) nkeynes@435: { nkeynes@435: SET_ACTION_ENABLED( win, "Pause", running ); nkeynes@435: SET_ACTION_ENABLED( win, "Run", !running ); nkeynes@435: } nkeynes@435: nkeynes@435: void main_window_set_framerate( main_window_t win, float rate ) nkeynes@435: { nkeynes@435: nkeynes@435: nkeynes@435: } nkeynes@435: nkeynes@435: GtkWidget *main_window_get_renderarea( main_window_t win ) nkeynes@435: { nkeynes@435: return win->video; nkeynes@435: }