GTK: intercept the Tab key and run MNU_SHOW_TEXT_WND.

This commit is contained in:
whitequark 2016-05-18 12:14:42 +00:00
parent b62375b554
commit f3e36f593b

View File

@ -513,10 +513,6 @@ public:
set_double_buffered(true); set_double_buffered(true);
} }
void emulate_key_press(GdkEventKey *event) {
on_key_press_event(event);
}
protected: protected:
virtual bool on_configure_event(GdkEventConfigure *event) { virtual bool on_configure_event(GdkEventConfigure *event) {
_w = event->width; _w = event->width;
@ -596,45 +592,6 @@ protected:
return true; return true;
} }
virtual bool on_key_press_event(GdkEventKey *event) {
int chr;
switch(event->keyval) {
case GDK_KEY_Escape:
chr = GraphicsWindow::ESCAPE_KEY;
break;
case GDK_KEY_Delete:
chr = GraphicsWindow::DELETE_KEY;
break;
case GDK_KEY_Tab:
chr = '\t';
break;
case GDK_KEY_BackSpace:
case GDK_KEY_Back:
chr = '\b';
break;
default:
if(event->keyval >= GDK_KEY_F1 && event->keyval <= GDK_KEY_F12)
chr = GraphicsWindow::FUNCTION_KEY_BASE + (event->keyval - GDK_KEY_F1);
else
chr = gdk_keyval_to_unicode(event->keyval);
}
if(event->state & GDK_SHIFT_MASK)
chr |= GraphicsWindow::SHIFT_MASK;
if(event->state & GDK_CONTROL_MASK)
chr |= GraphicsWindow::CTRL_MASK;
if(chr && SS.GW.KeyDown(chr))
return true;
return false;
}
private: private:
int _w, _h; int _w, _h;
void ij_to_xy(int i, int j, int &x, int &y) { void ij_to_xy(int i, int j, int &x, int &y) {
@ -675,6 +632,10 @@ public:
return _is_fullscreen; return _is_fullscreen;
} }
bool emulate_key_press(GdkEventKey *event) {
return on_key_press_event(event);
}
protected: protected:
virtual void on_show() { virtual void on_show() {
Gtk::Window::on_show(); Gtk::Window::on_show();
@ -705,6 +666,55 @@ protected:
return Gtk::Window::on_window_state_event(event); return Gtk::Window::on_window_state_event(event);
} }
virtual bool on_key_press_event(GdkEventKey *event) {
int chr;
switch(event->keyval) {
case GDK_KEY_Escape:
chr = GraphicsWindow::ESCAPE_KEY;
break;
case GDK_KEY_Delete:
chr = GraphicsWindow::DELETE_KEY;
break;
case GDK_KEY_Tab:
chr = '\t';
break;
case GDK_KEY_BackSpace:
case GDK_KEY_Back:
chr = '\b';
break;
default:
if(event->keyval >= GDK_KEY_F1 && event->keyval <= GDK_KEY_F12) {
chr = GraphicsWindow::FUNCTION_KEY_BASE + (event->keyval - GDK_KEY_F1);
} else {
chr = gdk_keyval_to_unicode(event->keyval);
}
}
if(event->state & GDK_SHIFT_MASK){
chr |= GraphicsWindow::SHIFT_MASK;
}
if(event->state & GDK_CONTROL_MASK) {
chr |= GraphicsWindow::CTRL_MASK;
}
if(chr && SS.GW.KeyDown(chr)) {
return true;
}
if(chr == '\t') {
// Workaround for https://bugzilla.gnome.org/show_bug.cgi?id=123994.
GraphicsWindow::MenuView(GraphicsWindow::MNU_SHOW_TEXT_WND);
return true;
}
return Gtk::Window::on_key_press_event(event);
}
virtual void on_editing_done(Glib::ustring value) { virtual void on_editing_done(Glib::ustring value) {
SS.GW.EditControlDone(value.c_str()); SS.GW.EditControlDone(value.c_str());
} }
@ -900,6 +910,10 @@ public:
accel_key = GDK_KEY_Escape; accel_key = GDK_KEY_Escape;
break; break;
case '\t':
accel_key = GDK_KEY_Tab;
break;
default: default:
accel_key = _entry.accel & ~(GraphicsWindow::SHIFT_MASK | GraphicsWindow::CTRL_MASK); accel_key = _entry.accel & ~(GraphicsWindow::SHIFT_MASK | GraphicsWindow::CTRL_MASK);
if(accel_key > GraphicsWindow::FUNCTION_KEY_BASE && if(accel_key > GraphicsWindow::FUNCTION_KEY_BASE &&
@ -1391,6 +1405,14 @@ protected:
return _widget.event((GdkEvent*) event); return _widget.event((GdkEvent*) event);
} }
virtual bool on_key_press_event(GdkEventKey *event) {
if(GW->emulate_key_press(event)) {
return true;
}
return Gtk::Window::on_key_press_event(event);
}
private: private:
Gtk::VScrollbar _scrollbar; Gtk::VScrollbar _scrollbar;
TextWidget _widget; TextWidget _widget;