Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Index: ui/gtk/memory.c
- ===================================================================
- --- ui/gtk/memory.c (revision 4664)
- +++ ui/gtk/memory.c (working copy)
- @@ -32,10 +32,13 @@
- #include <gtk/gtk.h>
- #include "compat.h"
- +#include "fuse.h"
- #include "gtkinternals.h"
- #include "memory.h"
- #include "menu.h"
- +static libspectrum_word memaddr = 0x0000;
- +
- static void
- update_display( GtkCList *clist, libspectrum_word base )
- {
- @@ -45,6 +48,7 @@
- gchar *text[] = { &buffer[0], &buffer[ 8 ], &buffer[ 8 + 64 ] };
- char buffer2[ 8 ];
- + memaddr = base;
- gtk_clist_freeze( clist );
- gtk_clist_clear( clist );
- @@ -91,6 +95,7 @@
- int error;
- gtkui_font font;
- + fuse_emulation_pause();
- gchar *titles[] = { "Address", "Hex", "Data" };
- error = gtkui_get_monospaced_font( &font ); if( error ) return;
- @@ -107,10 +112,10 @@
- for( i = 0; i < 3; i++ )
- gtk_clist_set_column_auto_resize( GTK_CLIST( clist ), i, TRUE );
- gtkui_set_font( clist, font );
- - update_display( GTK_CLIST( clist ), 0x0000 );
- + update_display( GTK_CLIST( clist ), memaddr );
- gtk_box_pack_start_defaults( GTK_BOX( box ), clist );
- - adjustment = gtk_adjustment_new( 0, 0x0000, 0xffff, 0x10, 0xa0, 0x13f );
- + adjustment = gtk_adjustment_new( memaddr, 0x0000, 0xffff, 0x10, 0xa0, 0x13f );
- gtk_signal_connect( adjustment, "value-changed", GTK_SIGNAL_FUNC( scroller ),
- clist );
- @@ -123,6 +128,7 @@
- gtk_main();
- gtkui_free_font( font );
- + fuse_emulation_unpause();
- return;
- }
- Index: ui/win32/memorybrowser.c
- ===================================================================
- --- ui/win32/memorybrowser.c (revision 4664)
- +++ ui/win32/memorybrowser.c (working copy)
- @@ -27,7 +27,10 @@
- #include <libspectrum.h>
- #include <tchar.h>
- +#include <windows.h>
- +#include "compat.h"
- +#include "fuse.h"
- #include "memory.h"
- #include "win32internals.h"
- @@ -36,35 +39,49 @@
- static INT_PTR CALLBACK
- memorybrowser_proc( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam );
- +static LRESULT CALLBACK
- +memory_listview_proc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam );
- +
- static void
- memorybrowser_init( HWND hwndDlg );
- +void
- +menu_machine_memorybrowser( int action );
- +
- /* helper constants for memory listview's scrollbar */
- static const int memorysb_min = 0x0000;
- -static const int memorysb_max = 0xffff;
- +static const int memorysb_max = 0x10000;
- static const int memorysb_step = 0x10;
- -static const int memorysb_page_inc = 0xa0;
- -static const int memorysb_page_size = 0x13f;
- +/* Visual styles could change visible rows */
- +static int memorysb_page_inc = 0xa0;
- +static int memorysb_page_size = 0x140;
- +static int memorysb_page_rows = 20;
- +
- +/* Address of first visible row */
- +static libspectrum_word memaddr = 0x0000;
- +
- static void
- update_display( HWND hwndDlg, libspectrum_word base )
- {
- - size_t i, j;
- + int i, j;
- TCHAR buffer[ 8 + 64 + 20 ];
- TCHAR *text[] = { &buffer[0], &buffer[ 8 ], &buffer[ 8 + 64 ] };
- TCHAR buffer2[ 8 ];
- + memaddr = base;
- +
- SendDlgItemMessage( hwndDlg, IDC_MEM_LV, LVM_DELETEALLITEMS, 0, 0 );
- LV_ITEM lvi;
- lvi.mask = LVIF_TEXT;
- - for( i = 0; i < 20; i++ ) {
- + for( i = 0; i < memorysb_page_rows; i++ ) {
- _sntprintf( text[0], 8, TEXT( "%04X" ), base );
- text[1][0] = '\0';
- - for( j = 0; j < 0x10; j++, base++ ) {
- + for( j = 0; j < memorysb_step; j++, base++ ) {
- libspectrum_byte b = readbyte_internal( base );
- @@ -99,22 +116,26 @@
- libspectrum_word base;
- SCROLLINFO si;
- + memset( &si, 0, sizeof( si ) );
- si.cbSize = sizeof(si);
- si.fMask = SIF_POS;
- GetScrollInfo( GetDlgItem( hwndDlg, IDC_MEM_SB ), SB_CTL, &si );
- int value = si.nPos;
- + int selected = 0;
- /* in Windows we have to read the command and scroll the scrollbar manually */
- switch( LOWORD( scroll_command ) ) {
- case SB_BOTTOM:
- value = memorysb_max;
- + selected = memorysb_page_rows - 1;
- break;
- case SB_TOP:
- value = memorysb_min;
- break;
- case SB_LINEDOWN:
- value += memorysb_step;
- + selected = 1;
- break;
- case SB_LINEUP:
- value -= memorysb_step;
- @@ -124,6 +145,7 @@
- break;
- case SB_PAGEDOWN:
- value += memorysb_page_inc;
- + selected = memorysb_page_rows - 1;
- break;
- case SB_THUMBPOSITION:
- case SB_THUMBTRACK:
- @@ -132,34 +154,47 @@
- default:
- return 1;
- }
- - if( value > memorysb_max ) value = memorysb_max;
- +
- + if( value > memorysb_max - memorysb_page_size )
- + value = memorysb_max - memorysb_page_size;
- if( value < memorysb_min ) value = memorysb_min;
- /* Drop the low bits before displaying anything */
- base = value; base &= 0xfff0;
- - /* set the new scrollbar position */
- - memset( &si, 0, sizeof(si) );
- - si.cbSize = sizeof(si);
- - si.fMask = SIF_POS;
- - si.nPos = base;
- - SetScrollInfo( GetDlgItem( hwndDlg, IDC_MEM_SB ), SB_CTL, &si, TRUE );
- -
- - update_display( hwndDlg, base );
- -
- + if( base != memaddr ) {
- + /* set the new scrollbar position */
- + memset( &si, 0, sizeof(si) );
- + si.cbSize = sizeof(si);
- + si.fMask = SIF_POS;
- + si.nPos = base;
- + SetScrollInfo( GetDlgItem( hwndDlg, IDC_MEM_SB ), SB_CTL, &si, TRUE );
- +
- + update_display( hwndDlg, base );
- + }
- +
- + /* Select row according to last scroll command */
- + ListView_SetItemState( GetDlgItem( hwndDlg, IDC_MEM_LV ), selected,
- + LVIS_SELECTED, LVIS_SELECTED );
- +
- return 0;
- }
- void
- -menu_machine_memorybrowser()
- +menu_machine_memorybrowser( int action GCC_UNUSED )
- {
- + fuse_emulation_pause();
- +
- DialogBox( fuse_hInstance, MAKEINTRESOURCE( IDD_MEM ),
- fuse_hWnd, (DLGPROC) memorybrowser_proc );
- +
- + fuse_emulation_unpause();
- return;
- }
- static INT_PTR CALLBACK
- -memorybrowser_proc( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam )
- +memorybrowser_proc( HWND hwndDlg, UINT uMsg, WPARAM wParam,
- + LPARAM lParam GCC_UNUSED )
- {
- switch( uMsg )
- {
- @@ -168,33 +203,113 @@
- return TRUE;
- case WM_COMMAND:
- - if( LOWORD( wParam ) == IDCLOSE ) {
- + if( LOWORD( wParam ) == IDCLOSE ||
- + LOWORD( wParam ) == IDCANCEL ) {
- EndDialog( hwndDlg, 0 );
- - return 0;
- + return TRUE;
- }
- break;
- case WM_CLOSE: {
- EndDialog( hwndDlg, 0 );
- - return 0;
- + return TRUE;
- }
- case WM_VSCROLL:
- - if( ( HWND ) lParam != NULL ) {
- - if( ! scroller( hwndDlg, wParam ) )
- - return 0;
- + /* Accept vertical scroll from listview too */
- + scroller( hwndDlg, wParam );
- + return TRUE;
- +
- + case WM_MOUSEWHEEL:
- + {
- + /* get current position */
- + SCROLLINFO si;
- + memset( &si, 0, sizeof(si) );
- + si.cbSize = sizeof(si);
- + si.fMask = SIF_POS;
- + GetScrollInfo( GetDlgItem( hwndDlg, IDC_MEM_SB ), SB_CTL, &si );
- +
- + /* convert delta displacement to memory displacement */
- + short delta = (short) HIWORD( wParam ) / WHEEL_DELTA;
- + int value = si.nPos - delta * memorysb_step;
- + if( value > memorysb_max - memorysb_page_size )
- + value = memorysb_max - memorysb_page_size;
- + if( value < memorysb_min ) value = memorysb_min;
- +
- + /* scroll to new position */
- + scroller( hwndDlg, MAKEWPARAM( SB_THUMBPOSITION, value ) );
- + return TRUE;
- + }
- + }
- +
- + return FALSE;
- +}
- +
- +static LRESULT CALLBACK
- +memory_listview_proc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
- +{
- + switch( msg ) {
- +
- + case WM_DESTROY:
- + {
- + WNDPROC orig_proc = (WNDPROC) GetProp( hWnd, "original_proc" );
- + SetWindowLongPtr( hWnd, GWL_WNDPROC, (LONG) orig_proc );
- + RemoveProp( hWnd, "original_proc" );
- + break;
- + }
- +
- + case WM_KEYDOWN:
- + {
- + WORD scroll_notify = 0xffff;
- +
- + switch( wParam )
- + {
- + case VK_UP:
- + scroll_notify = SB_LINEUP;
- + break;
- +
- + case VK_PRIOR:
- + scroll_notify = SB_PAGEUP;
- + break;
- +
- + case VK_NEXT:
- + scroll_notify = SB_PAGEDOWN;
- + break;
- +
- + case VK_DOWN:
- + scroll_notify = SB_LINEDOWN;
- + break;
- +
- + case VK_HOME:
- + scroll_notify = SB_TOP;
- + break;
- +
- + case VK_END:
- + scroll_notify = SB_BOTTOM;
- + break;
- }
- +
- + /* Inform parent window about key scrolling */
- + if( scroll_notify != 0xffff ) {
- + SendMessage( GetParent( hWnd ), WM_VSCROLL,
- + MAKEWPARAM( scroll_notify, 0 ), (LPARAM) NULL );
- + return 0;
- + }
- +
- break;
- -
- + }
- +
- case WM_MOUSEWHEEL:
- -/* FIXME: when one of the lines in the listview is selected,
- - mouse wheel doesn't work */
- - scroller( hwndDlg, MAKEWPARAM(
- - ( ( short ) HIWORD( wParam ) < 0 ) ? SB_LINEDOWN : SB_LINEUP,
- - 0 ) );
- + {
- + /* Inform parent window about mouse scrolling */
- + SendMessage( GetParent( hWnd ), WM_MOUSEWHEEL, wParam, lParam );
- return 0;
- + }
- +
- }
- - return FALSE;
- +
- + WNDPROC orig_proc = (WNDPROC) GetProp( hWnd, "original_proc" );
- + return CallWindowProc( orig_proc, hWnd, msg, wParam, lParam );
- }
- static void
- @@ -204,16 +319,24 @@
- int error;
- HFONT font;
- - TCHAR *titles[] = { "Address", "Hex", "Data" };
- + const TCHAR *titles[] = { "Address", "Hex", "Data" };
- int column_widths[] = { 62, 348, 124 };
- error = win32ui_get_monospaced_font( &font ); if( error ) return;
- + /* subclass listview to catch keydown and mousewheel messages */
- + HWND hwnd_list = GetDlgItem( hwndDlg, IDC_MEM_LV );
- + WNDPROC orig_proc = (WNDPROC) GetWindowLongPtr( hwnd_list, GWL_WNDPROC );
- + SetProp( hwnd_list, "original_proc", (HANDLE) orig_proc );
- + SetWindowLongPtr( hwnd_list, GWL_WNDPROC,
- + (LONG) (WNDPROC) memory_listview_proc );
- +
- /* set extended listview style to select full row, when an item is selected */
- DWORD lv_ext_style;
- lv_ext_style = SendDlgItemMessage( hwndDlg, IDC_MEM_LV,
- LVM_GETEXTENDEDLISTVIEWSTYLE, 0, 0 );
- lv_ext_style |= LVS_EX_FULLROWSELECT;
- + lv_ext_style |= LVS_EX_DOUBLEBUFFER;
- SendDlgItemMessage( hwndDlg, IDC_MEM_LV,
- LVM_SETEXTENDEDLISTVIEWSTYLE, 0, lv_ext_style );
- @@ -230,22 +353,31 @@
- SendDlgItemMessage( hwndDlg, IDC_MEM_LV, LVM_INSERTCOLUMN, i,
- ( LPARAM ) &lvc );
- }
- +
- + /* set font of the listview to monospaced one */
- + SendDlgItemMessage( hwndDlg, IDC_MEM_LV , WM_SETFONT,
- + (WPARAM) font, FALSE );
- + /* Recalculate visible rows, Visual Styles could change rows height */
- + memorysb_page_rows = SendDlgItemMessage( hwndDlg, IDC_MEM_LV,
- + LVM_GETCOUNTPERPAGE, 0, 0 );
- + memorysb_page_size = memorysb_page_rows * memorysb_step;
- + memorysb_page_inc = memorysb_page_size / 2;
- +
- /* set the scrollbar parameters */
- SCROLLINFO si;
- si.cbSize = sizeof(si);
- si.fMask = SIF_POS | SIF_RANGE | SIF_PAGE;
- - si.nPos = 0;
- + si.nPos = memaddr;
- si.nMin = memorysb_min;
- si.nMax = memorysb_max;
- si.nPage = memorysb_page_size;
- SetScrollInfo( GetDlgItem( hwndDlg, IDC_MEM_SB ), SB_CTL, &si, TRUE );
- -/* FIXME: if the scrollbar is position on the bottom, clicking on the down arrow
- - reveals address 0x0000 */
- -
- - /* set font of the listview to monospaced one */
- - SendDlgItemMessage( hwndDlg, IDC_MEM_LV , WM_SETFONT,
- - (WPARAM) font, FALSE );
- - update_display( hwndDlg, 0x0000 );
- + update_display( hwndDlg, memaddr );
- +
- + /* Recalculate columns width, high DPI resolutions have larger sizes */
- + ListView_SetColumnWidth( hwnd_list, 0, LVSCW_AUTOSIZE_USEHEADER );
- + ListView_SetColumnWidth( hwnd_list, 1, LVSCW_AUTOSIZE );
- + ListView_SetColumnWidth( hwnd_list, 2, LVSCW_AUTOSIZE_USEHEADER );
- }
- Index: ui/win32/win32internals.h
- ===================================================================
- --- ui/win32/win32internals.h (revision 4664)
- +++ ui/win32/win32internals.h (working copy)
- @@ -39,6 +39,11 @@
- #define ID_STATUSBAR 900
- +/* Reduce listview flickering. Defined from WINVER >= 6.00 */
- +#ifndef LVS_EX_DOUBLEBUFFER
- +#define LVS_EX_DOUBLEBUFFER 0x00010000
- +#endif
- +
- /* window handler */
- HWND fuse_hWnd;
- Index: ui/win32/memorybrowser.rc
- ===================================================================
- --- ui/win32/memorybrowser.rc (revision 4664)
- +++ ui/win32/memorybrowser.rc (working copy)
- @@ -27,16 +27,16 @@
- #include "memorybrowser.h"
- -IDD_MEM DIALOGEX DISCARDABLE 0,0,371,224
- +IDD_MEM DIALOGEX DISCARDABLE 0,0,371,264
- CAPTION "Fuse - Memory Browser"
- FONT 8,"MS Sans Serif"
- STYLE WS_POPUP | WS_CAPTION | WS_VISIBLE | WS_SYSMENU
- EXSTYLE WS_EX_APPWINDOW
- BEGIN
- CONTROL "", IDC_MEM_LV, "SysListView32", \
- - WS_CHILD | WS_VISIBLE | LVS_REPORT | \
- + WS_CHILD | WS_TABSTOP | WS_VISIBLE | LVS_REPORT | \
- LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_NOSCROLL, \
- - 0,0,360,200, WS_EX_CLIENTEDGE
- - SCROLLBAR IDC_MEM_SB, 360,0,11,195, WS_CHILD | SBS_VERT
- - PUSHBUTTON "&Close", IDCLOSE, 315,205,51,14
- + 0,0,360,240, WS_EX_CLIENTEDGE
- + SCROLLBAR IDC_MEM_SB, 360,0,11,240, WS_CHILD | SBS_VERT
- + PUSHBUTTON "&Close", IDCLOSE, 315,245,51,14
- END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement