Marshall T. Vandegrift
2010-Feb-01 14:28 UTC
[fxruby-users] Accelerators on Tab and FXText
Hi, I''ve found what seems to be a bug, although I''m not sure whether in Fox, FXRuby, or my use thereof. The issue is that when an FXText widget has focus, keyboard accelerators bound on the "Tab" key are "hijacked" by the FXText widget. At least on my system, Shift+Tab is actually Shift+ISO_Left_Tab, so in effect this means just Ctrl+Tab is so affected. The code which follows should demonstrate the issue: the accelerators on Ctrl+N and Ctrl+Shift+Tab work and print messages on the console when either the text box or button has focus, but the accelerator on Ctrl+Tab only invokes it''s handler when the button has focus. I''m running fxruby 1.6.20 and libfox 1.6.36-1 (Debian testing). Any suggestions appreciated. Thanks! -Marshall Code follows: require ''fox16'' include Fox class AcceleratorBug < FXMainWindow include Responder ID_CTRL_N = ID_LAST + 1 ID_CTRL_TAB = ID_CTRL_N + 1 ID_CTRL_SHIFT_TAB = ID_CTRL_TAB + 1 def initialize(app) super(app, "Accelerator Bug") frame = FXVerticalFrame.new(self, LAYOUT_FILL) FXText.new(frame, :opts => LAYOUT_FILL | LAYOUT_SIDE_TOP) FXButton.new(frame, "whatever", :opts => LAYOUT_FILL_X) FXMAPFUNC(SEL_COMMAND, ID_CTRL_N, :on_ctrl_n) accelTable.addAccel(fxparseAccel("Ctrl+N"), self, FXSEL(SEL_COMMAND, ID_CTRL_N)) FXMAPFUNC(SEL_COMMAND, ID_CTRL_TAB, :on_ctrl_tab) accelTable.addAccel(fxparseAccel("Ctrl+Tab"), self, FXSEL(SEL_COMMAND, ID_CTRL_TAB)) accelTable.addAccel(fxparseAccel("Alt+Tab"), self, FXSEL(SEL_COMMAND, ID_CTRL_TAB)) FXMAPFUNC(SEL_COMMAND, ID_CTRL_SHIFT_TAB, :on_ctrl_shift_tab) accelTable.addAccel(fxparseAccel("Ctrl+Shift+Tab"), self, FXSEL(SEL_COMMAND, ID_CTRL_SHIFT_TAB)) accelTable.addAccel(Fox.MKUINT(KEY_ISO_Left_Tab, CONTROLMASK | SHIFTMASK), self, FXSEL(SEL_COMMAND, ID_CTRL_SHIFT_TAB)) end def on_ctrl_n(sender, sel, data) puts "You pushed Ctrl+N!" end def on_ctrl_tab(sender, sel, data) puts "You pushed Ctrl+Tab!" end def on_ctrl_shift_tab(sender, sel, data) puts "You pushed Ctrl+Shift+Tab!" end def self.main(argv=ARGV) app = FXApp.new window = AcceleratorBug.new(app) app.create window.show app.run return 0 end end if __FILE__ == $0 exit(AcceleratorBug::main) end