diff --git a/src/airport_gui.cpp b/src/airport_gui.cpp index 97d5a816cc..402dcea4a0 100644 --- a/src/airport_gui.cpp +++ b/src/airport_gui.cpp @@ -338,7 +338,7 @@ public: if (!as->IsAvailable()) { GfxFillRect(r.left + 1, y + 1, r.right - 1, y + this->line_height - 2, PC_BLACK, FILLRECT_CHECKER); } - DrawString(r.left + WD_MATRIX_LEFT, r.right + WD_MATRIX_RIGHT, y + WD_MATRIX_TOP, as->name, ((int)i == _selected_airport_index) ? TC_WHITE : TC_BLACK); + DrawString(r.left + WD_MATRIX_LEFT, r.right - WD_MATRIX_RIGHT, y + WD_MATRIX_TOP, as->name, ((int)i == _selected_airport_index) ? TC_WHITE : TC_BLACK); y += this->line_height; } break; diff --git a/src/build_vehicle_gui.cpp b/src/build_vehicle_gui.cpp index 9410772443..7a65d18cd0 100644 --- a/src/build_vehicle_gui.cpp +++ b/src/build_vehicle_gui.cpp @@ -910,7 +910,7 @@ void DrawEngineList(VehicleType type, int l, int r, int y, const GUIEngineList * const uint num_engines = GetGroupNumEngines(_local_company, selected_group, engine); SetDParam(0, engine); - DrawString(text_left, text_right, y + normal_text_y_offset, STR_ENGINE_NAME, engine == selected_id ? TC_WHITE : TC_BLACK, (rtl ? SA_RIGHT : SA_LEFT)); + DrawString(text_left, text_right, y + normal_text_y_offset, STR_ENGINE_NAME, engine == selected_id ? TC_WHITE : TC_BLACK); DrawVehicleEngine(l, r, sprite_x, y + sprite_y_offset, engine, (show_count && num_engines == 0) ? PALETTE_CRASH : GetEnginePalette(engine, _local_company), EIT_PURCHASE); if (show_count) { SetDParam(0, num_engines); diff --git a/src/gfx_func.h b/src/gfx_func.h index 1226816b4f..1e121b4c30 100644 --- a/src/gfx_func.h +++ b/src/gfx_func.h @@ -44,6 +44,7 @@ #include "gfx_type.h" #include "strings_type.h" +#include "string_type.h" void GameLoop(); @@ -69,7 +70,7 @@ extern Dimension _resolutions[32]; extern Dimension _cur_resolution; extern Palette _cur_palette; ///< Current palette -void HandleKeypress(uint32 key); +void HandleKeypress(uint keycode, WChar key); void HandleCtrlChanged(); void HandleMouseEvents(); void CSleep(int milliseconds); diff --git a/src/industry_gui.cpp b/src/industry_gui.cpp index 9db4a5a946..a38bbbcb9f 100644 --- a/src/industry_gui.cpp +++ b/src/industry_gui.cpp @@ -378,24 +378,37 @@ public: virtual void DrawWidget(const Rect &r, int widget) const { switch (widget) { - case WID_DPI_MATRIX_WIDGET: + case WID_DPI_MATRIX_WIDGET: { + uint text_left, text_right, icon_left, icon_right; + if (_current_text_dir == TD_RTL) { + icon_right = r.right - WD_MATRIX_RIGHT; + icon_left = icon_right - 10; + text_right = icon_right - BuildIndustryWindow::MATRIX_TEXT_OFFSET; + text_left = r.left + WD_MATRIX_LEFT; + } else { + icon_left = r.left + WD_MATRIX_LEFT; + icon_right = icon_left + 10; + text_left = icon_left + BuildIndustryWindow::MATRIX_TEXT_OFFSET; + text_right = r.right - WD_MATRIX_RIGHT; + } + for (byte i = 0; i < this->vscroll->GetCapacity() && i + this->vscroll->GetPosition() < this->count; i++) { - int x = r.left + WD_MATRIX_LEFT; int y = r.top + WD_MATRIX_TOP + i * this->resize.step_height; bool selected = this->selected_index == i + this->vscroll->GetPosition(); if (this->index[i + this->vscroll->GetPosition()] == INVALID_INDUSTRYTYPE) { - DrawString(x + MATRIX_TEXT_OFFSET, r.right - WD_MATRIX_RIGHT, y, STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES, selected ? TC_WHITE : TC_ORANGE); + DrawString(text_left, text_right, y, STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES, selected ? TC_WHITE : TC_ORANGE); continue; } const IndustrySpec *indsp = GetIndustrySpec(this->index[i + this->vscroll->GetPosition()]); /* Draw the name of the industry in white is selected, otherwise, in orange */ - DrawString(x + MATRIX_TEXT_OFFSET, r.right - WD_MATRIX_RIGHT, y, indsp->name, selected ? TC_WHITE : TC_ORANGE); - GfxFillRect(x, y + 1, x + 10, y + 7, selected ? PC_WHITE : PC_BLACK); - GfxFillRect(x + 1, y + 2, x + 9, y + 6, indsp->map_colour); + DrawString(text_left, text_right, y, indsp->name, selected ? TC_WHITE : TC_ORANGE); + GfxFillRect(icon_left, y + 1, icon_right, y + 7, selected ? PC_WHITE : PC_BLACK); + GfxFillRect(icon_left + 1, y + 2, icon_right - 1, y + 6, indsp->map_colour); } break; + } case WID_DPI_INFOPANEL: { int y = r.top + WD_FRAMERECT_TOP; diff --git a/src/object_cmd.cpp b/src/object_cmd.cpp index 9ba2ba83c7..431e9fe056 100644 --- a/src/object_cmd.cpp +++ b/src/object_cmd.cpp @@ -391,7 +391,7 @@ static void DrawTile_Object(TileInfo *ti) DrawNewObjectTile(ti, spec); } - if (spec->flags & OBJECT_FLAG_ALLOW_UNDER_BRIDGE) DrawBridgeMiddle(ti); + DrawBridgeMiddle(ti); } static int GetSlopePixelZ_Object(TileIndex tile, uint x, uint y) diff --git a/src/signs_gui.cpp b/src/signs_gui.cpp index cd4d7e1b8d..d488aa3d5f 100644 --- a/src/signs_gui.cpp +++ b/src/signs_gui.cpp @@ -198,7 +198,7 @@ struct SignListWindow : Window, SignList { uint y = r.top + WD_FRAMERECT_TOP; // Offset from top of widget. /* No signs? */ if (this->vscroll->GetCount() == 0) { - DrawString(r.left + WD_FRAMETEXT_LEFT, r.right, y, STR_STATION_LIST_NONE); + DrawString(r.left + WD_FRAMETEXT_LEFT, r.right - WD_FRAMETEXT_RIGHT, y, STR_STATION_LIST_NONE); return; } diff --git a/src/station_gui.cpp b/src/station_gui.cpp index b0709e2c26..14089beb1c 100644 --- a/src/station_gui.cpp +++ b/src/station_gui.cpp @@ -447,7 +447,7 @@ public: case WID_STL_FACILALL: { int cg_ofst = this->IsWidgetLowered(widget) ? 2 : 1; - DrawString(r.left + cg_ofst, r.right + cg_ofst, r.top + cg_ofst, STR_ABBREV_ALL, TC_BLACK); + DrawString(r.left + cg_ofst, r.right + cg_ofst, r.top + cg_ofst, STR_ABBREV_ALL, TC_BLACK, SA_HOR_CENTER); break; } diff --git a/src/table/townname.h b/src/table/townname.h index 6e572b5c07..aac2d2b358 100644 --- a/src/table/townname.h +++ b/src/table/townname.h @@ -627,9 +627,9 @@ static const char * const _name_spanish_real[] = { "Morrocoy", "Cata", "Cataito", - "Ciudad Bolivar", + "Ciudad Bol\xC3\xADvar", "Barquisimeto", - "Merida", + "M\xC3\xA9rida", "Puerto Ordaz", "Santa Elena", "San Juan", @@ -638,12 +638,12 @@ static const char * const _name_spanish_real[] = { "Santiago", "Barcelona", "Barinas", - "San Cristobal", + "San Crist\xC3\xB3""bal", "San Fransisco", - "San Martin", + "San Mart\xC3\xADn", "Guayana", "San Carlos", - "El Limon", + "El Lim\xC3\xB3n", "Coro", "Corocoro", "Puerto Ayacucho", @@ -663,7 +663,7 @@ static const char * const _name_spanish_real[] = { "Quito", "Cuenca", "Huacho", - "Tulcan", + "Tulc\xC3\xA1n", "Esmeraldas", "Ibarra", "San Lorenzo", @@ -674,20 +674,20 @@ static const char * const _name_spanish_real[] = { "Latacunga", "Tena", "Cochabamba", - "Ascension", + "Ascensi\xC3\xB3n", "Magdalena", "Santa Ana", "Manoa", "Sucre", "Oruro", "Uyuni", - "Potosi", + "Potos\xC3\xAD", "Tupiza", "La Quiaca", "Yacuiba", "San Borja", "Fuerte Olimpio", - "Fortin Esteros", + "Fort\xC3\xADn Esteros", "Campo Grande", "Bogota", "El Banco", @@ -3149,7 +3149,7 @@ static const char * const _name_italian_river2[] = { static const char * const _name_catalan_real[] = { "Barcelona", - "Hospitalet", + "L'Hospitalet de Llobregat", "Cerdanyola", "Martorell", "Badalona", @@ -3161,7 +3161,7 @@ static const char * const _name_catalan_real[] = { "Reus", "Valls", "Vic", - "Vielha", + "Vielha e Mijaran", "Amposta", "Tortosa", "Berga", @@ -3171,12 +3171,12 @@ static const char * const _name_catalan_real[] = { "Figueres", "Balaguer", "Vilafranca del Pened\xC3\xA8s", - "La seu d'Urgell", - "Pont de Suert", + "La Seu d'Urgell", + "El Pont de Suert", "Igualada", "Manresa", "Solsona", - "Les borges blanques", + "Les Borges Blanques", "Tremp", "Sort", "Colera", @@ -3194,21 +3194,21 @@ static const char * const _name_catalan_real[] = { "Campdev\xC3\xA0nol", "Cambrils", "Begur", - "Set Cases", + "Setcases", "Palafrugell", "Begues", "El Bruc", "Cadaqu\xC3\xA9s", "Collbat\xC3\xB3", "Cervell\xC3\xB3", - "Esparraguera", + "Esparreguera", "Abrera", "Alp", "Das", "Cercs", "Manlleu", - "Masnou", - "Molins de rei", + "El Masnou", + "Molins de Rei", "Monistrol", "Rocallaura", "Rub\xC3\xAD", @@ -3218,15 +3218,15 @@ static const char * const _name_catalan_real[] = { }; static const char * const _name_catalan_pref[] = { - "Pont de ", + "El Pont de ", "Parets de ", "Canet de ", "Castellar de ", "Corbera de ", "Arenys de ", "Calella de ", - "La seu de ", - "La bisbal de ", + "La Seu de ", + "La Bisbal de ", "Torroella de ", "Port de ", "Vilafranca de ", @@ -3262,13 +3262,13 @@ static const char * const _name_catalan_1m[] = { }; static const char * const _name_catalan_1f[] = { - "Aigua", - "Selva ", + "Pala", + "Selva", "Vall", "Serra", "Torre", "Riba", - "Vall", + "Cova", "Terra", }; @@ -3280,7 +3280,7 @@ static const char * const _name_catalan_2m[] = { "vent\xC3\xB3s", "negre", "roig", - "gris", + "gr\xC3\xADs", }; static const char * const _name_catalan_2f[] = { @@ -3295,16 +3295,16 @@ static const char * const _name_catalan_2f[] = { }; static const char * const _name_catalan_3[] = { - " desp\xC3\xAD", - " desvern", - " del cam\xC3\xAD", + " Desp\xC3\xAD", + " Desvern", + " del Cam\xC3\xAD", " de Mar", " de Dalt", " de Baix", " del Vall\xC3\xA8s", " de Bergued\xC3\xA0", " de Conflent", - " de la plana", + " de la Plana", }; static const char * const _name_catalan_river1[] = { diff --git a/src/video/allegro_v.cpp b/src/video/allegro_v.cpp index 029cc062aa..963353f0de 100644 --- a/src/video/allegro_v.cpp +++ b/src/video/allegro_v.cpp @@ -304,7 +304,7 @@ static const VkMapping _vk_mapping[] = { AS(KEY_TILDE, WKC_BACKQUOTE), }; -static uint32 ConvertAllegroKeyIntoMy() +static uint32 ConvertAllegroKeyIntoMy(WChar *character) { int scancode; int unicode = ureadkey(&scancode); @@ -326,7 +326,9 @@ static uint32 ConvertAllegroKeyIntoMy() DEBUG(driver, 0, "Scancode character pressed %u", scancode); DEBUG(driver, 0, "Unicode character pressed %u", unicode); #endif - return (key << 16) + unicode; + + *character = unicode; + return key; } static const uint LEFT_BUTTON = 0; @@ -414,7 +416,9 @@ static void PollEvent() if ((key_shifts & KB_ALT_FLAG) && (key[KEY_ENTER] || key[KEY_F])) { ToggleFullScreen(!_fullscreen); } else if (keypressed()) { - HandleKeypress(ConvertAllegroKeyIntoMy()); + WChar character; + uint keycode = ConvertAllegroKeyIntoMy(&character); + HandleKeypress(keycode, character); } } diff --git a/src/video/cocoa/event.mm b/src/video/cocoa/event.mm index 81de0b7b2f..fc6b1bdea8 100644 --- a/src/video/cocoa/event.mm +++ b/src/video/cocoa/event.mm @@ -34,6 +34,7 @@ #include "../../gfx_func.h" #include "../../network/network.h" #include "../../core/random_func.hpp" +#include "../../core/math_func.hpp" #include "../../texteff.hpp" #import /* gettimeofday */ @@ -250,7 +251,7 @@ static uint32 QZ_MapKey(unsigned short sym) if (_current_mods & NSAlternateKeyMask) key |= WKC_ALT; if (_current_mods & NSCommandKeyMask) key |= (_settings_client.gui.right_mouse_btn_emulation != RMBE_CONTROL ? WKC_META : WKC_CTRL); - return key << 16; + return key; } static void QZ_KeyEvent(unsigned short keycode, unsigned short unicode, BOOL down) @@ -272,8 +273,11 @@ static void QZ_KeyEvent(unsigned short keycode, unsigned short unicode, BOOL dow } if (down) { - uint32 pressed_key = QZ_MapKey(keycode) | unicode; - HandleKeypress(pressed_key); + uint32 pressed_key = QZ_MapKey(keycode); + /* Don't handle normal characters if an edit box has the focus. */ + if (!EditBoxInGlobalFocus() || (!IsInsideMM(pressed_key, 'A', 'Z' + 1) && !IsInsideMM(pressed_key, '0', '9' + 1))) { + HandleKeypress(pressed_key, unicode); + } DEBUG(driver, 2, "cocoa_v: QZ_KeyEvent: %x (%x), down, mapping: %x", keycode, unicode, pressed_key); } else { DEBUG(driver, 2, "cocoa_v: QZ_KeyEvent: %x (%x), up", keycode, unicode); diff --git a/src/video/sdl_v.cpp b/src/video/sdl_v.cpp index d66ad59a8b..a95e863320 100644 --- a/src/video/sdl_v.cpp +++ b/src/video/sdl_v.cpp @@ -495,7 +495,7 @@ static const VkMapping _vk_mapping[] = { AS(SDLK_PERIOD, WKC_PERIOD) }; -static uint32 ConvertSdlKeyIntoMy(SDL_keysym *sym) +static uint ConvertSdlKeyIntoMy(SDL_keysym *sym, WChar *character) { const VkMapping *map; uint key = 0; @@ -531,7 +531,8 @@ static uint32 ConvertSdlKeyIntoMy(SDL_keysym *sym) if (sym->mod & KMOD_CTRL) key |= WKC_CTRL; if (sym->mod & KMOD_ALT) key |= WKC_ALT; - return (key << 16) + sym->unicode; + *character = sym->unicode; + return key; } int VideoDriver_SDL::PollEvent() @@ -617,7 +618,9 @@ int VideoDriver_SDL::PollEvent() (ev.key.keysym.sym == SDLK_RETURN || ev.key.keysym.sym == SDLK_f)) { ToggleFullScreen(!_fullscreen); } else { - HandleKeypress(ConvertSdlKeyIntoMy(&ev.key.keysym)); + WChar character; + uint keycode = ConvertSdlKeyIntoMy(&ev.key.keysym, &character); + HandleKeypress(keycode, character); } break; diff --git a/src/video/win32_v.cpp b/src/video/win32_v.cpp index 9834c9586d..8d50d812ad 100644 --- a/src/video/win32_v.cpp +++ b/src/video/win32_v.cpp @@ -493,7 +493,7 @@ static LRESULT HandleCharMsg(uint keycode, WChar charcode) prev_char = 0; #endif /* UNICODE */ - HandleKeypress(GB(charcode, 0, 16) | (keycode << 16)); + HandleKeypress(keycode, charcode); return 0; } @@ -684,7 +684,7 @@ static LRESULT CALLBACK WndProcGdi(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lP /* No character translation? */ if (charcode == 0) { - HandleKeypress(0 | (keycode << 16)); + HandleKeypress(keycode, 0); return 0; } @@ -716,11 +716,11 @@ static LRESULT CALLBACK WndProcGdi(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lP return 0; // do nothing case VK_F10: // F10, ignore activation of menu - HandleKeypress(MapWindowsKey(wParam) << 16); + HandleKeypress(MapWindowsKey(wParam), 0); return 0; default: // ALT in combination with something else - HandleKeypress(MapWindowsKey(wParam) << 16); + HandleKeypress(MapWindowsKey(wParam), 0); break; } break; diff --git a/src/window.cpp b/src/window.cpp index 4f5a2d9012..ad4bf525f7 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -2313,18 +2313,15 @@ EventState Window::HandleEditBoxKey(int wid, WChar key, uint16 keycode) /** * Handle keyboard input. - * @param raw_key Lower 8 bits contain the ASCII character, the higher 16 bits the keycode + * @param keycode Virtual keycode of the key. + * @param key Unicode character of the key. */ -void HandleKeypress(uint32 raw_key) +void HandleKeypress(uint keycode, WChar key) { /* World generation is multithreaded and messes with companies. * But there is no company related window open anyway, so _current_company is not used. */ assert(HasModalProgress() || IsLocalCompany()); - /* Setup event */ - uint16 key = GB(raw_key, 0, 16); - uint16 keycode = GB(raw_key, 16, 16); - /* * The Unicode standard defines an area called the private use area. Code points in this * area are reserved for private use and thus not portable between systems. For instance,