/* PokeMini - Pokémon-Mini Emulator Copyright (C) 2009-2015 JustBurn This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include #include #include #include #include #include #include #include "SDL.h" #include "PokeMini.h" #include "PokeMini_Debug.h" #include "Hardware_Debug.h" #include "CPUWindow.h" #include "PRCMapWindow.h" #include "PokeMini_ColorPal.h" #include #include "GtkXDialogs.h" #include "SGtkXDrawingView.h" static int PRCMapWindow_InConfigs = 0; GtkWindow *PRCMapWindow; static int PRCMapWindow_minimized; static GtkItemFactory *ItemFactory; static GtkAccelGroup *AccelGroup; static GtkBox *VBox1; static GtkMenuBar *MenuBar; static GtkLabel *LabelRunFull; static GtkLabel *LabelInfo; static SGtkXDrawingView PRCMapView; static GtkLabel *MapPosInfo; // Locals static int FullRedraw = 1; static int ShowGrid = 1; static int ShowVisible = 1; static int Negative = 0; static uint32_t VisibleBorderCol[4] = {0xFF0000, 0xFFFF00, 0xFF8080, 0xFF0000}; // PRC Map render (Mono) static void PRCMapRenderMono(SGtkXDrawingView *widg, int zoom, int negative) { uint32_t *scanptr; int x, y, xp, yp, xl, yl; uint32_t tileidxaddr, ltileidxaddr = -1; uint32_t tiledataddr = 0; uint8_t tileidx = 0, data; xl = MinxPRC.PRCMapTW * 8; yl = MinxPRC.PRCMapTH * 8; for (y=0; yheight; y++) { yp = y / zoom; if (yp >= yl) break; scanptr = &widg->imgptr[y * widg->pitch]; for (x=0; xwidth; x++) { xp = x / zoom; if (xp >= xl) break; // Index address tileidxaddr = 0x1360 + (yp >> 3) * MinxPRC.PRCMapTW + (xp >> 3); // Read tile index if (ltileidxaddr != tileidxaddr) { ltileidxaddr = tileidxaddr; tileidx = MinxPRC_OnRead(0, tileidxaddr); tiledataddr = MinxPRC.PRCBGBase + (tileidx << 3); } // Read tile data data = MinxPRC_OnRead(0, tiledataddr + (xp & 7)) & (1 << (yp & 7)); if (PMR_PRC_MODE & 0x01) data = !data; if (negative) data = !data; // Write result scanptr[x] = data ? 0x000000 : 0xFFFFFF; } } } // PRC Map render (Color 8x8) static void PRCMapRenderColor8x8(SGtkXDrawingView *widg, int zoom, int negative) { uint32_t *scanptr; int x, y, xp, yp, xl, yl; uint32_t tileidxaddr, ltileidxaddr = -1; uint32_t tiledataddr = 0; uint8_t tileidx = 0, data; uint8_t *ColorMap = (uint8_t *)PRCStaticColorMap; xl = MinxPRC.PRCMapTW * 8; yl = MinxPRC.PRCMapTH * 8; negative = negative ? 1 : 0; for (y=0; yheight; y++) { yp = y / zoom; if (yp >= yl) break; scanptr = &widg->imgptr[y * widg->pitch]; for (x=0; xwidth; x++) { xp = x / zoom; if (xp >= xl) break; // Index address tileidxaddr = 0x1360 + (yp >> 3) * MinxPRC.PRCMapTW + (xp >> 3); // Read tile index if (ltileidxaddr != tileidxaddr) { ltileidxaddr = tileidxaddr; tileidx = MinxPRC_OnRead(0, tileidxaddr); tiledataddr = MinxPRC.PRCBGBase + (tileidx << 3); ColorMap = (uint8_t *)PRCColorMap + (tiledataddr >> 2) - PRCColorOffset; if ((ColorMap < PRCColorMap) || (ColorMap >= PRCColorTop)) ColorMap = (uint8_t *)PRCStaticColorMap; } // Read tile data data = MinxPRC_OnRead(0, tiledataddr + (xp & 7)) & (1 << (yp & 7)); if (PMR_PRC_MODE & 0x01) data = !data; if (negative) data = !data; data = data ? ColorMap[1] : ColorMap[0]; // Write result scanptr[x] = PokeMini_ColorPalBGR32[data]; } } } // PRC Map render (Color 4x4) static void PRCMapRenderColor4x4(SGtkXDrawingView *widg, int zoom, int negative) { uint32_t *scanptr; int x, y, xp, yp, xl, yl, quad; uint32_t tileidxaddr, ltileidxaddr = -1; uint32_t tiledataddr = 0; uint8_t tileidx = 0, data; uint8_t *ColorMap = (uint8_t *)PRCStaticColorMap; xl = MinxPRC.PRCMapTW * 8; yl = MinxPRC.PRCMapTH * 8; negative = negative ? 1 : 0; for (y=0; yheight; y++) { yp = y / zoom; if (yp >= yl) break; scanptr = &widg->imgptr[y * widg->pitch]; for (x=0; xwidth; x++) { xp = x / zoom; if (xp >= xl) break; // Get quad index quad = (yp & 4) + ((xp & 4) >> 1); // Index address tileidxaddr = 0x1360 + (yp >> 3) * MinxPRC.PRCMapTW + (xp >> 3); // Read tile index if (ltileidxaddr != tileidxaddr) { ltileidxaddr = tileidxaddr; tileidx = MinxPRC_OnRead(0, tileidxaddr); tiledataddr = MinxPRC.PRCBGBase + (tileidx << 3); ColorMap = (uint8_t *)PRCColorMap + tiledataddr - PRCColorOffset; if ((ColorMap < PRCColorMap) || (ColorMap >= PRCColorTop)) ColorMap = (uint8_t *)PRCStaticColorMap; } // Read tile data data = MinxPRC_OnRead(0, tiledataddr + (xp & 7)) & (1 << (yp & 7)); if (PMR_PRC_MODE & 0x01) data = !data; if (negative) data = !data; data = data ? ColorMap[quad+1] : ColorMap[quad]; // Write result scanptr[x] = PokeMini_ColorPalBGR32[data]; } } } static void PRCMapDrawGrid(SGtkXDrawingView *widg, int zoom) { int x, y; for (x=0; xwidth; x+=(zoom*8)) { sgtkx_drawing_view_drawvline(widg, x, 0, widg->height, 0xC0C0C0); sgtkx_drawing_view_drawvline(widg, x+1, 0, widg->height, 0x404040); } for (y=0; yheight; y+=(zoom*8)) { sgtkx_drawing_view_drawhline(widg, y, 0, widg->width, 0xC0C0C0); sgtkx_drawing_view_drawhline(widg, y+1, 0, widg->width, 0x404040); } } static void PRCMapDrawVisible(SGtkXDrawingView *widg, int zoom) { int x, y, w, h; x = MinxPRC.PRCMapPX * zoom; y = MinxPRC.PRCMapPY * zoom; w = 96 * zoom; h = 64 * zoom; if (zoom >= 4) sgtkx_drawing_view_drawsrect(widg, x-3, y-3, w+6, h+6, VisibleBorderCol[3]); if (zoom >= 3) sgtkx_drawing_view_drawsrect(widg, x-2, y-2, w+4, h+4, VisibleBorderCol[2]); if (zoom >= 2) sgtkx_drawing_view_drawsrect(widg, x-1, y-1, w+2, h+2, VisibleBorderCol[1]); else sgtkx_drawing_view_drawsrect(widg, x-1, y-1, w+2, h+2, VisibleBorderCol[0]); if (zoom >= 2) sgtkx_drawing_view_drawsrect(widg, x, y, w, h, VisibleBorderCol[0]); } // ------- // Viewers // ------- static int PRCMapView_imgresize(SGtkXDrawingView *widg, int width, int height, int pitch) { AnyView_DrawBackground(widg, width, height, dclc_zoom_prcmap); return 1; } static int PRCMapView_exposure(SGtkXDrawingView *widg, int width, int height, int pitch) { char txt[PMTMPV]; if (FullRedraw) { AnyView_DrawBackground(widg, width, height, dclc_zoom_prcmap); FullRedraw = 0; } else { AnyView_DrawBackground(widg, MinxPRC.PRCMapTW*8+4, MinxPRC.PRCMapTH*8+4, dclc_zoom_prcmap); } if (PRCColorMap) { if (PokeMini_ColorFormat == 1) { // Color 4x4 Attributes PRCMapRenderColor4x4(widg, dclc_zoom_prcmap, Negative); } else { // Color 8x8 Attributes PRCMapRenderColor8x8(widg, dclc_zoom_prcmap, Negative); } } else { // Mono PRCMapRenderMono(widg, dclc_zoom_prcmap, Negative); } if (emumode != EMUMODE_RUNFULL) { if (ShowGrid) PRCMapDrawGrid(widg, dclc_zoom_prcmap); if (ShowVisible) PRCMapDrawVisible(widg, dclc_zoom_prcmap); } else { AnyView_DrawDisableMask(widg); } // Map position label sprintf(txt, "Map X=($%02X, %i) -:- Map Y=($%02X, %i)", (int)MinxPRC.PRCMapPX, (int)MinxPRC.PRCMapPX, (int)MinxPRC.PRCMapPY, (int)MinxPRC.PRCMapPY); gtk_label_set_text(MapPosInfo, txt); return 1; } static int PRCMapView_motion(SGtkXDrawingView *widg, int x, int y, int _c) { char txt[PMTMPV]; int tzoom, tx, ty; int mapaddr, mapnum; int tileaddr, tilenum; tzoom = 8 * dclc_zoom_prcmap; tx = x / tzoom; ty = y / tzoom; mapnum = ty * MinxPRC.PRCMapTW + tx; mapaddr = 0x1360 + mapnum; // Info label if ((tx < MinxPRC.PRCMapTW) && (ty < MinxPRC.PRCMapTH)) { tilenum = MinxPRC_OnRead(0, mapaddr); tileaddr = MinxPRC.PRCBGBase + (tilenum << 3); sprintf(txt, "Map=($%04X, %i) @%06X -:- Tile=($%02X, %i) @$%06X", mapnum, mapnum, mapaddr, tilenum, tilenum, tileaddr); } else { strcpy(txt, "-:-"); } gtk_label_set_text(LabelInfo, txt); return 0; } // -------------- // Menu callbacks // -------------- static void PRCMapW_ShowVisible(GtkWidget *widget, gpointer data) { if (PRCMapWindow_InConfigs) return; GtkWidget *widg = gtk_item_factory_get_item(ItemFactory, "/View/Show Visible"); ShowVisible = (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widg)) == TRUE); FullRedraw = 1; PRCMapWindow_Refresh(1); } static void PRCMapW_ShowGrid(GtkWidget *widget, gpointer data) { if (PRCMapWindow_InConfigs) return; GtkWidget *widg = gtk_item_factory_get_item(ItemFactory, "/View/Show Grid"); ShowGrid = (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widg)) == TRUE); FullRedraw = 1; PRCMapWindow_Refresh(1); } static void PRCMapW_Negative(GtkWidget *widget, gpointer data) { if (PRCMapWindow_InConfigs) return; GtkWidget *widg = gtk_item_factory_get_item(ItemFactory, "/View/Show Negative"); Negative = (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widg)) == TRUE); PRCMapWindow_Refresh(1); } static void PRCMapW_Zoom(GtkWidget *widget, gpointer data) { if (PRCMapWindow_InConfigs) return; dclc_zoom_prcmap = (int)data; FullRedraw = 1; PRCMapWindow_Refresh(1); } static void PRCMapW_RefreshNow(GtkWidget *widget, gpointer data) { FullRedraw = 1; refresh_debug(1); } static void PRCMapW_Refresh(GtkWidget *widget, gpointer data) { int val, index = (int)data; static int lastrefrindex = -2; if (lastrefrindex == index) return; lastrefrindex = index; if (PRCMapWindow_InConfigs) return; if (index >= 0) { dclc_prcmapwin_refresh = index; } else { set_emumode(EMUMODE_STOP, 1); if (EnterNumberDialog(PRCMapWindow, "Custom refresh rate", "Frames skip per refresh:", &val, dclc_prcmapwin_refresh, 4, 0, 0, 1000)) { dclc_prcmapwin_refresh = val; } set_emumode(EMUMODE_RESTORE, 1); } } static gint PRCMapWindow_delete_event(GtkWidget *widget, GdkEvent *event, gpointer data) { gtk_widget_hide(GTK_WIDGET(PRCMapWindow)); return TRUE; } static gboolean PRCMapWindow_state_event(GtkWidget *widget, GdkEventWindowState *event, gpointer user_data) { if (event->changed_mask & GDK_WINDOW_STATE_ICONIFIED) PRCMapWindow_minimized = event->new_window_state & GDK_WINDOW_STATE_ICONIFIED; return TRUE; } static GtkItemFactoryEntry PRCMapWindow_MenuItems[] = { { "/_View", NULL, NULL, 0, "" }, { "/View/Show Visible", NULL, PRCMapW_ShowVisible, 0, "" }, { "/View/Show Grid", NULL, PRCMapW_ShowGrid, 0, "" }, { "/View/Show Negative", NULL, PRCMapW_Negative, 0, "" }, { "/View/Zoom", NULL, NULL, 0, "" }, { "/View/Zoom/100%", NULL, PRCMapW_Zoom, 1, "" }, { "/View/Zoom/200%", NULL, PRCMapW_Zoom, 2, "/View/Zoom/100%" }, { "/View/Zoom/300%", NULL, PRCMapW_Zoom, 3, "/View/Zoom/100%" }, { "/View/Zoom/400%", NULL, PRCMapW_Zoom, 4, "/View/Zoom/100%" }, { "/View/Zoom/500%", NULL, PRCMapW_Zoom, 5, "/View/Zoom/100%" }, { "/View/Zoom/600%", NULL, PRCMapW_Zoom, 6, "/View/Zoom/100%" }, { "/View/Zoom/700%", NULL, PRCMapW_Zoom, 7, "/View/Zoom/100%" }, { "/View/Zoom/800%", NULL, PRCMapW_Zoom, 8, "/View/Zoom/100%" }, { "/_Debugger", NULL, NULL, 0, "" }, { "/Debugger/Run full speed", "F5", Menu_Debug_RunFull, 0, "" }, { "/Debugger/Run debug frames (Sound)", "F5", Menu_Debug_RunDFrameSnd, 0, "" }, { "/Debugger/Run debug frames", "F5", Menu_Debug_RunDFrame, 0, "" }, { "/Debugger/Run debug steps", "F3", Menu_Debug_RunDStep, 0, "" }, { "/Debugger/Single frame", "F4", Menu_Debug_SingleFrame, 0, "" }, { "/Debugger/Single step", "F3", Menu_Debug_SingleStep, 0, "" }, { "/Debugger/Step skip", "F3", Menu_Debug_StepSkip, 0, "" }, { "/Debugger/Stop", "F2", Menu_Debug_Stop, 0, "" }, { "/_Refresh", NULL, NULL, 0, "" }, { "/Refresh/Now!", NULL, PRCMapW_RefreshNow, 0, "" }, { "/Refresh/sep1", NULL, NULL, 0, "" }, { "/Refresh/100% 72fps", NULL, PRCMapW_Refresh, 0, "" }, { "/Refresh/ 50% 36fps", NULL, PRCMapW_Refresh, 1, "/Refresh/100% 72fps" }, { "/Refresh/ 33% 24fps", NULL, PRCMapW_Refresh, 2, "/Refresh/100% 72fps" }, { "/Refresh/ 25% 18fps", NULL, PRCMapW_Refresh, 3, "/Refresh/100% 72fps" }, { "/Refresh/ 17% 12fps", NULL, PRCMapW_Refresh, 5, "/Refresh/100% 72fps" }, { "/Refresh/ 12% 9fps", NULL, PRCMapW_Refresh, 7, "/Refresh/100% 72fps" }, { "/Refresh/ 8% 6fps", NULL, PRCMapW_Refresh, 11, "/Refresh/100% 72fps" }, { "/Refresh/ 3% 2fps", NULL, PRCMapW_Refresh, 35, "/Refresh/100% 72fps" }, { "/Refresh/ 1% 1fps", NULL, PRCMapW_Refresh, 71, "/Refresh/100% 72fps" }, { "/Refresh/Custom...", NULL, PRCMapW_Refresh, -1, "/Refresh/100% 72fps" }, }; static gint PRCMapWindow_MenuItemsNum = sizeof(PRCMapWindow_MenuItems) / sizeof(*PRCMapWindow_MenuItems); // -------------- // PRC Map Window // -------------- int PRCMapWindow_Create(void) { // Window PRCMapWindow = GTK_WINDOW(gtk_window_new(GTK_WINDOW_TOPLEVEL)); gtk_window_set_title(GTK_WINDOW(PRCMapWindow), "PRC Map View"); gtk_widget_set_size_request(GTK_WIDGET(PRCMapWindow), 200, 100); gtk_window_set_default_size(PRCMapWindow, 420, 200); g_signal_connect(PRCMapWindow, "delete_event", G_CALLBACK(PRCMapWindow_delete_event), NULL); g_signal_connect(PRCMapWindow, "window-state-event", G_CALLBACK(PRCMapWindow_state_event), NULL); VBox1 = GTK_BOX(gtk_vbox_new(FALSE, 0)); gtk_container_add(GTK_CONTAINER(PRCMapWindow), GTK_WIDGET(VBox1)); gtk_widget_show(GTK_WIDGET(VBox1)); // Menu bar AccelGroup = gtk_accel_group_new(); ItemFactory = gtk_item_factory_new(GTK_TYPE_MENU_BAR, "
", AccelGroup); gtk_item_factory_create_items(ItemFactory, PRCMapWindow_MenuItemsNum, PRCMapWindow_MenuItems, NULL); gtk_window_add_accel_group(PRCMapWindow, AccelGroup); MenuBar = GTK_MENU_BAR(gtk_item_factory_get_widget(ItemFactory, "
")); gtk_box_pack_start(VBox1, GTK_WIDGET(MenuBar), FALSE, TRUE, 0); gtk_widget_show(GTK_WIDGET(MenuBar)); // Label that warn when running full speed LabelRunFull = GTK_LABEL(gtk_label_new("To view content you must stop emulation or run in debug frames/steps.")); gtk_box_pack_start(VBox1, GTK_WIDGET(LabelRunFull), FALSE, TRUE, 0); // Info label LabelInfo = GTK_LABEL(gtk_label_new("-:-")); gtk_box_pack_start(VBox1, GTK_WIDGET(LabelInfo), FALSE, TRUE, 0); gtk_widget_show(GTK_WIDGET(LabelInfo)); // PRC Map View PRCMapView.on_imgresize = SGtkXDVCB(PRCMapView_imgresize); PRCMapView.on_exposure = SGtkXDVCB(PRCMapView_exposure); PRCMapView.on_motion = SGtkXDVCB(PRCMapView_motion); PRCMapView.on_enterleave = SGtkXDVCB(AnyView_enterleave); sgtkx_drawing_view_new(&PRCMapView, 0); gtk_widget_set_size_request(GTK_WIDGET(PRCMapView.box), 64, 64); gtk_box_pack_start(VBox1, GTK_WIDGET(PRCMapView.box), TRUE, TRUE, 0); gtk_widget_show(GTK_WIDGET(PRCMapView.box)); // Map position label MapPosInfo = GTK_LABEL(gtk_label_new("Map X=($00, 0) -:- Map Y=($00, 0)")); gtk_box_pack_start(VBox1, GTK_WIDGET(MapPosInfo), FALSE, TRUE, 0); gtk_widget_show(GTK_WIDGET(MapPosInfo)); return 1; } void PRCMapWindow_Destroy(void) { int x, y, width, height; if (gtk_widget_get_realized(GTK_WIDGET(PRCMapWindow))) { gtk_widget_show(GTK_WIDGET(PRCMapWindow)); gtk_window_deiconify(PRCMapWindow); gtk_window_get_position(PRCMapWindow, &x, &y); gtk_window_get_size(PRCMapWindow, &width, &height); dclc_prcmapwin_winx = x; dclc_prcmapwin_winy = y; dclc_prcmapwin_winw = width; dclc_prcmapwin_winh = height; } } void PRCMapWindow_Activate(void) { gtk_widget_realize(GTK_WIDGET(PRCMapWindow)); if ((dclc_prcmapwin_winx > -15) && (dclc_prcmapwin_winy > -16)) { gtk_window_move(PRCMapWindow, dclc_prcmapwin_winx, dclc_prcmapwin_winy); } if ((dclc_prcmapwin_winw > 0) && (dclc_prcmapwin_winh > 0)) { gtk_window_resize(PRCMapWindow, dclc_prcmapwin_winw, dclc_prcmapwin_winh); } gtk_widget_show(GTK_WIDGET(PRCMapWindow)); gtk_window_present(PRCMapWindow); } void PRCMapWindow_UpdateConfigs(void) { GtkWidget *widg; PRCMapWindow_InConfigs = 1; widg = gtk_item_factory_get_item(ItemFactory, "/View/Show Visible"); if (ShowVisible) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); widg = gtk_item_factory_get_item(ItemFactory, "/View/Show Grid"); if (ShowGrid) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); widg = gtk_item_factory_get_item(ItemFactory, "/View/Show Negative"); if (Negative) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); widg = gtk_item_factory_get_item(ItemFactory, "/View/Zoom/100%"); if (dclc_zoom_prcmap == 1) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); widg = gtk_item_factory_get_item(ItemFactory, "/View/Zoom/200%"); if (dclc_zoom_prcmap == 2) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); widg = gtk_item_factory_get_item(ItemFactory, "/View/Zoom/300%"); if (dclc_zoom_prcmap == 3) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); widg = gtk_item_factory_get_item(ItemFactory, "/View/Zoom/400%"); if (dclc_zoom_prcmap == 4) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); widg = gtk_item_factory_get_item(ItemFactory, "/View/Zoom/500%"); if (dclc_zoom_prcmap == 5) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); widg = gtk_item_factory_get_item(ItemFactory, "/View/Zoom/600%"); if (dclc_zoom_prcmap == 6) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); widg = gtk_item_factory_get_item(ItemFactory, "/View/Zoom/700%"); if (dclc_zoom_prcmap == 7) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); widg = gtk_item_factory_get_item(ItemFactory, "/View/Zoom/800%"); if (dclc_zoom_prcmap == 8) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widg), 1); switch (dclc_prcmapwin_refresh) { case 0: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/100% 72fps")), 1); break; case 1: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/ 50% 36fps")), 1); break; case 2: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/ 33% 24fps")), 1); break; case 3: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/ 25% 18fps")), 1); break; case 5: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/ 17% 12fps")), 1); break; case 7: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/ 12% 9fps")), 1); break; case 11: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/ 8% 6fps")), 1); break; case 19: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/ 6% 3fps")), 1); break; default: gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item(ItemFactory, "/Refresh/Custom...")), 1); break; } PRCMapWindow_InConfigs = 0; } void PRCMapWindow_Sensitive(int enabled) { if (enabled) { gtk_widget_hide(GTK_WIDGET(LabelRunFull)); gtk_widget_show(GTK_WIDGET(PRCMapView.box)); gtk_widget_show(GTK_WIDGET(LabelInfo)); gtk_widget_show(GTK_WIDGET(MapPosInfo)); } else { gtk_widget_show(GTK_WIDGET(LabelRunFull)); gtk_widget_hide(GTK_WIDGET(PRCMapView.box)); gtk_widget_hide(GTK_WIDGET(LabelInfo)); gtk_widget_hide(GTK_WIDGET(MapPosInfo)); } } void PRCMapWindow_Refresh(int now) { static int refreshcnt = 0; if ((refreshcnt <= 0) || (now)) { refreshcnt = dclc_prcmapwin_refresh; if (!now) { if (!gtk_widget_get_visible(GTK_WIDGET(PRCMapWindow)) || PRCMapWindow_minimized) return; } sgtkx_drawing_view_refresh(&PRCMapView); } else refreshcnt--; }