X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Futils.cc;h=19f93ad2e82b8005a08790ed341827c0e97ce945;hb=cd0d68a591ee64bb0e85d9a364af9fe6abdeecbe;hp=a6af6900a2c0306088d79c5f9244bf02a1492f68;hpb=fd1ff3d7536758283c9597642de5d74e600b3273;p=ardour.git diff --git a/gtk2_ardour/utils.cc b/gtk2_ardour/utils.cc index a6af6900a2..19f93ad2e8 100644 --- a/gtk2_ardour/utils.cc +++ b/gtk2_ardour/utils.cc @@ -25,6 +25,8 @@ #include // for fontmap resolution control for GnomeCanvas #include +#include +#include #include #include #include @@ -36,11 +38,11 @@ #include #include #include +#include #include "pbd/file_utils.h" #include -#include "ardour/configuration.h" #include "ardour/rc_configuration.h" #include "ardour/filesystem_paths.h" @@ -226,13 +228,13 @@ get_font_for_style (string widgetname) Glib::RefPtr layout = foobar.get_layout(); - PangoFontDescription *pfd = (PangoFontDescription *)pango_layout_get_font_description((PangoLayout *)layout->gobj()); + PangoFontDescription *pfd = const_cast (pango_layout_get_font_description(const_cast(layout->gobj()))); if (!pfd) { /* layout inherited its font description from a PangoContext */ - PangoContext* ctxt = (PangoContext*) pango_layout_get_context ((PangoLayout*) layout->gobj()); + PangoContext* ctxt = (PangoContext*) pango_layout_get_context (const_cast(layout->gobj())); pfd = pango_context_get_font_description (ctxt); return Pango::FontDescription (pfd); /* make a copy */ } @@ -344,11 +346,16 @@ key_press_focus_accelerator_handler (Gtk::Window& window, GdkEventKey* ev) } #ifdef GTKOSX - /* should this be universally true? */ + /* at one time this appeared to be necessary. As of July 2012, it does not + appear to be. if it ever is necessar, figure out if it should apply + to all platforms. + */ +#if 0 if (Keyboard::some_magic_widget_has_focus ()) { - allow_activating = false; + allow_activating = false; } #endif +#endif DEBUG_TRACE (DEBUG::Accelerators, string_compose ("Win = %1 focus = %7 Key event: code = %2 state = %3 special handling ? %4 magic widget focus ? %5 allow_activation ? %6\n", @@ -417,7 +424,32 @@ key_press_focus_accelerator_handler (Gtk::Window& window, GdkEventKey* ev) uint32_t fakekey = ev->keyval; if (Gtkmm2ext::possibly_translate_keyval_to_make_legal_accelerator (fakekey)) { - if (allow_activating && gtk_accel_groups_activate(G_OBJECT(win), fakekey, GdkModifierType(ev->state))) { + DEBUG_TRACE (DEBUG::Accelerators, string_compose ("\tactivate (was %1 now %2) without special hanlding of unmodified accels\n", + ev->keyval, fakekey)); + + GdkModifierType mod = GdkModifierType (ev->state); + + mod = GdkModifierType (mod & gtk_accelerator_get_default_mod_mask()); +#ifdef GTKOSX + /* GTK on OS X is currently (February 2012) setting both + the Meta and Mod2 bits in the event modifier state if + the Command key is down. + + gtk_accel_groups_activate() does not invoke any of the logic + that gtk_window_activate_key() will that sorts out that stupid + state of affairs, and as a result it fails to find a match + for the key event and the current set of accelerators. + + to fix this, if the meta bit is set, remove the mod2 bit + from the modifier. this assumes that our bindings use Primary + which will have set the meta bit in the accelerator entry. + */ + if (mod & GDK_META_MASK) { + mod = GdkModifierType (mod & ~GDK_MOD2_MASK); + } +#endif + + if (allow_activating && gtk_accel_groups_activate(G_OBJECT(win), fakekey, mod)) { DEBUG_TRACE (DEBUG::Accelerators, "\taccel group activated by fakekey\n"); return true; } @@ -431,7 +463,9 @@ key_press_focus_accelerator_handler (Gtk::Window& window, GdkEventKey* ev) DEBUG_TRACE (DEBUG::Accelerators, "\tactivate, then propagate\n"); if (allow_activating) { + DEBUG_TRACE (DEBUG::Accelerators, "\tsending to window\n"); if (gtk_window_activate_key (win, ev)) { + DEBUG_TRACE (DEBUG::Accelerators, "\t\thandled\n"); return true; } } else { @@ -469,19 +503,18 @@ get_xpm (std::string name) { if (!xpm_map[name]) { - SearchPath spath(ARDOUR::ardour_search_path()); - spath += ARDOUR::system_data_search_path(); + SearchPath spath(ARDOUR::ardour_data_search_path()); spath.add_subdirectory_to_paths("pixmaps"); - sys::path data_file_path; + std::string data_file_path; if(!find_file_in_search_path (spath, name, data_file_path)) { fatal << string_compose (_("cannot find XPM file for %1"), name) << endmsg; } try { - xpm_map[name] = Gdk::Pixbuf::create_from_file (data_file_path.to_string()); + xpm_map[name] = Gdk::Pixbuf::create_from_file (data_file_path); } catch(const Glib::Error& e) { warning << "Caught Glib::Error: " << e.what() << endmsg; } @@ -496,18 +529,17 @@ get_icon_path (const char* cname) string name = cname; name += X_(".png"); - SearchPath spath(ARDOUR::ardour_search_path()); - spath += ARDOUR::system_data_search_path(); + SearchPath spath(ARDOUR::ardour_data_search_path()); spath.add_subdirectory_to_paths("icons"); - sys::path data_file_path; + std::string data_file_path; if (!find_file_in_search_path (spath, name, data_file_path)) { - fatal << string_compose (_("cannot find icon image for %1"), name) << endmsg; + fatal << string_compose (_("cannot find icon image for %1 using %2"), name, spath.to_string()) << endmsg; } - return data_file_path.to_string(); + return data_file_path; } Glib::RefPtr @@ -519,7 +551,7 @@ get_icon (const char* cname) } catch (const Gdk::PixbufError &e) { cerr << "Caught PixbufError: " << e.what() << endl; } catch (...) { - g_message("Caught ... "); + error << string_compose (_("Caught exception while loading icon named %1"), cname) << endmsg; } return img; @@ -556,11 +588,48 @@ longest (vector& strings) bool key_is_legal_for_numeric_entry (guint keyval) { + /* we assume that this does not change over the life of the process + */ + + static int comma_decimal = -1; + switch (keyval) { - case GDK_minus: - case GDK_plus: case GDK_period: case GDK_comma: + if (comma_decimal < 0) { + std::lconv* lc = std::localeconv(); + if (strchr (lc->decimal_point, ',') != 0) { + comma_decimal = 1; + } else { + comma_decimal = 0; + } + } + break; + default: + break; + } + + switch (keyval) { + case GDK_decimalpoint: + case GDK_KP_Separator: + return true; + + case GDK_period: + if (comma_decimal) { + return false; + } else { + return true; + } + break; + case GDK_comma: + if (comma_decimal) { + return true; + } else { + return false; + } + break; + case GDK_minus: + case GDK_plus: case GDK_0: case GDK_1: case GDK_2: @@ -607,7 +676,7 @@ set_pango_fontsize () /* FT2 rendering - used by GnomeCanvas, sigh */ - pango_ft2_font_map_set_resolution ((PangoFT2FontMap*) pango_ft2_font_map_for_display(), val/1024, val/1024); + pango_ft2_font_map_set_resolution ((PangoFT2FontMap*) pango_ft2_font_map_new(), val/1024, val/1024); /* Cairo rendering, in case there is any */ @@ -658,6 +727,16 @@ escape_underscores (string const & s) return o; } +/** Replace < and > with < and > respectively to make < > display correctly in markup strings */ +string +escape_angled_brackets (string const & s) +{ + string o = s; + boost::replace_all (o, "<", "<"); + boost::replace_all (o, ">", ">"); + return o; +} + Gdk::Color unique_random_color (list& used_colors) {