mirror of
https://github.com/bsnes-emu/bsnes.git
synced 2025-08-26 05:55:03 +02:00
Update to v106r38 release.
byuu says: Changelog: - hiro: added Qt5 support - hiro: added GTK3 support (currently runs very poorly) - bsnes: number of recent games and quick state slots can be changed programmatically now - I may expose this as a configuration file setting, but probably not within the GUI - nall: use -Wno-everything when compiling with Clang - sorry, Clang's meaningless warning messages are just endless ...
This commit is contained in:
@@ -50,7 +50,7 @@ auto pApplication::initialize() -> void {
|
||||
int argc = 1;
|
||||
char* argv[] = {name.get(), nullptr};
|
||||
#else
|
||||
//--g-fatal-warnings will force a trap on Gtk-CRITICAL errors
|
||||
//--g-fatal-warnings will force a trap on Gtk-CRITICAL and Gtk-WARNING messages
|
||||
//this allows gdb to perform a backtrace to find an error's origin point
|
||||
int argc = 2;
|
||||
char* argv[] = {name.get(), new char[19], nullptr};
|
||||
@@ -75,6 +75,7 @@ auto pApplication::initialize() -> void {
|
||||
g_object_set(gtkSettings, "gtk-im-module", "gtk-im-context-simple", nullptr);
|
||||
#endif
|
||||
|
||||
#if HIRO_GTK==2
|
||||
gtk_rc_parse_string(R"(
|
||||
style "HiroWindow"
|
||||
{
|
||||
@@ -99,6 +100,9 @@ auto pApplication::initialize() -> void {
|
||||
}
|
||||
widget_class "*.<GtkNotebook>.<GtkHBox>.<GtkButton>" style "HiroTabFrameCloseButton"
|
||||
)");
|
||||
#elif HIRO_GTK==3
|
||||
//TODO: is there any alternative here with GTK3?
|
||||
#endif
|
||||
|
||||
pKeyboard::initialize();
|
||||
}
|
||||
|
@@ -41,181 +41,181 @@ auto pKeyboard::_pressed(const char* state, uint16_t code) -> bool {
|
||||
|
||||
auto pKeyboard::_translate(unsigned code) -> signed {
|
||||
switch(code) {
|
||||
case GDK_Escape: return 0;
|
||||
case GDK_F1: return 0;
|
||||
case GDK_F2: return 0;
|
||||
case GDK_F3: return 0;
|
||||
case GDK_F4: return 0;
|
||||
case GDK_F5: return 0;
|
||||
case GDK_F6: return 0;
|
||||
case GDK_F7: return 0;
|
||||
case GDK_F8: return 0;
|
||||
case GDK_F9: return 0;
|
||||
case GDK_F10: return 0;
|
||||
case GDK_F11: return 0;
|
||||
case GDK_F12: return 0;
|
||||
case GDK_KEY_Escape: return 0;
|
||||
case GDK_KEY_F1: return 0;
|
||||
case GDK_KEY_F2: return 0;
|
||||
case GDK_KEY_F3: return 0;
|
||||
case GDK_KEY_F4: return 0;
|
||||
case GDK_KEY_F5: return 0;
|
||||
case GDK_KEY_F6: return 0;
|
||||
case GDK_KEY_F7: return 0;
|
||||
case GDK_KEY_F8: return 0;
|
||||
case GDK_KEY_F9: return 0;
|
||||
case GDK_KEY_F10: return 0;
|
||||
case GDK_KEY_F11: return 0;
|
||||
case GDK_KEY_F12: return 0;
|
||||
|
||||
case GDK_Print: return 0;
|
||||
case GDK_Scroll_Lock: return 0;
|
||||
case GDK_Pause: return 0;
|
||||
case GDK_KEY_Print: return 0;
|
||||
case GDK_KEY_Scroll_Lock: return 0;
|
||||
case GDK_KEY_Pause: return 0;
|
||||
|
||||
case GDK_Insert: return 0;
|
||||
case GDK_Delete: return 0;
|
||||
case GDK_Home: return 0;
|
||||
case GDK_End: return 0;
|
||||
case GDK_Prior: return 0;
|
||||
case GDK_Next: return 0;
|
||||
case GDK_KEY_Insert: return 0;
|
||||
case GDK_KEY_Delete: return 0;
|
||||
case GDK_KEY_Home: return 0;
|
||||
case GDK_KEY_End: return 0;
|
||||
case GDK_KEY_Prior: return 0;
|
||||
case GDK_KEY_Next: return 0;
|
||||
|
||||
case GDK_Up: return 0;
|
||||
case GDK_Down: return 0;
|
||||
case GDK_Left: return 0;
|
||||
case GDK_Right: return 0;
|
||||
case GDK_KEY_Up: return 0;
|
||||
case GDK_KEY_Down: return 0;
|
||||
case GDK_KEY_Left: return 0;
|
||||
case GDK_KEY_Right: return 0;
|
||||
|
||||
case GDK_grave: return '`';
|
||||
case GDK_1: return '1';
|
||||
case GDK_2: return '2';
|
||||
case GDK_3: return '3';
|
||||
case GDK_4: return '4';
|
||||
case GDK_5: return '5';
|
||||
case GDK_6: return '6';
|
||||
case GDK_7: return '7';
|
||||
case GDK_8: return '8';
|
||||
case GDK_9: return '9';
|
||||
case GDK_0: return '0';
|
||||
case GDK_minus: return '-';
|
||||
case GDK_equal: return '=';
|
||||
case GDK_BackSpace: return '\b';
|
||||
case GDK_KEY_grave: return '`';
|
||||
case GDK_KEY_1: return '1';
|
||||
case GDK_KEY_2: return '2';
|
||||
case GDK_KEY_3: return '3';
|
||||
case GDK_KEY_4: return '4';
|
||||
case GDK_KEY_5: return '5';
|
||||
case GDK_KEY_6: return '6';
|
||||
case GDK_KEY_7: return '7';
|
||||
case GDK_KEY_8: return '8';
|
||||
case GDK_KEY_9: return '9';
|
||||
case GDK_KEY_0: return '0';
|
||||
case GDK_KEY_minus: return '-';
|
||||
case GDK_KEY_equal: return '=';
|
||||
case GDK_KEY_BackSpace: return '\b';
|
||||
|
||||
case GDK_asciitilde: return '~';
|
||||
case GDK_exclam: return '!';
|
||||
case GDK_at: return '@';
|
||||
case GDK_numbersign: return '#';
|
||||
case GDK_dollar: return '$';
|
||||
case GDK_percent: return '%';
|
||||
case GDK_asciicircum: return '^';
|
||||
case GDK_ampersand: return '&';
|
||||
case GDK_asterisk: return '*';
|
||||
case GDK_parenleft: return '(';
|
||||
case GDK_parenright: return ')';
|
||||
case GDK_underscore: return '_';
|
||||
case GDK_plus: return '+';
|
||||
case GDK_KEY_asciitilde: return '~';
|
||||
case GDK_KEY_exclam: return '!';
|
||||
case GDK_KEY_at: return '@';
|
||||
case GDK_KEY_numbersign: return '#';
|
||||
case GDK_KEY_dollar: return '$';
|
||||
case GDK_KEY_percent: return '%';
|
||||
case GDK_KEY_asciicircum: return '^';
|
||||
case GDK_KEY_ampersand: return '&';
|
||||
case GDK_KEY_asterisk: return '*';
|
||||
case GDK_KEY_parenleft: return '(';
|
||||
case GDK_KEY_parenright: return ')';
|
||||
case GDK_KEY_underscore: return '_';
|
||||
case GDK_KEY_plus: return '+';
|
||||
|
||||
case GDK_Tab: return '\t';
|
||||
case GDK_Caps_Lock: return 0;
|
||||
case GDK_Return: return '\n';
|
||||
case GDK_Shift_L: return 0;
|
||||
case GDK_Shift_R: return 0;
|
||||
case GDK_Control_L: return 0;
|
||||
case GDK_Control_R: return 0;
|
||||
case GDK_Alt_L: return 0;
|
||||
case GDK_Alt_R: return 0;
|
||||
case GDK_Super_L: return 0;
|
||||
case GDK_Super_R: return 0;
|
||||
case GDK_Menu: return 0;
|
||||
case GDK_space: return ' ';
|
||||
case GDK_KEY_Tab: return '\t';
|
||||
case GDK_KEY_Caps_Lock: return 0;
|
||||
case GDK_KEY_Return: return '\n';
|
||||
case GDK_KEY_Shift_L: return 0;
|
||||
case GDK_KEY_Shift_R: return 0;
|
||||
case GDK_KEY_Control_L: return 0;
|
||||
case GDK_KEY_Control_R: return 0;
|
||||
case GDK_KEY_Alt_L: return 0;
|
||||
case GDK_KEY_Alt_R: return 0;
|
||||
case GDK_KEY_Super_L: return 0;
|
||||
case GDK_KEY_Super_R: return 0;
|
||||
case GDK_KEY_Menu: return 0;
|
||||
case GDK_KEY_space: return ' ';
|
||||
|
||||
case GDK_bracketleft: return '[';
|
||||
case GDK_bracketright: return ']';
|
||||
case GDK_backslash: return '\\';
|
||||
case GDK_semicolon: return ';';
|
||||
case GDK_apostrophe: return '\'';
|
||||
case GDK_comma: return ',';
|
||||
case GDK_period: return '.';
|
||||
case GDK_slash: return '/';
|
||||
case GDK_KEY_bracketleft: return '[';
|
||||
case GDK_KEY_bracketright: return ']';
|
||||
case GDK_KEY_backslash: return '\\';
|
||||
case GDK_KEY_semicolon: return ';';
|
||||
case GDK_KEY_apostrophe: return '\'';
|
||||
case GDK_KEY_comma: return ',';
|
||||
case GDK_KEY_period: return '.';
|
||||
case GDK_KEY_slash: return '/';
|
||||
|
||||
case GDK_braceleft: return '{';
|
||||
case GDK_braceright: return '}';
|
||||
case GDK_bar: return '|';
|
||||
case GDK_colon: return ':';
|
||||
case GDK_quotedbl: return '\"';
|
||||
case GDK_less: return '<';
|
||||
case GDK_greater: return '>';
|
||||
case GDK_question: return '?';
|
||||
case GDK_KEY_braceleft: return '{';
|
||||
case GDK_KEY_braceright: return '}';
|
||||
case GDK_KEY_bar: return '|';
|
||||
case GDK_KEY_colon: return ':';
|
||||
case GDK_KEY_quotedbl: return '\"';
|
||||
case GDK_KEY_less: return '<';
|
||||
case GDK_KEY_greater: return '>';
|
||||
case GDK_KEY_question: return '?';
|
||||
|
||||
case GDK_A: return 'A';
|
||||
case GDK_B: return 'B';
|
||||
case GDK_C: return 'C';
|
||||
case GDK_D: return 'D';
|
||||
case GDK_E: return 'E';
|
||||
case GDK_F: return 'F';
|
||||
case GDK_G: return 'G';
|
||||
case GDK_H: return 'H';
|
||||
case GDK_I: return 'I';
|
||||
case GDK_J: return 'J';
|
||||
case GDK_K: return 'K';
|
||||
case GDK_L: return 'L';
|
||||
case GDK_M: return 'M';
|
||||
case GDK_N: return 'N';
|
||||
case GDK_O: return 'O';
|
||||
case GDK_P: return 'P';
|
||||
case GDK_Q: return 'Q';
|
||||
case GDK_R: return 'R';
|
||||
case GDK_S: return 'S';
|
||||
case GDK_T: return 'T';
|
||||
case GDK_U: return 'U';
|
||||
case GDK_V: return 'V';
|
||||
case GDK_W: return 'W';
|
||||
case GDK_X: return 'X';
|
||||
case GDK_Y: return 'Y';
|
||||
case GDK_Z: return 'Z';
|
||||
case GDK_KEY_A: return 'A';
|
||||
case GDK_KEY_B: return 'B';
|
||||
case GDK_KEY_C: return 'C';
|
||||
case GDK_KEY_D: return 'D';
|
||||
case GDK_KEY_E: return 'E';
|
||||
case GDK_KEY_F: return 'F';
|
||||
case GDK_KEY_G: return 'G';
|
||||
case GDK_KEY_H: return 'H';
|
||||
case GDK_KEY_I: return 'I';
|
||||
case GDK_KEY_J: return 'J';
|
||||
case GDK_KEY_K: return 'K';
|
||||
case GDK_KEY_L: return 'L';
|
||||
case GDK_KEY_M: return 'M';
|
||||
case GDK_KEY_N: return 'N';
|
||||
case GDK_KEY_O: return 'O';
|
||||
case GDK_KEY_P: return 'P';
|
||||
case GDK_KEY_Q: return 'Q';
|
||||
case GDK_KEY_R: return 'R';
|
||||
case GDK_KEY_S: return 'S';
|
||||
case GDK_KEY_T: return 'T';
|
||||
case GDK_KEY_U: return 'U';
|
||||
case GDK_KEY_V: return 'V';
|
||||
case GDK_KEY_W: return 'W';
|
||||
case GDK_KEY_X: return 'X';
|
||||
case GDK_KEY_Y: return 'Y';
|
||||
case GDK_KEY_Z: return 'Z';
|
||||
|
||||
case GDK_a: return 'a';
|
||||
case GDK_b: return 'b';
|
||||
case GDK_c: return 'c';
|
||||
case GDK_d: return 'd';
|
||||
case GDK_e: return 'e';
|
||||
case GDK_f: return 'f';
|
||||
case GDK_g: return 'g';
|
||||
case GDK_h: return 'h';
|
||||
case GDK_i: return 'i';
|
||||
case GDK_j: return 'j';
|
||||
case GDK_k: return 'k';
|
||||
case GDK_l: return 'l';
|
||||
case GDK_m: return 'm';
|
||||
case GDK_n: return 'n';
|
||||
case GDK_o: return 'o';
|
||||
case GDK_p: return 'p';
|
||||
case GDK_q: return 'q';
|
||||
case GDK_r: return 'r';
|
||||
case GDK_s: return 's';
|
||||
case GDK_t: return 't';
|
||||
case GDK_u: return 'u';
|
||||
case GDK_v: return 'v';
|
||||
case GDK_w: return 'w';
|
||||
case GDK_x: return 'x';
|
||||
case GDK_y: return 'y';
|
||||
case GDK_z: return 'z';
|
||||
case GDK_KEY_a: return 'a';
|
||||
case GDK_KEY_b: return 'b';
|
||||
case GDK_KEY_c: return 'c';
|
||||
case GDK_KEY_d: return 'd';
|
||||
case GDK_KEY_e: return 'e';
|
||||
case GDK_KEY_f: return 'f';
|
||||
case GDK_KEY_g: return 'g';
|
||||
case GDK_KEY_h: return 'h';
|
||||
case GDK_KEY_i: return 'i';
|
||||
case GDK_KEY_j: return 'j';
|
||||
case GDK_KEY_k: return 'k';
|
||||
case GDK_KEY_l: return 'l';
|
||||
case GDK_KEY_m: return 'm';
|
||||
case GDK_KEY_n: return 'n';
|
||||
case GDK_KEY_o: return 'o';
|
||||
case GDK_KEY_p: return 'p';
|
||||
case GDK_KEY_q: return 'q';
|
||||
case GDK_KEY_r: return 'r';
|
||||
case GDK_KEY_s: return 's';
|
||||
case GDK_KEY_t: return 't';
|
||||
case GDK_KEY_u: return 'u';
|
||||
case GDK_KEY_v: return 'v';
|
||||
case GDK_KEY_w: return 'w';
|
||||
case GDK_KEY_x: return 'x';
|
||||
case GDK_KEY_y: return 'y';
|
||||
case GDK_KEY_z: return 'z';
|
||||
|
||||
case GDK_Num_Lock: return 0;
|
||||
case GDK_KP_Divide: return '/';
|
||||
case GDK_KP_Multiply: return '*';
|
||||
case GDK_KP_Subtract: return '-';
|
||||
case GDK_KP_Add: return '+';
|
||||
case GDK_KP_Enter: return '\n';
|
||||
case GDK_KP_Decimal: return '.';
|
||||
case GDK_KEY_Num_Lock: return 0;
|
||||
case GDK_KEY_KP_Divide: return '/';
|
||||
case GDK_KEY_KP_Multiply: return '*';
|
||||
case GDK_KEY_KP_Subtract: return '-';
|
||||
case GDK_KEY_KP_Add: return '+';
|
||||
case GDK_KEY_KP_Enter: return '\n';
|
||||
case GDK_KEY_KP_Decimal: return '.';
|
||||
|
||||
case GDK_KP_1: return '1';
|
||||
case GDK_KP_2: return '2';
|
||||
case GDK_KP_3: return '3';
|
||||
case GDK_KP_4: return '4';
|
||||
case GDK_KP_5: return '5';
|
||||
case GDK_KP_6: return '6';
|
||||
case GDK_KP_7: return '7';
|
||||
case GDK_KP_8: return '8';
|
||||
case GDK_KP_9: return '9';
|
||||
case GDK_KP_0: return '0';
|
||||
case GDK_KEY_KP_1: return '1';
|
||||
case GDK_KEY_KP_2: return '2';
|
||||
case GDK_KEY_KP_3: return '3';
|
||||
case GDK_KEY_KP_4: return '4';
|
||||
case GDK_KEY_KP_5: return '5';
|
||||
case GDK_KEY_KP_6: return '6';
|
||||
case GDK_KEY_KP_7: return '7';
|
||||
case GDK_KEY_KP_8: return '8';
|
||||
case GDK_KEY_KP_9: return '9';
|
||||
case GDK_KEY_KP_0: return '0';
|
||||
|
||||
case GDK_KP_Home: return 0;
|
||||
case GDK_KP_End: return 0;
|
||||
case GDK_KP_Page_Up: return 0;
|
||||
case GDK_KP_Page_Down: return 0;
|
||||
case GDK_KP_Up: return 0;
|
||||
case GDK_KP_Down: return 0;
|
||||
case GDK_KP_Left: return 0;
|
||||
case GDK_KP_Right: return 0;
|
||||
case GDK_KP_Begin: return 0;
|
||||
case GDK_KP_Insert: return 0;
|
||||
case GDK_KP_Delete: return 0;
|
||||
case GDK_KEY_KP_Home: return 0;
|
||||
case GDK_KEY_KP_End: return 0;
|
||||
case GDK_KEY_KP_Page_Up: return 0;
|
||||
case GDK_KEY_KP_Page_Down: return 0;
|
||||
case GDK_KEY_KP_Up: return 0;
|
||||
case GDK_KEY_KP_Down: return 0;
|
||||
case GDK_KEY_KP_Left: return 0;
|
||||
case GDK_KEY_KP_Right: return 0;
|
||||
case GDK_KEY_KP_Begin: return 0;
|
||||
case GDK_KEY_KP_Insert: return 0;
|
||||
case GDK_KEY_KP_Delete: return 0;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@@ -2,7 +2,11 @@ namespace hiro {
|
||||
|
||||
Settings::Settings() {
|
||||
string path = {Path::userData(), "hiro/"};
|
||||
auto document = BML::unserialize(file::read({path, "gtk.bml"}));
|
||||
#if HIRO_GTK==2
|
||||
auto document = BML::unserialize(file::read({path, "gtk2.bml"}));
|
||||
#elif HIRO_GTK==3
|
||||
auto document = BML::unserialize(file::read({path, "gtk3.bml"}));
|
||||
#endif
|
||||
|
||||
auto get = [&](string_view name) {
|
||||
return document[name];
|
||||
@@ -32,7 +36,11 @@ Settings::~Settings() {
|
||||
set("Geometry/MenuHeight", geometry.menuHeight);
|
||||
set("Geometry/StatusHeight", geometry.statusHeight);
|
||||
|
||||
file::write({path, "gtk.bml"}, BML::serialize(document));
|
||||
#if HIRO_GTK==2
|
||||
file::write({path, "gtk2.bml"}, BML::serialize(document));
|
||||
#elif HIRO_GTK==3
|
||||
file::write({path, "gtk3.bml"}, BML::serialize(document));
|
||||
#endif
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -132,7 +132,11 @@ auto pCanvas::_onExpose(GdkEventExpose* expose) -> void {
|
||||
height = geometry.height();
|
||||
}
|
||||
|
||||
#if HIRO_GTK==2
|
||||
gdk_draw_pixbuf(gtk_widget_get_window(gtkWidget), nullptr, surface, sx, sy, dx, dy, width, height, GDK_RGB_DITHER_NONE, 0, 0);
|
||||
#elif HIRO_GTK==3
|
||||
//TODO: use cairo here, but how? no examples show to use sx, sy
|
||||
#endif
|
||||
}
|
||||
|
||||
auto pCanvas::_rasterize() -> void {
|
||||
|
@@ -26,7 +26,11 @@ static auto HexEdit_scroll(GtkRange* range, GtkScrollType scroll, double value,
|
||||
}
|
||||
|
||||
auto pHexEdit::construct() -> void {
|
||||
#if HIRO_GTK==2
|
||||
gtkWidget = gtk_hbox_new(false, 0);
|
||||
#elif HIRO_GTK==3
|
||||
gtkWidget = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
|
||||
#endif
|
||||
|
||||
container = gtk_scrolled_window_new(0, 0);
|
||||
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(container), GTK_POLICY_AUTOMATIC, GTK_POLICY_NEVER);
|
||||
@@ -37,7 +41,11 @@ auto pHexEdit::construct() -> void {
|
||||
gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(subWidget), GTK_WRAP_NONE);
|
||||
gtk_container_add(GTK_CONTAINER(container), subWidget);
|
||||
|
||||
scrollBar = gtk_vscrollbar_new((GtkAdjustment*)nullptr);
|
||||
#if HIRO_GTK==2
|
||||
scrollBar = gtk_vscrollbar_new(nullptr);
|
||||
#elif HIRO_GTK==3
|
||||
scrollBar = gtk_scrollbar_new(GTK_ORIENTATION_VERTICAL, nullptr);
|
||||
#endif
|
||||
gtk_range_set_range(GTK_RANGE(scrollBar), 0, 255);
|
||||
gtk_range_set_increments(GTK_RANGE(scrollBar), 1, 16);
|
||||
gtk_widget_set_sensitive(scrollBar, false);
|
||||
@@ -77,7 +85,7 @@ auto pHexEdit::destruct() -> void {
|
||||
}
|
||||
|
||||
auto pHexEdit::focused() const -> bool {
|
||||
return GTK_WIDGET_HAS_FOCUS(subWidget) || GTK_WIDGET_HAS_FOCUS(scrollBar);
|
||||
return gtk_widget_has_focus(subWidget) || gtk_widget_has_focus(scrollBar);
|
||||
}
|
||||
|
||||
auto pHexEdit::setAddress(unsigned address) -> void {
|
||||
@@ -166,17 +174,17 @@ auto pHexEdit::keyPress(unsigned scancode, unsigned mask) -> bool {
|
||||
signed cursorY = position / lineWidth;
|
||||
signed cursorX = position % lineWidth;
|
||||
|
||||
if(scancode == GDK_Home) {
|
||||
if(scancode == GDK_KEY_Home) {
|
||||
setCursorPosition(cursorY * lineWidth + 10);
|
||||
return true;
|
||||
}
|
||||
|
||||
if(scancode == GDK_End) {
|
||||
if(scancode == GDK_KEY_End) {
|
||||
setCursorPosition(cursorY * lineWidth + 10 + (state().columns * 3 - 1));
|
||||
return true;
|
||||
}
|
||||
|
||||
if(scancode == GDK_Up) {
|
||||
if(scancode == GDK_KEY_Up) {
|
||||
if(cursorY != 0) return false;
|
||||
|
||||
signed newAddress = state().address - state().columns;
|
||||
@@ -187,7 +195,7 @@ auto pHexEdit::keyPress(unsigned scancode, unsigned mask) -> bool {
|
||||
return true;
|
||||
}
|
||||
|
||||
if(scancode == GDK_Down) {
|
||||
if(scancode == GDK_KEY_Down) {
|
||||
if(cursorY >= rows() - 1) return true;
|
||||
if(cursorY != state().rows - 1) return false;
|
||||
|
||||
@@ -199,7 +207,7 @@ auto pHexEdit::keyPress(unsigned scancode, unsigned mask) -> bool {
|
||||
return true;
|
||||
}
|
||||
|
||||
if(scancode == GDK_Page_Up) {
|
||||
if(scancode == GDK_KEY_Page_Up) {
|
||||
signed newAddress = state().address - state().columns * state().rows;
|
||||
if(newAddress >= 0) {
|
||||
self().setAddress(newAddress);
|
||||
@@ -210,7 +218,7 @@ auto pHexEdit::keyPress(unsigned scancode, unsigned mask) -> bool {
|
||||
return true;
|
||||
}
|
||||
|
||||
if(scancode == GDK_Page_Down) {
|
||||
if(scancode == GDK_KEY_Page_Down) {
|
||||
signed newAddress = state().address + state().columns * state().rows;
|
||||
for(auto n : range(state().rows)) {
|
||||
if(newAddress + state().columns * state().rows - (state().columns - 1) <= state().length) {
|
||||
|
@@ -10,7 +10,11 @@ static auto HorizontalScrollBar_change(GtkRange* gtkRange, pHorizontalScrollBar*
|
||||
}
|
||||
|
||||
auto pHorizontalScrollBar::construct() -> void {
|
||||
gtkWidget = gtk_hscrollbar_new(0);
|
||||
#if HIRO_GTK==2
|
||||
gtkWidget = gtk_hscrollbar_new(nullptr);
|
||||
#elif HIRO_GTK==3
|
||||
gtkWidget = gtk_scrollbar_new(GTK_ORIENTATION_HORIZONTAL, nullptr);
|
||||
#endif
|
||||
|
||||
setLength(state().length);
|
||||
setPosition(state().position);
|
||||
|
@@ -10,7 +10,11 @@ static auto HorizontalSlider_change(GtkRange* gtkRange, pHorizontalSlider* p) ->
|
||||
}
|
||||
|
||||
auto pHorizontalSlider::construct() -> void {
|
||||
#if HIRO_GTK==2
|
||||
gtkWidget = gtk_hscale_new_with_range(0, 100, 1);
|
||||
#elif HIRO_GTK==3
|
||||
gtkWidget = gtk_scale_new_with_range(GTK_ORIENTATION_HORIZONTAL, 0, 100, 1);
|
||||
#endif
|
||||
gtk_scale_set_draw_value(GTK_SCALE(gtkWidget), false);
|
||||
|
||||
setLength(state().length);
|
||||
|
@@ -65,7 +65,11 @@ auto pTabFrame::append(sTabFrameItem item) -> void {
|
||||
lock();
|
||||
Tab tab;
|
||||
tab.child = gtk_fixed_new();
|
||||
#if HIRO_GTK==2
|
||||
tab.container = gtk_hbox_new(false, 0);
|
||||
#elif HIRO_GTK==3
|
||||
tab.container = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
|
||||
#endif
|
||||
tab.image = gtk_image_new();
|
||||
tab.title = gtk_label_new("");
|
||||
gtk_misc_set_alignment(GTK_MISC(tab.title), 0.0, 0.5);
|
||||
@@ -259,10 +263,14 @@ auto pTabFrame::_tabHeight() -> unsigned {
|
||||
signed height = 1;
|
||||
|
||||
for(auto n : range(self().items())) {
|
||||
height = max(height, tabs[n].image->allocation.height);
|
||||
height = max(height, tabs[n].title->allocation.height);
|
||||
GtkAllocation imageAllocation, titleAllocation, closeAllocation;
|
||||
gtk_widget_get_allocation(tabs[n].image, &imageAllocation);
|
||||
gtk_widget_get_allocation(tabs[n].title, &titleAllocation);
|
||||
gtk_widget_get_allocation(tabs[n].close, &closeAllocation);
|
||||
height = max(height, imageAllocation.height);
|
||||
height = max(height, titleAllocation.height);
|
||||
if(!state().items[n]->closable()) continue;
|
||||
height = max(height, tabs[n].close->allocation.height);
|
||||
height = max(height, closeAllocation.height);
|
||||
}
|
||||
|
||||
return height;
|
||||
@@ -272,8 +280,12 @@ auto pTabFrame::_tabWidth() -> unsigned {
|
||||
signed width = 1;
|
||||
|
||||
for(auto n : range(self().items())) {
|
||||
width = max(width, tabs[n].image->allocation.width + tabs[n].title->allocation.width +
|
||||
(state().items[n]->closable() ? tabs[n].close->allocation.width : 0)
|
||||
GtkAllocation imageAllocation, titleAllocation, closeAllocation;
|
||||
gtk_widget_get_allocation(tabs[n].image, &imageAllocation);
|
||||
gtk_widget_get_allocation(tabs[n].title, &titleAllocation);
|
||||
gtk_widget_get_allocation(tabs[n].close, &closeAllocation);
|
||||
width = max(width, imageAllocation.width + titleAllocation.width +
|
||||
(state().items[n]->closable() ? closeAllocation.width : 0)
|
||||
);
|
||||
}
|
||||
|
||||
|
@@ -7,7 +7,11 @@ auto pTableViewColumn::construct() -> void {
|
||||
auto handle = grandparent.data();
|
||||
unsigned offset = self().offset();
|
||||
|
||||
#if HIRO_GTK==2
|
||||
gtkHeader = gtk_hbox_new(false, 0);
|
||||
#elif HIRO_GTK==3
|
||||
gtkHeader = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
|
||||
#endif
|
||||
|
||||
gtkHeaderIcon = gtk_image_new();
|
||||
gtk_box_pack_start(GTK_BOX(gtkHeader), gtkHeaderIcon, false, false, 0);
|
||||
|
@@ -57,7 +57,7 @@ auto pTableView::append(sTableViewItem item) -> void {
|
||||
}
|
||||
|
||||
auto pTableView::focused() const -> bool {
|
||||
return GTK_WIDGET_HAS_FOCUS(gtkTreeView);
|
||||
return gtk_widget_has_focus(GTK_WIDGET(gtkTreeView));
|
||||
}
|
||||
|
||||
auto pTableView::remove(sTableViewHeader header) -> void {
|
||||
@@ -82,7 +82,9 @@ auto pTableView::resizeColumns() -> void {
|
||||
|
||||
signed maximumWidth = self().geometry().width() - 6;
|
||||
if(auto scrollBar = gtk_scrolled_window_get_vscrollbar(gtkScrolledWindow)) {
|
||||
if(gtk_widget_get_visible(scrollBar)) maximumWidth -= scrollBar->allocation.width;
|
||||
GtkAllocation allocation;
|
||||
gtk_widget_get_allocation(scrollBar, &allocation);
|
||||
if(gtk_widget_get_visible(scrollBar)) maximumWidth -= allocation.width;
|
||||
}
|
||||
|
||||
signed expandWidth = 0;
|
||||
|
@@ -48,7 +48,7 @@ auto pTextEdit::destruct() -> void {
|
||||
}
|
||||
|
||||
auto pTextEdit::focused() const -> bool {
|
||||
return GTK_WIDGET_HAS_FOCUS(subWidget);
|
||||
return gtk_widget_has_focus(subWidget);
|
||||
}
|
||||
|
||||
auto pTextEdit::setBackgroundColor(Color color) -> void {
|
||||
|
@@ -10,7 +10,11 @@ static auto VerticalScrollBar_change(GtkRange* gtkRange, pVerticalScrollBar* p)
|
||||
}
|
||||
|
||||
auto pVerticalScrollBar::construct() -> void {
|
||||
gtkWidget = gtk_vscrollbar_new(0);
|
||||
#if HIRO_GTK==2
|
||||
gtkWidget = gtk_vscrollbar_new(nullptr);
|
||||
#elif HIRO_GTK==3
|
||||
gtkWidget = gtk_scrollbar_new(GTK_ORIENTATION_VERTICAL, nullptr);
|
||||
#endif
|
||||
|
||||
setLength(state().length);
|
||||
setPosition(state().position);
|
||||
|
@@ -10,7 +10,11 @@ static auto VerticalSlider_change(GtkRange* gtkRange, pVerticalSlider* p) -> voi
|
||||
}
|
||||
|
||||
auto pVerticalSlider::construct() -> void {
|
||||
#if HIRO_GTK==2
|
||||
gtkWidget = gtk_vscale_new_with_range(0, 100, 1);
|
||||
#elif HIRO_GTK==3
|
||||
gtkWidget = gtk_scale_new_with_range(GTK_ORIENTATION_VERTICAL, 0, 100, 1);
|
||||
#endif
|
||||
gtk_scale_set_draw_value(GTK_SCALE(gtkWidget), false);
|
||||
|
||||
setLength(state().length);
|
||||
|
@@ -10,6 +10,10 @@ GtkSelectionData* data, unsigned type, unsigned timestamp, pViewport* p) -> void
|
||||
p->self().doDrop(paths);
|
||||
}
|
||||
|
||||
static auto Viewport_expose(GtkWidget* widget, GdkEventExpose* event) -> signed {
|
||||
return true;
|
||||
}
|
||||
|
||||
static auto Viewport_mouseLeave(GtkWidget* widget, GdkEventButton* event, pViewport* p) -> signed {
|
||||
p->self().doMouseLeave();
|
||||
return true;
|
||||
@@ -41,7 +45,7 @@ static auto Viewport_mouseRelease(GtkWidget* widget, GdkEventButton* event, pVie
|
||||
auto pViewport::construct() -> void {
|
||||
gtkWidget = gtk_drawing_area_new();
|
||||
gtk_widget_add_events(gtkWidget,
|
||||
GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_LEAVE_NOTIFY_MASK | GDK_POINTER_MOTION_MASK);
|
||||
GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_EXPOSURE_MASK | GDK_LEAVE_NOTIFY_MASK | GDK_POINTER_MOTION_MASK);
|
||||
|
||||
GdkColor color;
|
||||
color.pixel = 0;
|
||||
@@ -55,6 +59,7 @@ auto pViewport::construct() -> void {
|
||||
g_signal_connect(G_OBJECT(gtkWidget), "button-press-event", G_CALLBACK(Viewport_mousePress), (gpointer)this);
|
||||
g_signal_connect(G_OBJECT(gtkWidget), "button-release-event", G_CALLBACK(Viewport_mouseRelease), (gpointer)this);
|
||||
g_signal_connect(G_OBJECT(gtkWidget), "drag-data-received", G_CALLBACK(Viewport_dropEvent), (gpointer)this);
|
||||
g_signal_connect(G_OBJECT(gtkWidget), "expose-event", G_CALLBACK(Viewport_expose), (gpointer)this);
|
||||
g_signal_connect(G_OBJECT(gtkWidget), "leave-notify-event", G_CALLBACK(Viewport_mouseLeave), (gpointer)this);
|
||||
g_signal_connect(G_OBJECT(gtkWidget), "motion-notify-event", G_CALLBACK(Viewport_mouseMove), (gpointer)this);
|
||||
|
||||
|
@@ -20,7 +20,7 @@ auto pWidget::container(mWidget& widget) -> GtkWidget* {
|
||||
|
||||
auto pWidget::focused() const -> bool {
|
||||
if(!gtkWidget) return false;
|
||||
return GTK_WIDGET_HAS_FOCUS(gtkWidget);
|
||||
return gtk_widget_has_focus(gtkWidget);
|
||||
}
|
||||
|
||||
auto pWidget::setEnabled(bool enabled) -> void {
|
||||
@@ -51,8 +51,10 @@ auto pWidget::setGeometry(Geometry geometry) -> void {
|
||||
auto time = chrono::millisecond();
|
||||
while(chrono::millisecond() - time < 20) {
|
||||
gtk_main_iteration_do(false);
|
||||
if(gtkWidget->allocation.width != geometry.width ()) continue;
|
||||
if(gtkWidget->allocation.height != geometry.height()) continue;
|
||||
GtkAllocation allocation;
|
||||
gtk_widget_get_allocation(gtkWidget, &allocation);
|
||||
if(allocation.width != geometry.width ()) continue;
|
||||
if(allocation.height != geometry.height()) continue;
|
||||
break;
|
||||
}
|
||||
locked = false;
|
||||
|
@@ -12,17 +12,16 @@ static auto Window_close(GtkWidget* widget, GdkEvent* event, pWindow* p) -> sign
|
||||
return true;
|
||||
}
|
||||
|
||||
static auto Window_expose(GtkWidget* widget, GdkEvent* event, pWindow* p) -> signed {
|
||||
//GTK3 draw: called into by GTK2 expose-event
|
||||
static auto Window_draw(GtkWidget* widget, cairo_t* context, pWindow* p) -> signed {
|
||||
if(auto color = p->state().backgroundColor) {
|
||||
cairo_t* context = gdk_cairo_create(widget->window);
|
||||
|
||||
double red = (double)color.red() / 255.0;
|
||||
double green = (double)color.green() / 255.0;
|
||||
double blue = (double)color.blue() / 255.0;
|
||||
double alpha = (double)color.alpha() / 255.0;
|
||||
|
||||
if(gdk_screen_is_composited(gdk_screen_get_default())
|
||||
&& gdk_screen_get_rgba_colormap(gdk_screen_get_default())
|
||||
&& gdk_screen_get_rgba_visual(gdk_screen_get_default())
|
||||
) {
|
||||
cairo_set_source_rgba(context, red, green, blue, alpha);
|
||||
} else {
|
||||
@@ -36,6 +35,15 @@ static auto Window_expose(GtkWidget* widget, GdkEvent* event, pWindow* p) -> sig
|
||||
return false;
|
||||
}
|
||||
|
||||
//GTK2 expose-event
|
||||
static auto Window_expose(GtkWidget* widget, GdkEvent* event, pWindow* p) -> signed {
|
||||
if(auto color = p->state().backgroundColor) {
|
||||
cairo_t* context = gdk_cairo_create(gtk_widget_get_window(widget));
|
||||
return Window_draw(widget, context, p);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
static auto Window_configure(GtkWidget* widget, GdkEvent* event, pWindow* p) -> signed {
|
||||
if(!gtk_widget_get_realized(p->widget)) return false;
|
||||
if(!p->pObject::state().visible) return false;
|
||||
@@ -43,7 +51,11 @@ static auto Window_configure(GtkWidget* widget, GdkEvent* event, pWindow* p) ->
|
||||
|
||||
GdkRectangle border, client;
|
||||
gdk_window_get_frame_extents(gdkWindow, &border);
|
||||
#if HIRO_GTK==2
|
||||
gdk_window_get_geometry(gdkWindow, nullptr, nullptr, &client.width, &client.height, nullptr);
|
||||
#elif HIRO_GTK==3
|
||||
gdk_window_get_geometry(gdkWindow, nullptr, nullptr, &client.width, &client.height);
|
||||
#endif
|
||||
gdk_window_get_origin(gdkWindow, &client.x, &client.y);
|
||||
|
||||
if(!p->state().fullScreen) {
|
||||
@@ -85,11 +97,19 @@ GtkSelectionData* data, unsigned type, unsigned timestamp, pWindow* p) -> void {
|
||||
p->self().doDrop(paths);
|
||||
}
|
||||
|
||||
static auto Window_getPreferredWidth(GtkWidget* widget, int* minimalWidth, int* naturalWidth) -> void {
|
||||
//TODO: get pWindow; use sizeRequest
|
||||
}
|
||||
|
||||
static auto Window_getPreferredHeight(GtkWidget* widget, int* minimalHeight, int* naturalHeight) -> void {
|
||||
//TODO: get pWindow; use sizeRequest
|
||||
}
|
||||
|
||||
static auto Window_keyPress(GtkWidget* widget, GdkEventKey* event, pWindow* p) -> signed {
|
||||
if(auto key = pKeyboard::_translate(event->keyval)) {
|
||||
p->self().doKeyPress(key);
|
||||
}
|
||||
if(p->state().dismissable && event->keyval == GDK_Escape) {
|
||||
if(p->state().dismissable && event->keyval == GDK_KEY_Escape) {
|
||||
if(p->state().onClose) {
|
||||
p->self().doClose();
|
||||
} else {
|
||||
@@ -147,14 +167,18 @@ auto pWindow::construct() -> void {
|
||||
else if(_setIcon("/usr/local/share/pixmaps/"));
|
||||
else if(_setIcon("/usr/share/pixmaps/"));
|
||||
|
||||
GdkColormap* colormap = gdk_screen_get_rgba_colormap(gdk_screen_get_default());
|
||||
if(!colormap) colormap = gdk_screen_get_rgb_colormap(gdk_screen_get_default());
|
||||
if(colormap) gtk_widget_set_colormap(widget, colormap);
|
||||
auto visual = gdk_screen_get_rgba_visual(gdk_screen_get_default());
|
||||
if(!visual) visual = gdk_screen_get_system_visual(gdk_screen_get_default());
|
||||
if(visual) gtk_widget_set_visual(widget, visual);
|
||||
|
||||
gtk_widget_set_app_paintable(widget, true);
|
||||
gtk_widget_add_events(widget, GDK_CONFIGURE);
|
||||
|
||||
#if HIRO_GTK==2
|
||||
menuContainer = gtk_vbox_new(false, 0);
|
||||
#elif HIRO_GTK==3
|
||||
menuContainer = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
|
||||
#endif
|
||||
gtk_container_add(GTK_CONTAINER(widget), menuContainer);
|
||||
gtk_widget_show(menuContainer);
|
||||
|
||||
@@ -167,7 +191,11 @@ auto pWindow::construct() -> void {
|
||||
|
||||
statusContainer = gtk_event_box_new();
|
||||
gtkStatus = gtk_statusbar_new();
|
||||
#if HIRO_GTK==2
|
||||
gtk_statusbar_set_has_resize_grip(GTK_STATUSBAR(gtkStatus), true);
|
||||
#elif HIRO_GTK==3
|
||||
gtk_window_set_has_resize_grip(GTK_WINDOW(widget), true);
|
||||
#endif
|
||||
gtk_container_add(GTK_CONTAINER(statusContainer), gtkStatus);
|
||||
gtk_box_pack_start(GTK_BOX(menuContainer), statusContainer, false, false, 0);
|
||||
gtk_widget_show(statusContainer);
|
||||
@@ -179,13 +207,23 @@ auto pWindow::construct() -> void {
|
||||
setTitle(state().title);
|
||||
|
||||
g_signal_connect(G_OBJECT(widget), "delete-event", G_CALLBACK(Window_close), (gpointer)this);
|
||||
#if HIRO_GTK==2
|
||||
g_signal_connect(G_OBJECT(widget), "expose-event", G_CALLBACK(Window_expose), (gpointer)this);
|
||||
#elif HIRO_GTK==3
|
||||
g_signal_connect(G_OBJECT(widget), "draw", G_CALLBACK(Window_draw), (gpointer)this);
|
||||
#endif
|
||||
g_signal_connect(G_OBJECT(widget), "configure-event", G_CALLBACK(Window_configure), (gpointer)this);
|
||||
g_signal_connect(G_OBJECT(widget), "drag-data-received", G_CALLBACK(Window_drop), (gpointer)this);
|
||||
g_signal_connect(G_OBJECT(widget), "key-press-event", G_CALLBACK(Window_keyPress), (gpointer)this);
|
||||
g_signal_connect(G_OBJECT(widget), "key-release-event", G_CALLBACK(Window_keyRelease), (gpointer)this);
|
||||
g_signal_connect(G_OBJECT(formContainer), "size-allocate", G_CALLBACK(Window_sizeAllocate), (gpointer)this);
|
||||
#if HIRO_GTK==2
|
||||
g_signal_connect(G_OBJECT(formContainer), "size-request", G_CALLBACK(Window_sizeRequest), (gpointer)this);
|
||||
#elif HIRO_GTK==3
|
||||
auto widgetClass = GTK_WIDGET_GET_CLASS(formContainer);
|
||||
widgetClass->get_preferred_width = Window_getPreferredWidth;
|
||||
widgetClass->get_preferred_height = Window_getPreferredHeight;
|
||||
#endif
|
||||
}
|
||||
|
||||
auto pWindow::destruct() -> void {
|
||||
@@ -316,7 +354,13 @@ auto pWindow::setModal(bool modal) -> void {
|
||||
|
||||
auto pWindow::setResizable(bool resizable) -> void {
|
||||
gtk_window_set_resizable(GTK_WINDOW(widget), resizable);
|
||||
#if HIRO_GTK==2
|
||||
gtk_statusbar_set_has_resize_grip(GTK_STATUSBAR(gtkStatus), resizable);
|
||||
#elif HIRO_GTK==3
|
||||
bool statusBarVisible = false;
|
||||
if(auto statusBar = state().statusBar) statusBarVisible = statusBar->visible();
|
||||
gtk_window_set_has_resize_grip(GTK_WINDOW(widget), resizable && statusBarVisible);
|
||||
#endif
|
||||
}
|
||||
|
||||
auto pWindow::setTitle(const string& title) -> void {
|
||||
@@ -428,6 +472,7 @@ auto pWindow::_setStatusText(const string& text) -> void {
|
||||
|
||||
auto pWindow::_setStatusVisible(bool visible) -> void {
|
||||
gtk_widget_set_visible(gtkStatus, visible);
|
||||
setResizable(self().resizable());
|
||||
}
|
||||
|
||||
auto pWindow::_statusHeight() const -> signed {
|
||||
|
Reference in New Issue
Block a user