Menu

#2204 Joystick mappings,: d-pad settings are assigned to the axis

v3.x
closed-fixed
gpz
None
GTK3
Controller Mapping
2026-03-06
2026-02-28
radius75
No

Tested on two different controllers: Win7 & Win10

Steps:
Reset button (clear mapping settings)
Reassign controller directions for the Hat: up, down, left, and right

They are assigned to the axis instead of the Hat

1 Attachments

Discussion

  • gpz

    gpz - 2026-02-28

    funky, guess the controller names have to be routed through some UTF conversion too :)

    Please start with -debug, and then post the resulting log file

     
  • radius75

    radius75 - 2026-02-28
    main:initcmdline_check_args(argc:1)
    main:uidata_init(argc:1)
    archdep_register_cbmfont(): Registering CBM fonts using Pango 1.56.4
    succesfully registered 1 font(s) from D:\Gry\_Commodore64\GTK3VICE\bin\..\common\C64_Pro_Mono-STYLE.ttf.
    succesfully registered 1 font(s) from D:\Gry\_Commodore64\GTK3VICE\bin\..\common\PetMe1282Y.ttf.
    succesfully registered 1 font(s) from D:\Gry\_Commodore64\GTK3VICE\bin\..\common\PetMe128.ttf.
    succesfully registered 1 font(s) from D:\Gry\_Commodore64\GTK3VICE\bin\..\common\PetMe2X.ttf.
    succesfully registered 1 font(s) from D:\Gry\_Commodore64\GTK3VICE\bin\..\common\PetMe2Y.ttf.
    succesfully registered 1 font(s) from D:\Gry\_Commodore64\GTK3VICE\bin\..\common\PetMe642Y.ttf.
    succesfully registered 1 font(s) from D:\Gry\_Commodore64\GTK3VICE\bin\..\common\PetMe64.ttf.
    succesfully registered 1 font(s) from D:\Gry\_Commodore64\GTK3VICE\bin\..\common\PetMe.ttf.
    registered 8 font(s) total.
    
    *** VICE Version 3.10, rev 46000 ***
    
    Welcome to x64sc, the free portable C64 Emulator.
    
    Current VICE team members:
    Pottendo, Marco van den Heuvel, Fabrizio Gennari, Groepaz, Errol Smith, 
    Ingo Korb, Olaf Seibert, Marcus Sutton, Kajtar Zsolt, AreaScout, Bas Wassink, 
    Michael C. Martin, Christopher Phillips, David Hogan, Empathic Qubit, 
    Roberto Muscedere, June Tate-Gans, Pablo Roldan.
    
    This is free software with ABSOLUTELY NO WARRANTY.
    See the "About VICE" command for more info.
    
    Main: random seed was: 0x69a2c576
    Main: command line was: D:\Gry\_Commodore64\GTK3VICE\bin\x64sc.exe -debug
    Main: VICE system file directory: 'D:\Gry\_Commodore64\GTK3VICE\bin\..'.
    Main: VICE system file search path: 'D:\Gry\_Commodore64\GTK3VICE\bin;D:\Gry\_Commodore64\GTK3VICE\bin\..'.
    Sysfile: Loading `D:\Gry\_Commodore64\GTK3VICE\bin\..\C64\kernal-901227-03.bin'.
    C64MEM: Kernal rev #3 ($03) Sum: 50954 ($C70A) SHA1: 1d503e56df85a62fee696e7618dc5b4e781df1bb.
    C64RES: set_kernal_revision(val:3) was kernal_revision: 3
    C64RES: set_kernal_revision found rev:3 name: kernal-901227-03.bin
    C64RES: set_kernal_rom_name val:kernal-901227-03.bin.
    C64RES: set_kernal_revision new kernal_revision: 3
    Sysfile: Loading `D:\Gry\_Commodore64\GTK3VICE\bin\..\C64\basic-901226-01.bin'.
    Sysfile: Loading `D:\Gry\_Commodore64\GTK3VICE\bin\..\C64\chargen-901225-01.bin'.
    Traps: Traps are disabled, trap 'SerialListen' not installed.
    Traps: Traps are disabled, trap 'SerialSaListen' not installed.
    Traps: Traps are disabled, trap 'SerialSendByte' not installed.
    Traps: Traps are disabled, trap 'SerialReceiveByte' not installed.
    Traps: Traps are disabled, trap 'SerialReady' not installed.
    OPENCBM: opening dynamic library opencbm.dll failed!
    Traps: Traps are disabled, trap 'TapeFindHeader' not installed.
    Traps: Traps are disabled, trap 'TapeReceive' not installed.
    DriveROM: Error - 2000 ROM image not found. Hardware-level 2000 emulation is not available.
    DriveROM: Error - 4000 ROM image not found. Hardware-level 4000 emulation is not available.
    DriveROM: Error - CMDHD ROM image not found. Hardware-level CMDHD emulation is not available.
    Sysfile: Loading `D:\Gry\_Commodore64\GTK3VICE\bin\..\DRIVES\dos1541ii-251968-03.bin'.
    Drive: Finished loading ROM images.
    VIC-II: Initializing chip model "MOS8565" (63 cycles per line, 312 raster lines).
    VIC-II:                     BA
    VIC-II:   cycle  xpos vi M76543210   fetch    border gfx      sprite
    VIC-II:   1 Phi1 $194 -- ----**--- SprPtr(3)  -      -        -       
    VIC-II:  -- Phi2 $198 -- ----**--- SprDma0(3) -      -        -       
    VIC-II:   2 Phi1 $19c -- ---***--- SprDma1(3) -      -        -       
    VIC-II:  -- Phi2 $1a0 -- ---***--- SprDma2(3) -      -        -       
    VIC-II:   3 Phi1 $1a4 -- ---**---- SprPtr(4)  -      -        -       
    VIC-II:  -- Phi2 $1a8 -- ---**---- SprDma0(4) -      -        -       
    VIC-II:   4 Phi1 $1ac -- --***---- SprDma1(4) -      -        -       
    VIC-II:  -- Phi2 $1b0 -- --***---- SprDma2(4) -      -        -       
    VIC-II:   5 Phi1 $1b4 -- --**----- SprPtr(5)  -      -        -       
    VIC-II:  -- Phi2 $1b8 -- --**----- SprDma0(5) -      -        -       
    VIC-II:   6 Phi1 $1bc -- -***----- SprDma1(5) -      -        -       
    VIC-II:  -- Phi2 $1c0 -- -***----- SprDma2(5) -      -        -       
    VIC-II:   7 Phi1 $1c4 -- -**------ SprPtr(6)  -      -        -       
    VIC-II:  -- Phi2 $1c8 -- -**------ SprDma0(6) -      -        -       
    VIC-II:   8 Phi1 $1cc -- -**------ SprDma1(6) -      -        -       
    VIC-II:  -- Phi2 $1d0 -- -**------ SprDma2(6) -      -        -       
    VIC-II:   9 Phi1 $1d4 -- -*------- SprPtr(7)  -      -        -       
    VIC-II:  -- Phi2 $1d8 -- -*------- SprDma0(7) -      -        -       
    VIC-II:  10 Phi1 $1dc -- -*------- SprDma1(7) -      -        -       
    VIC-II:  -- Phi2 $1e0 -- -*------- SprDma2(7) -      -        -       
    VIC-II:  11 Phi1 $1e4 -- --------- Refresh    -      -        -       
    VIC-II:  -- Phi2 $1e8 -- --------- -          -      -        -       
    VIC-II:  12 Phi1 $1ec -- *-------- Refresh    -      -        -       
    VIC-II:  -- Phi2 $1f0 -- *-------- -          -      -        -       
    VIC-II:  13 Phi1 $1f4 -- *-------- Refresh    -      -        -       
    VIC-II:  -- Phi2 $000 -- *-------- -          -      -        -       
    VIC-II:  14 Phi1 $004 -- *-------- Refresh    -      -        -       
    VIC-II:  -- Phi2 $008 -- *-------- -          -      UpdateVc -       
    VIC-II:  15 Phi1 $00c -- *-------- Refresh    -      -        -       
    VIC-II:  -- Phi2 $010 -- *-------- FetchC     -      -        ChkSprCrunch
    VIC-II:  16 Phi1 $014 -- *-------- FetchG     -      -        -       
    VIC-II:  -- Phi2 $018  0 *-------- FetchC     -      -        UpdateMcBase
    VIC-II:  17 Phi1 $01c  0 *-------- FetchG     -      -        -       
    VIC-II:  -- Phi2 $020  1 *-------- FetchC     ChkL1  -        -       
    VIC-II:  18 Phi1 $024  1 *-------- FetchG     -      -        -       
    VIC-II:  -- Phi2 $028  2 *-------- FetchC     ChkL0  -        -       
    VIC-II:  19 Phi1 $02c  2 *-------- FetchG     -      -        -       
    VIC-II:  -- Phi2 $030  3 *-------- FetchC     -      -        -       
    VIC-II:  20 Phi1 $034  3 *-------- FetchG     -      -        -       
    VIC-II:  -- Phi2 $038  4 *-------- FetchC     -      -        -       
    VIC-II:  21 Phi1 $03c  4 *-------- FetchG     -      -        -       
    VIC-II:  -- Phi2 $040  5 *-------- FetchC     -      -        -       
    VIC-II:  22 Phi1 $044  5 *-------- FetchG     -      -        -       
    VIC-II:  -- Phi2 $048  6 *-------- FetchC     -      -        -       
    VIC-II:  23 Phi1 $04c  6 *-------- FetchG     -      -        -       
    VIC-II:  -- Phi2 $050  7 *-------- FetchC     -      -        -       
    VIC-II:  24 Phi1 $054  7 *-------- FetchG     -      -        -       
    VIC-II:  -- Phi2 $058  8 *-------- FetchC     -      -        -       
    VIC-II:  25 Phi1 $05c  8 *-------- FetchG     -      -        -       
    VIC-II:  -- Phi2 $060  9 *-------- FetchC     -      -        -       
    VIC-II:  26 Phi1 $064  9 *-------- FetchG     -      -        -       
    VIC-II:  -- Phi2 $068 10 *-------- FetchC     -      -        -       
    VIC-II:  27 Phi1 $06c 10 *-------- FetchG     -      -        -       
    VIC-II:  -- Phi2 $070 11 *-------- FetchC     -      -        -       
    VIC-II:  28 Phi1 $074 11 *-------- FetchG     -      -        -       
    VIC-II:  -- Phi2 $078 12 *-------- FetchC     -      -        -       
    VIC-II:  29 Phi1 $07c 12 *-------- FetchG     -      -        -       
    VIC-II:  -- Phi2 $080 13 *-------- FetchC     -      -        -       
    VIC-II:  30 Phi1 $084 13 *-------- FetchG     -      -        -       
    VIC-II:  -- Phi2 $088 14 *-------- FetchC     -      -        -       
    VIC-II:  31 Phi1 $08c 14 *-------- FetchG     -      -        -       
    VIC-II:  -- Phi2 $090 15 *-------- FetchC     -      -        -       
    VIC-II:  32 Phi1 $094 15 *-------- FetchG     -      -        -       
    VIC-II:  -- Phi2 $098 16 *-------- FetchC     -      -        -       
    VIC-II:  33 Phi1 $09c 16 *-------- FetchG     -      -        -       
    VIC-II:  -- Phi2 $0a0 17 *-------- FetchC     -      -        -       
    VIC-II:  34 Phi1 $0a4 17 *-------- FetchG     -      -        -       
    VIC-II:  -- Phi2 $0a8 18 *-------- FetchC     -      -        -       
    VIC-II:  35 Phi1 $0ac 18 *-------- FetchG     -      -        -       
    VIC-II:  -- Phi2 $0b0 19 *-------- FetchC     -      -        -       
    VIC-II:  36 Phi1 $0b4 19 *-------- FetchG     -      -        -       
    VIC-II:  -- Phi2 $0b8 20 *-------- FetchC     -      -        -       
    VIC-II:  37 Phi1 $0bc 20 *-------- FetchG     -      -        -       
    VIC-II:  -- Phi2 $0c0 21 *-------- FetchC     -      -        -       
    VIC-II:  38 Phi1 $0c4 21 *-------- FetchG     -      -        -       
    VIC-II:  -- Phi2 $0c8 22 *-------- FetchC     -      -        -       
    VIC-II:  39 Phi1 $0cc 22 *-------- FetchG     -      -        -       
    VIC-II:  -- Phi2 $0d0 23 *-------- FetchC     -      -        -       
    VIC-II:  40 Phi1 $0d4 23 *-------- FetchG     -      -        -       
    VIC-II:  -- Phi2 $0d8 24 *-------- FetchC     -      -        -       
    VIC-II:  41 Phi1 $0dc 24 *-------- FetchG     -      -        -       
    VIC-II:  -- Phi2 $0e0 25 *-------- FetchC     -      -        -       
    VIC-II:  42 Phi1 $0e4 25 *-------- FetchG     -      -        -       
    VIC-II:  -- Phi2 $0e8 26 *-------- FetchC     -      -        -       
    VIC-II:  43 Phi1 $0ec 26 *-------- FetchG     -      -        -       
    VIC-II:  -- Phi2 $0f0 27 *-------- FetchC     -      -        -       
    VIC-II:  44 Phi1 $0f4 27 *-------- FetchG     -      -        -       
    VIC-II:  -- Phi2 $0f8 28 *-------- FetchC     -      -        -       
    VIC-II:  45 Phi1 $0fc 28 *-------- FetchG     -      -        -       
    VIC-II:  -- Phi2 $100 29 *-------- FetchC     -      -        -       
    VIC-II:  46 Phi1 $104 29 *-------- FetchG     -      -        -       
    VIC-II:  -- Phi2 $108 30 *-------- FetchC     -      -        -       
    VIC-II:  47 Phi1 $10c 30 *-------- FetchG     -      -        -       
    VIC-II:  -- Phi2 $110 31 *-------- FetchC     -      -        -       
    VIC-II:  48 Phi1 $114 31 *-------- FetchG     -      -        -       
    VIC-II:  -- Phi2 $118 32 *-------- FetchC     -      -        -       
    VIC-II:  49 Phi1 $11c 32 *-------- FetchG     -      -        -       
    VIC-II:  -- Phi2 $120 33 *-------- FetchC     -      -        -       
    VIC-II:  50 Phi1 $124 33 *-------- FetchG     -      -        -       
    VIC-II:  -- Phi2 $128 34 *-------- FetchC     -      -        -       
    VIC-II:  51 Phi1 $12c 34 *-------- FetchG     -      -        -       
    VIC-II:  -- Phi2 $130 35 *-------- FetchC     -      -        -       
    VIC-II:  52 Phi1 $134 35 *-------- FetchG     -      -        -       
    VIC-II:  -- Phi2 $138 36 *-------- FetchC     -      -        -       
    VIC-II:  53 Phi1 $13c 36 *-------- FetchG     -      -        -       
    VIC-II:  -- Phi2 $140 37 *-------- FetchC     -      -        -       
    VIC-II:  54 Phi1 $144 37 *-------- FetchG     -      -        -       
    VIC-II:  -- Phi2 $148 38 *-------- FetchC     -      -        -       
    VIC-II:  55 Phi1 $14c 38 --------* FetchG     -      -        ChkSprDma   
    VIC-II:  -- Phi2 $150 39 --------* -          -      -        -       
    VIC-II:  56 Phi1 $154 39 --------* Idle       -      -        ChkSprDma   
    VIC-II:  -- Phi2 $158 -- --------* -          ChkR0  -        ChkSprExp   
    VIC-II:  57 Phi1 $15c -- -------** Idle       -      -        -       
    VIC-II:  -- Phi2 $160 -- -------** -          ChkR1  -        -       
    VIC-II:  58 Phi1 $164 -- -------** SprPtr(0)  -      -        ChkSprDisp  
    VIC-II:  -- Phi2 $168 -- -------** SprDma0(0) -      UpdateRc -       
    VIC-II:  59 Phi1 $16c -- ------*** SprDma1(0) -      -        -       
    VIC-II:  -- Phi2 $170 -- ------*** SprDma2(0) -      -        -       
    VIC-II:  60 Phi1 $174 -- ------**- SprPtr(1)  -      -        -       
    VIC-II:  -- Phi2 $178 -- ------**- SprDma0(1) -      -        -       
    VIC-II:  61 Phi1 $17c -- -----***- SprDma1(1) -      -        -       
    VIC-II:  -- Phi2 $180 -- -----***- SprDma2(1) -      -        -       
    VIC-II:  62 Phi1 $184 -- -----**-- SprPtr(2)  -      -        -       
    VIC-II:  -- Phi2 $188 -- -----**-- SprDma0(2) -      -        -       
    VIC-II:  63 Phi1 $18c -- ----***-- SprDma1(2) -      -        -       
    VIC-II:  -- Phi2 $190 -- ----***-- SprDma2(2) -      -        -       
    Error - Failed to obtain pixbuf for C64.svg, Error: Unrecognized image file format
    Window: Chip 'VICII' using GTK3 backend 'DirectX'.
    Window:  screen_size: 384 x 312
    Window:  gfx_size: 320 x 200
    Window:  gfx_position: 32 x 51
    Window:  first/last displayed line: 16 x 287
    Window:  extra offscreen border left/right: 0 x 0
    Window:  scalexy: 2 x 2 sizexy: 1 x 1
    Window:  rmode: 1
    Window:  aspect ratio: 0,936508
    Window:  hstretch: 0 vstretch: 0
    Window:  initializing with width, height: 704 x 507
    Render thread: Created render thread 0
    Render thread initialised
    Palette: Loading palette `D:\Gry\_Commodore64\GTK3VICE\bin\..\C64\pepto-pal.vpl'.
    Palette: Loading palette `D:\Gry\_Commodore64\GTK3VICE\bin\..\C64\pepto-pal.vpl'.
    Sound: Available sound devices: dx wmm dummy dump fs wav voc iff aiff mp3 flac ogg soundmovie
    Joystick: Initializing DirectInput8:
    Joystick: OK.
    Joystick: Obtaining devices list:
    Joystick: Registered device "Controller (Cyborg Rumble Pad - PC/Xbox 360)" [0738:0001] (5 axes, 10 buttons, 1 hat)
    Joystick: Registered device "Arduino Leonardo" [2341:0001] (6 axes, 11 buttons, 1 hat)
    Joystick: Registered device "Arduino Leonardo" [2341:0001] (6 axes, 11 buttons, 1 hat)
    Joystick: Warning - Failed to open `D:\Gry\_Commodore64\GTK3VICE\bin\gtk3-joymap-C64SC.vjm'.
    Joystick: Warning - using minimal default mapping.
    GTK3 Mouse: Status changed: 0 (disabled)
    MIDIdrv: init driver
    MIDIdrv: found 0 sources
    MIDIdrv: found 1 destinations
    MIDIdrv: destination #0: Microsoft GS Wavetable Synth
    Keymap: Loading keymap `D:\Gry\_Commodore64\GTK3VICE\bin\..\C64\gtk3_pos.vkm'.
    Hotkeys: Initializing hotkeys.
    Hotkeys: parsing default file 'D:\Gry\_Commodore64\GTK3VICE\bin\..\hotkeys\hotkeys.vhk' for machine C64
    Hotkeys: OK.
    Main CPU: 
    Main CPU: starting at ($FFFC).
    Main CPU: RESET.
    VIC-II: VSP Bug: safe channels are: 23457. Emulation of memory corruption is disabled.
    Sound: Opened device `dx', speed 48000Hz, fragment size 2,67ms, buffer size 32,00ms
    usbsid_open
    Sound: reSID: MOS8580, filter on, sampling rate 48000Hz - resampling, pass to 21600Hz
    VSync: Sync reset
    Unit 8: RESET.
    device_combo_model_new: 000000000767fb80 mode: 0
    device_combo_model_new: 00000000076801b0 mode: 0
    device_combo_model_new: 0000000007680730 mode: 0
    mapping_widget_new
    create_mappings_model joydev:000000000767fb80
    10 buttons:
    0: Przycisk 0 (mapping: action:control port val:0x0010  fire)
    1: Przycisk 1 (mapping: action:control port val:0x0020  fire2)
    2: Przycisk 2 (mapping: action:control port val:0x0040  fire3)
    3: Przycisk 3 (mapping: action:none val:-)
    4: Przycisk 4 (mapping: action:none val:-)
    5: Przycisk 5 (mapping: action:none val:-)
    6: Przycisk 6 (mapping: action:none val:-)
    7: Przycisk 7 (mapping: action:none val:-)
    8: Przycisk 8 (mapping: action:none val:-)
    9: Przycisk 9 (mapping: action:none val:-)
    5 axis:
    10:  X (mapping: action:none val:-)
    10:  X (mapping: action:none val:-)
    11:  Y (mapping: action:none val:-)
    11:  Y (mapping: action:none val:-)
    12:  Z (mapping: action:none val:-)
    12:  Z (mapping: action:none val:-)
    13: Obrót X (mapping: action:none val:-)
    13: Obrót X (mapping: action:none val:-)
    14: Obrót Y (mapping: action:none val:-)
    14: Obrót Y (mapping: action:none val:-)
    1 hats:
    15: Przełącznik ustawień (mapping: action:control port val:0x0001  up)
    15: Przełącznik ustawień (mapping: action:control port val:0x0002  down)
    15: Przełącznik ustawień (mapping: action:control port val:0x0004  left)
    15: Przełącznik ustawień (mapping: action:control port val:0x0008  right)
    create_mappings_model joydev:000000000767fb80
    10 buttons:
    0: Przycisk 0 (mapping: action:none val:-)
    1: Przycisk 1 (mapping: action:none val:-)
    2: Przycisk 2 (mapping: action:none val:-)
    3: Przycisk 3 (mapping: action:none val:-)
    4: Przycisk 4 (mapping: action:none val:-)
    5: Przycisk 5 (mapping: action:none val:-)
    6: Przycisk 6 (mapping: action:none val:-)
    7: Przycisk 7 (mapping: action:none val:-)
    8: Przycisk 8 (mapping: action:none val:-)
    9: Przycisk 9 (mapping: action:none val:-)
    5 axis:
    10:  X (mapping: action:none val:-)
    10:  X (mapping: action:none val:-)
    11:  Y (mapping: action:none val:-)
    11:  Y (mapping: action:none val:-)
    12:  Z (mapping: action:none val:-)
    12:  Z (mapping: action:none val:-)
    13: Obrót X (mapping: action:none val:-)
    13: Obrót X (mapping: action:none val:-)
    14: Obrót Y (mapping: action:none val:-)
    14: Obrót Y (mapping: action:none val:-)
    1 hats:
    15: Przełącznik ustawień (mapping: action:none val:-)
    15: Przełącznik ustawień (mapping: action:none val:-)
    15: Przełącznik ustawień (mapping: action:none val:-)
    15: Przełącznik ustawień (mapping: action:none val:-)
    update_treeview_full
    on_row_activated joydev:000000000767fb80
    id: 15 type:hat up name:Przełącznik ustawień
    mapping_dialog_last_selected: 15
    TODO: show_mapping_dialog id:15 joydev:000000000767fb80
    axis id:15 idx:5
    input type: (2) axis max
    input name:  Z
    mapping type: 0
    create_content_widget
    on_type_changed: mapping:000000000767ff2c
    Got index 0 for type
    create_value_widget action:0
    destroy_value_widgets
    destroy_value_widgets done
    create_value_widget destroy done
    create_value_widget done
    on_type_changed done
    create_value_widget action:0
    destroy_value_widgets
    destroy_value_widgets done
    create_value_widget destroy done
    create_value_widget done
    create_content_widget done
    on_type_changed: mapping:000000000767ff2c
    Got index 1 for type
    destroy_value_widgets
    destroy_value_widgets done
    create_value_widget action:1
    destroy_value_widgets
    destroy_value_widgets done
    create_value_widget destroy done
    create_value_widget done
    on_type_changed done
    mapping dialog on_response
    set_mapping action 0->1
    set_mapping (joystick) value 0->1 (value:0)
    on_mapping_close
    create_mappings_model joydev:000000000767fb80
    10 buttons:
    0: Przycisk 0 (mapping: action:none val:-)
    1: Przycisk 1 (mapping: action:none val:-)
    2: Przycisk 2 (mapping: action:none val:-)
    3: Przycisk 3 (mapping: action:none val:-)
    4: Przycisk 4 (mapping: action:none val:-)
    5: Przycisk 5 (mapping: action:none val:-)
    6: Przycisk 6 (mapping: action:none val:-)
    7: Przycisk 7 (mapping: action:none val:-)
    8: Przycisk 8 (mapping: action:none val:-)
    9: Przycisk 9 (mapping: action:none val:-)
    5 axis:
    10:  X (mapping: action:none val:-)
    10:  X (mapping: action:none val:-)
    11:  Y (mapping: action:none val:-)
    11:  Y (mapping: action:none val:-)
    12:  Z (mapping: action:none val:-)
    12:  Z (mapping: action:control port val:0x0001  up)
    13: Obrót X (mapping: action:none val:-)
    13: Obrót X (mapping: action:none val:-)
    14: Obrót Y (mapping: action:none val:-)
    14: Obrót Y (mapping: action:none val:-)
    1 hats:
    15: Przełącznik ustawień (mapping: action:none val:-)
    15: Przełącznik ustawień (mapping: action:none val:-)
    15: Przełącznik ustawień (mapping: action:none val:-)
    15: Przełącznik ustawień (mapping: action:none val:-)
    update_treeview_full
    select row mapping_dialog_last_selected: 15
    destroy_all
    destroy_value_widgets
    destroy_value_widgets done
    value_grid: 0000000007121f60
    combobox_types: 0000000007380ca0
    top_grid: 00000000152a5850
    destroy_all done
    mapping dialog on_response done
    on_row_activated joydev:000000000767fb80
    id: 15 type:hat down name:Przełącznik ustawień
    mapping_dialog_last_selected: 16
    TODO: show_mapping_dialog id:16 joydev:000000000767fb80
    axis id:16 idx:6
    input type: (1) axis min
    input name: Obrót X
    mapping type: 0
    create_content_widget
    on_type_changed: mapping:000000000767fe6c
    Got index 0 for type
    create_value_widget action:0
    destroy_value_widgets
    destroy_value_widgets done
    create_value_widget destroy done
    create_value_widget done
    on_type_changed done
    create_value_widget action:0
    destroy_value_widgets
    destroy_value_widgets done
    create_value_widget destroy done
    create_value_widget done
    create_content_widget done
    on_type_changed: mapping:000000000767fe6c
    Got index 1 for type
    destroy_value_widgets
    destroy_value_widgets done
    create_value_widget action:1
    destroy_value_widgets
    destroy_value_widgets done
    create_value_widget destroy done
    create_value_widget done
    on_type_changed done
    mapping dialog on_response
    set_mapping action 0->1
    set_mapping (joystick) value 0->2 (value:1)
    on_mapping_close
    create_mappings_model joydev:000000000767fb80
    10 buttons:
    0: Przycisk 0 (mapping: action:none val:-)
    1: Przycisk 1 (mapping: action:none val:-)
    2: Przycisk 2 (mapping: action:none val:-)
    3: Przycisk 3 (mapping: action:none val:-)
    4: Przycisk 4 (mapping: action:none val:-)
    5: Przycisk 5 (mapping: action:none val:-)
    6: Przycisk 6 (mapping: action:none val:-)
    7: Przycisk 7 (mapping: action:none val:-)
    8: Przycisk 8 (mapping: action:none val:-)
    9: Przycisk 9 (mapping: action:none val:-)
    5 axis:
    10:  X (mapping: action:none val:-)
    10:  X (mapping: action:none val:-)
    11:  Y (mapping: action:none val:-)
    11:  Y (mapping: action:none val:-)
    12:  Z (mapping: action:none val:-)
    12:  Z (mapping: action:control port val:0x0001  up)
    13: Obrót X (mapping: action:control port val:0x0002  down)
    13: Obrót X (mapping: action:none val:-)
    14: Obrót Y (mapping: action:none val:-)
    14: Obrót Y (mapping: action:none val:-)
    1 hats:
    15: Przełącznik ustawień (mapping: action:none val:-)
    15: Przełącznik ustawień (mapping: action:none val:-)
    15: Przełącznik ustawień (mapping: action:none val:-)
    15: Przełącznik ustawień (mapping: action:none val:-)
    update_treeview_full
    select row mapping_dialog_last_selected: 16
    destroy_all
    destroy_value_widgets
    destroy_value_widgets done
    value_grid: 00000000143b7630
    combobox_types: 0000000007380ca0
    top_grid: 00000000152a5850
    destroy_all done
    mapping dialog on_response done
    on_row_activated joydev:000000000767fb80
    id: 15 type:hat left name:Przełącznik ustawień
    mapping_dialog_last_selected: 17
    TODO: show_mapping_dialog id:17 joydev:000000000767fb80
    axis id:17 idx:7
    input type: (2) axis max
    input name: Obrót X
    mapping type: 0
    create_content_widget
    on_type_changed: mapping:000000000767fe7c
    Got index 0 for type
    create_value_widget action:0
    destroy_value_widgets
    destroy_value_widgets done
    create_value_widget destroy done
    create_value_widget done
    on_type_changed done
    create_value_widget action:0
    destroy_value_widgets
    destroy_value_widgets done
    create_value_widget destroy done
    create_value_widget done
    create_content_widget done
    on_type_changed: mapping:000000000767fe7c
    Got index 1 for type
    destroy_value_widgets
    destroy_value_widgets done
    create_value_widget action:1
    destroy_value_widgets
    destroy_value_widgets done
    create_value_widget destroy done
    create_value_widget done
    on_type_changed done
    mapping dialog on_response
    set_mapping action 0->1
    set_mapping (joystick) value 0->4 (value:2)
    on_mapping_close
    create_mappings_model joydev:000000000767fb80
    10 buttons:
    0: Przycisk 0 (mapping: action:none val:-)
    1: Przycisk 1 (mapping: action:none val:-)
    2: Przycisk 2 (mapping: action:none val:-)
    3: Przycisk 3 (mapping: action:none val:-)
    4: Przycisk 4 (mapping: action:none val:-)
    5: Przycisk 5 (mapping: action:none val:-)
    6: Przycisk 6 (mapping: action:none val:-)
    7: Przycisk 7 (mapping: action:none val:-)
    8: Przycisk 8 (mapping: action:none val:-)
    9: Przycisk 9 (mapping: action:none val:-)
    5 axis:
    10:  X (mapping: action:none val:-)
    10:  X (mapping: action:none val:-)
    11:  Y (mapping: action:none val:-)
    11:  Y (mapping: action:none val:-)
    12:  Z (mapping: action:none val:-)
    12:  Z (mapping: action:control port val:0x0001  up)
    13: Obrót X (mapping: action:control port val:0x0002  down)
    13: Obrót X (mapping: action:control port val:0x0004  left)
    14: Obrót Y (mapping: action:none val:-)
    14: Obrót Y (mapping: action:none val:-)
    1 hats:
    15: Przełącznik ustawień (mapping: action:none val:-)
    15: Przełącznik ustawień (mapping: action:none val:-)
    15: Przełącznik ustawień (mapping: action:none val:-)
    15: Przełącznik ustawień (mapping: action:none val:-)
    update_treeview_full
    select row mapping_dialog_last_selected: 17
    destroy_all
    destroy_value_widgets
    destroy_value_widgets done
    value_grid: 00000000143b7480
    combobox_types: 0000000007380ca0
    top_grid: 00000000152a5d60
    destroy_all done
    mapping dialog on_response done
    on_row_activated joydev:000000000767fb80
    id: 15 type:hat right name:Przełącznik ustawień
    mapping_dialog_last_selected: 18
    TODO: show_mapping_dialog id:18 joydev:000000000767fb80
    axis id:18 idx:8
    input type: (1) axis min
    input name: Obrót Y
    mapping type: 0
    create_content_widget
    on_type_changed: mapping:000000000767fdbc
    Got index 0 for type
    create_value_widget action:0
    destroy_value_widgets
    destroy_value_widgets done
    create_value_widget destroy done
    create_value_widget done
    on_type_changed done
    create_value_widget action:0
    destroy_value_widgets
    destroy_value_widgets done
    create_value_widget destroy done
    create_value_widget done
    create_content_widget done
    on_type_changed: mapping:000000000767fdbc
    Got index 1 for type
    destroy_value_widgets
    destroy_value_widgets done
    create_value_widget action:1
    destroy_value_widgets
    destroy_value_widgets done
    create_value_widget destroy done
    create_value_widget done
    on_type_changed done
    mapping dialog on_response
    set_mapping action 0->1
    set_mapping (joystick) value 0->8 (value:3)
    on_mapping_close
    create_mappings_model joydev:000000000767fb80
    10 buttons:
    0: Przycisk 0 (mapping: action:none val:-)
    1: Przycisk 1 (mapping: action:none val:-)
    2: Przycisk 2 (mapping: action:none val:-)
    3: Przycisk 3 (mapping: action:none val:-)
    4: Przycisk 4 (mapping: action:none val:-)
    5: Przycisk 5 (mapping: action:none val:-)
    6: Przycisk 6 (mapping: action:none val:-)
    7: Przycisk 7 (mapping: action:none val:-)
    8: Przycisk 8 (mapping: action:none val:-)
    9: Przycisk 9 (mapping: action:none val:-)
    5 axis:
    10:  X (mapping: action:none val:-)
    10:  X (mapping: action:none val:-)
    11:  Y (mapping: action:none val:-)
    11:  Y (mapping: action:none val:-)
    12:  Z (mapping: action:none val:-)
    12:  Z (mapping: action:control port val:0x0001  up)
    13: Obrót X (mapping: action:control port val:0x0002  down)
    13: Obrót X (mapping: action:control port val:0x0004  left)
    14: Obrót Y (mapping: action:control port val:0x0008  right)
    14: Obrót Y (mapping: action:none val:-)
    1 hats:
    15: Przełącznik ustawień (mapping: action:none val:-)
    15: Przełącznik ustawień (mapping: action:none val:-)
    15: Przełącznik ustawień (mapping: action:none val:-)
    15: Przełącznik ustawień (mapping: action:none val:-)
    update_treeview_full
    select row mapping_dialog_last_selected: 18
    destroy_all
    destroy_value_widgets
    destroy_value_widgets done
    value_grid: 0000000015052640
    combobox_types: 0000000007380ca0
    top_grid: 00000000152a5f10
    destroy_all done
    mapping dialog on_response done
    
     
  • gpz

    gpz - 2026-02-28

    Didn't look at the assignment problem yet (will switch to Windows box later) - but could you check if the Button/Axis/Hat Names display correctly now?

     
    • radius75

      radius75 - 2026-02-28

      Partially.

       
      • gpz

        gpz - 2026-02-28

        Ooops, forgot the input tab. try again with r46003 please

         
        • radius75

          radius75 - 2026-03-01

          Everything is displaying correctly now.

           
  • gpz

    gpz - 2026-03-01

    Hat mapping should work now, please try r46004

     
    • radius75

      radius75 - 2026-03-02

      Hat direction mapping now works. Thanks.

       
  • gpz

    gpz - 2026-03-01
    • assigned_to: gpz
    • Version: v3.10 --> v3.x
     
  • radius75

    radius75 - 2026-03-02

    this is a fix that works for me, carefully because it was suggested by AI
    It added something from itself, and also suggested that a similar problem may occur in settings_hotkeys.c

    vice/src/arch/gtk3/widgets/settings_joymap.c

    @@ -388,36 +388,52 @@ static void on_load_from_clicked(GtkButton *button, gpointer extra)
    
      * \param[in]   extra   extra callback data (joystick_device_t)
      */
     static void save_as_callback(GtkDialog *dialog, gchar *path, gpointer extra)
     {
         joystick_device_t *joydev = (joystick_device_t *)extra;
    +    char *fullpath = NULL;
    +    int success = 0;
    
         if (path != NULL) {
    
    -        char *fullpath;
    -
    -        /* add extension if not present (cannot use util_add_extension() here
    -         * since that function might realloc its argument using lib_realloc()
    -         * and path is owned by GLib not VICE */
    +        /* add extension if not present */
             fullpath = util_add_extension_const(path, "vjm");
             g_free(path);
    
    
    +        /* perform the actual dump while the file dialog is still present */
             if (joy_arch_mapping_dump(fullpath, joydev) != -1) {
    -            vice_gtk3_message_info(GTK_WINDOW(dialog),
    +            success = 1;
    +        }
    +    }
    +
    +    /* 
    +     * FIX for Windows UI freeze: 
    +     * Destroy the file-chooser dialog BEFORE showing the message box.
    +     * This ensures the Win32 message loop releases the modal grab properly.
    +     */
    +    gtk_widget_destroy(GTK_WIDGET(dialog));
    +
    +    if (fullpath != NULL) {
    +        /* 
    +         * Use NULL as parent to avoid referencing the destroyed dialog. 
    +         * This allows GDK to return focus to the main settings window.
    +         */
    +        if (success) {
    +            vice_gtk3_message_info(NULL,
                                        "Joymap saved",
                                        "Joymap succesfully saved as '%s'.",
                                        fullpath);
             } else {
    -            vice_gtk3_message_error(GTK_WINDOW(dialog),
    +            vice_gtk3_message_error(NULL,
                                         "Joymap error",
                                         "Failed to save joymap as '%s'.",
                                         fullpath);
             }
             lib_free(fullpath);
         }
    -    gtk_widget_destroy(GTK_WIDGET(dialog));
     }
    
    +
     /** \brief  Handler for the 'clicked' event handler of the 'Save as' button
      *
    
      * \param[in]   button  button (unused)
      * \param[in]   extra   extra event data (joystick_device_t)
      */
    
     
  • radius75

    radius75 - 2026-03-02

    I confirm that the same problem occurs during SaveAs in the Hotkeys menu.

    --
    I checked, this fix from AI fixes the problem in settings_hotkeys.c

    @@ -1385,40 +1385,54 @@ static void on_load_from_clicked(GtkButton *button, gpointer unused)
      *
    
      * Save current hotkeys as \a path, update source path and type widgets.
      *
      * \param[in]   dialog  file dialog
      * \param[in]   path    path to save hotkeys to
    - * \param[in]   extra   extra callback data (unused)
    + * \param[in]   data    extra callback data (unused)
      */
     static void save_as_callback(GtkDialog *dialog, gchar *path, gpointer data)
     {
    -    if (path != NULL) {
    -        char *fullpath;
    +    char *fullpath = NULL;
    +    int success = 0;
    
    
    -        /* add extension if not present (cannot use util_add_extension() here
    -         * since that function might realloc its argument using lib_realloc()
    -         * and path is owned by GLib not VICE */
    +    if (path != NULL) {
    +        /* add extension if not present */
             fullpath = util_add_extension_const(path, "vhk");
             g_free(path);
    
    
    +        /* perform the actual save while dialog is still valid */
             if (ui_hotkeys_save_as(fullpath)) {
    -            vice_gtk3_message_info(GTK_WINDOW(dialog),
    +            success = 1;
    +        }
    +    }
    +
    +    /* 
    +     * FIX for Windows (GDK Win32) freeze: 
    +     * Destroy the file-chooser dialog BEFORE showing the message box.
    +     * This ensures the Win32 message loop releases the modal grab properly.
    +     */
    +    gtk_widget_destroy(GTK_WIDGET(dialog));
    +
    +    if (fullpath != NULL) {
    +        /* Use NULL as parent to ensure clean focus recovery on Windows */
    +        if (success) {
    +            vice_gtk3_message_info(NULL,
                                        "Hotkeys saved",
                                        "Hotkeys succesfully saved as '%s'.",
                                        fullpath);
             } else {
    -            vice_gtk3_message_error(GTK_WINDOW(dialog),
    +            vice_gtk3_message_error(NULL,
                                         "Hotkeys error",
                                         "Failed to save hotkeys as '%s'.",
                                         fullpath);
             }
             lib_free(fullpath);
             update_hotkeys_info();
         }
    -    gtk_widget_destroy(GTK_WIDGET(dialog));
     }
    
    +
     /** \brief  Handler for the 'clicked' event handler of the 'Save as' button
      *
    
      * \param[in]   button  button (unused)
      * \param[in]   unused  extra event data (unused)
      */
    
     

    Last edit: radius75 2026-03-02
  • radius75

    radius75 - 2026-03-02

    Of course, these both fixes apply to #2205 Saving Joystick mapping blocks, closing options, and Vice. I accidentally pasted them into the wrong ticket.

     
  • gpz

    gpz - 2026-03-06

    closing this one, thanks for testing! (Try BT devices as well, they should work now...)

     
  • gpz

    gpz - 2026-03-06
    • status: open --> closed-fixed
     

Log in to post a comment.

MongoDB Logo MongoDB