#include <gtkmm2ext/utils.h>
#include "ardour/configuration.h"
-#include "ardour/configuration.h"
+#include "ardour/rc_configuration.h"
#include "ardour/filesystem_paths.h"
#include "i18n.h"
#include "rgb_macros.h"
#include "canvas_impl.h"
+#include "gui_thread.h"
using namespace std;
using namespace Gtk;
-using namespace sigc;
using namespace Glib;
using namespace PBD;
+using Gtkmm2ext::Keyboard;
sigc::signal<void> DPIReset;
c.set_rgb((rgb >> 16)*256, ((rgb & 0xff00) >> 8)*256, (rgb & 0xff)*256);
}
-#ifdef GTKOSX
-extern "C" {
- gboolean gdk_quartz_possibly_forward (GdkEvent*);
-}
-#endif
-
bool
relay_key_press (GdkEventKey* ev, Gtk::Window* win)
{
}
}
+bool
+forward_key_press (GdkEventKey* ev)
+{
+ return PublicEditor::instance().on_key_press_event(ev);
+}
+
+#ifdef GTKOSX
+static guint
+osx_keyval_without_alt (guint accent_keyval)
+{
+ switch (accent_keyval) {
+ case GDK_oe:
+ return GDK_q;
+ case GDK_registered:
+ return GDK_r;
+ case GDK_dagger:
+ return GDK_t;
+ case GDK_yen:
+ return GDK_y;
+ case GDK_diaeresis:
+ return GDK_u;
+ case GDK_oslash:
+ return GDK_o;
+ case GDK_Greek_pi:
+ return GDK_p;
+ case GDK_leftdoublequotemark:
+ return GDK_bracketleft;
+ case GDK_leftsinglequotemark:
+ return GDK_bracketright;
+ case GDK_guillemotleft:
+ return GDK_backslash;
+ case GDK_aring:
+ return GDK_a;
+ case GDK_ssharp:
+ return GDK_s;
+ case GDK_partialderivative:
+ return GDK_d;
+ case GDK_function:
+ return GDK_f;
+ case GDK_copyright:
+ return GDK_g;
+ case GDK_abovedot:
+ return GDK_h;
+ case GDK_notsign:
+ return GDK_l;
+ case GDK_ellipsis:
+ return GDK_semicolon;
+ case GDK_ae:
+ return GDK_apostrophe;
+ case GDK_Greek_OMEGA:
+ return GDK_z;
+ case GDK_ccedilla:
+ return GDK_c;
+ case GDK_radical:
+ return GDK_v;
+ case GDK_integral:
+ return GDK_b;
+ case GDK_mu:
+ return GDK_m;
+ case GDK_lessthanequal:
+ return GDK_comma;
+ case GDK_greaterthanequal:
+ return GDK_period;
+ case GDK_division:
+ return GDK_slash;
+ default:
+ break;
+ }
+
+ return GDK_VoidSymbol;
+}
+#endif
+
bool
key_press_focus_accelerator_handler (Gtk::Window& window, GdkEventKey* ev)
{
all "normal text" accelerators.
*/
+#ifdef GTKOSX
+ if (!special_handling_of_unmodified_accelerators) {
+ if (ev->state & GDK_MOD1_MASK) {
+ /* we're not in a text entry or "magic focus" widget so we don't want OS X "special-character"
+ text-style handling of alt-<key>. change the keyval back to what it would be without
+ the alt key. this way, we see <alt>-v rather than <alt>-radical and so on.
+ */
+ guint keyval_without_alt = osx_keyval_without_alt (ev->keyval);
+
+ if (keyval_without_alt != GDK_VoidSymbol) {
+#ifdef DEBUG_ACCELERATOR_HANDLING
+ cerr << "Remapped " << gdk_keyval_name (ev->keyval) << " to " << gdk_keyval_name (keyval_without_alt) << endl;
+
+#endif ev->keyval = keyval_without_alt;
+ }
+ }
+ }
+#endif
if (!special_handling_of_unmodified_accelerators) {
uint32_t fakekey = ev->keyval;
- if (possibly_translate_keyval_to_make_legal_accelerator (fakekey)) {
+ if (Gtkmm2ext::possibly_translate_keyval_to_make_legal_accelerator (fakekey)) {
if (allow_activating && gtk_accel_groups_activate(G_OBJECT(win), fakekey, GdkModifierType(ev->state))) {
return true;
}
-
-#ifdef GTKOSX
- if (allow_activating) {
- int oldval = ev->keyval;
- ev->keyval = fakekey;
- if (gdk_quartz_possibly_forward ((GdkEvent*) ev)) {
- return true;
- }
- ev->keyval = oldval;
- }
-#endif
}
}
#endif
if (allow_activating) {
-#ifdef GTKOSX
- if (gdk_quartz_possibly_forward ((GdkEvent*) ev)) {
- return true;
- }
-#endif
if (gtk_window_activate_key (win, ev)) {
return true;
}
#endif
if (allow_activating) {
-
-#ifdef GTKOSX
- if (gdk_quartz_possibly_forward ((GdkEvent*) ev)) {
- return true;
- }
-#endif
return gtk_window_activate_key (win, ev);
}
DPIReset();//Emit Signal
}
-bool
-possibly_translate_keyval_to_make_legal_accelerator (uint32_t& keyval)
-{
- int fakekey = GDK_VoidSymbol;
-
- switch (keyval) {
- case GDK_Tab:
- case GDK_ISO_Left_Tab:
- fakekey = GDK_nabla;
- break;
-
- case GDK_Up:
- fakekey = GDK_uparrow;
- break;
-
- case GDK_Down:
- fakekey = GDK_downarrow;
- break;
-
- case GDK_Right:
- fakekey = GDK_rightarrow;
- break;
-
- case GDK_Left:
- fakekey = GDK_leftarrow;
- break;
-
- default:
- break;
- }
-
- if (fakekey != GDK_VoidSymbol) {
- keyval = fakekey;
- return true;
- }
-
- return false;
-}
inline guint8
window->resize (w, h);
}
+
+Glib::RefPtr<Gdk::Pixbuf>
+pixbuf_from_ustring(const ustring& name, Pango::FontDescription* font, int clip_width, int clip_height, Gdk::Color fg)
+{
+ static Glib::RefPtr<Gdk::Pixbuf>* empty_pixbuf = 0;
+
+ if (name.empty()) {
+ if (empty_pixbuf == 0) {
+ empty_pixbuf = new Glib::RefPtr<Gdk::Pixbuf>;
+ *empty_pixbuf = Gdk::Pixbuf::create(Gdk::COLORSPACE_RGB, true, 8, clip_width, clip_height);
+ }
+ return *empty_pixbuf;
+ }
+
+ Glib::RefPtr<Gdk::Pixbuf> buf = Gdk::Pixbuf::create(Gdk::COLORSPACE_RGB, true, 8, clip_width, clip_height);
+
+ cairo_surface_t* surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, clip_width, clip_height);
+ cairo_t* cr = cairo_create (surface);
+ cairo_text_extents_t te;
+
+ cairo_set_source_rgba (cr, fg.get_red_p(), fg.get_green_p(), fg.get_blue_p(), 1.0);
+ cairo_select_font_face (cr, font->get_family().c_str(),
+ CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL);
+ cairo_set_font_size (cr, font->get_size() / Pango::SCALE);
+ cairo_text_extents (cr, name.c_str(), &te);
+
+ cairo_move_to (cr, 0.5, 0.5 - te.height / 2 - te.y_bearing + clip_height / 2);
+ cairo_show_text (cr, name.c_str());
+
+ convert_bgra_to_rgba(cairo_image_surface_get_data (surface), buf->get_pixels(), clip_width, clip_height);
+
+ cairo_destroy(cr);
+ cairo_surface_destroy(surface);
+
+ return buf;
+}
+
+/** Replace _ with __ in a string; for use with menu item text to make underscores displayed correctly */
+string
+escape_underscores (string const & s)
+{
+ string o;
+ string::size_type const N = s.length ();
+
+ for (string::size_type i = 0; i < N; ++i) {
+ if (s[i] == '_') {
+ o += "__";
+ } else {
+ o += s[i];
+ }
+ }
+
+ return o;
+}
+
+static void
+adjustment_to_controllable (Gtk::Adjustment* adj, boost::weak_ptr<Controllable> wcont)
+{
+ boost::shared_ptr<Controllable> cont = wcont.lock();
+
+ if (cont) {
+ double val = adj->get_value();
+ if (val != cont->get_value()) {
+ cont->set_value (val);
+ }
+ }
+}
+
+static void
+controllable_to_adjustment (Gtk::Adjustment* adj, boost::weak_ptr<Controllable> wcont)
+{
+ boost::shared_ptr<Controllable> cont = wcont.lock();
+
+ if (cont) {
+ float val = cont->get_value();
+
+ if (val != adj->get_value()) {
+ adj->set_value (val);
+ }
+ }
+}
+
+void
+control_link (ScopedConnectionList& scl, boost::shared_ptr<Controllable> c, Gtk::Adjustment& a)
+{
+ boost::weak_ptr<Controllable> wc (c);
+
+ a.signal_value_changed().connect (sigc::bind (sigc::ptr_fun (adjustment_to_controllable), &a, wc));
+ c->Changed.connect (scl, MISSING_INVALIDATOR, boost::bind (controllable_to_adjustment, &a, wc),
+ gui_context());
+}
+