do not manage the remote control menu, since it is explicitly deleted during destruct...
[ardour.git] / gtk2_ardour / utils.cc
index a5238784461ad5dae2a5de485ecf5557f39c61c9..d083b17a1eee7958c0ad377d78855e29f9ed3237 100644 (file)
@@ -1,7 +1,7 @@
 /*
     Copyright (C) 2003 Paul Davis 
 
-    This program is free software; you can redistribute it and/or modify
+    This program is free software; you an redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation; either version 2 of the License, or
     (at your option) any later version.
@@ -17,6 +17,9 @@
 
 */
 
+#include <pango/pangoft2.h> // for fontmap resolution control for GnomeCanvas
+#include <pango/pangocairo.h> // for fontmap resolution control for GnomeCanvas
+
 #include <cstdlib>
 #include <cctype>
 #include <fstream>
@@ -32,6 +35,8 @@
 #include <pbd/file_utils.h>
 
 #include <gtkmm2ext/utils.h>
+#include <ardour/configuration.h>
+#include <ardour/configuration.h>
 
 #include <ardour/filesystem_paths.h>
 
@@ -48,6 +53,8 @@ using namespace sigc;
 using namespace Glib;
 using namespace PBD;
 
+sigc::signal<void>  DPIReset;
+
 int
 pixel_width (const ustring& str, Pango::FontDescription& font)
 {
@@ -341,14 +348,11 @@ color_from_style (string widget_style_name, int state, string attr)
                return Gdk::Color ("red");
        }
 
-       cerr << "got style for " << widget_style_name << endl;
-
        if (attr == "fg") {
                return Gdk::Color (&style->fg[state]);
        }
 
        if (attr == "bg") {
-               cerr << "returning color from bg\n";
                return Gdk::Color (&style->bg[state]);
        }
 
@@ -380,7 +384,6 @@ color_from_style (string widget_style_name, int state, string attr)
        return Gdk::Color ("red");
 }
 
-
 bool 
 canvas_item_visible (ArdourCanvas::Item* item)
 {
@@ -393,7 +396,7 @@ set_color (Gdk::Color& c, int rgb)
        c.set_rgb((rgb >> 16)*256, ((rgb & 0xff00) >> 8)*256, (rgb & 0xff)*256);
 }
 
-#ifdef GTKOSX
+#ifdef GTKOSX_ARDOUR_EVENTS_PATCH
 extern "C" {
        gboolean gdk_quartz_possibly_forward (GdkEvent*);
 }
@@ -463,31 +466,21 @@ key_press_focus_accelerator_handler (Gtk::Window& window, GdkEventKey* ev)
                   it does allow.
                */
 
-               int ret = false;
+               uint32_t fakekey = ev->keyval;
 
-               switch (ev->keyval) {
-               case GDK_Up:
-                       ret = gtk_accel_groups_activate(G_OBJECT(win), GDK_uparrow, GdkModifierType(ev->state));
-                       break;
-
-               case GDK_Down:
-                       ret = gtk_accel_groups_activate(G_OBJECT(win), GDK_downarrow, GdkModifierType(ev->state));
-                       break;
-
-               case GDK_Right:
-                       ret = gtk_accel_groups_activate(G_OBJECT(win), GDK_rightarrow, GdkModifierType(ev->state));
-                       break;
-
-               case GDK_Left:
-                       ret = gtk_accel_groups_activate(G_OBJECT(win), GDK_leftarrow, GdkModifierType(ev->state));
-                       break;
-
-               default:
-                       break;
-               }
+               if (possibly_translate_keyval_to_make_legal_accelerator (fakekey)) {
+                       if (gtk_accel_groups_activate(G_OBJECT(win), fakekey, GdkModifierType(ev->state))) {
+                               return true;
+                       }
 
-               if (ret) {
-                       return true;
+#ifdef GTKOSX_ARDOUR_EVENTS_PATCH
+                       int oldval = ev->keyval;
+                       ev->keyval = fakekey;
+                       if (gdk_quartz_possibly_forward ((GdkEvent*) ev)) {
+                               return true;
+                       }
+                       ev->keyval = oldval;
+#endif
                }
        }
 
@@ -504,7 +497,7 @@ key_press_focus_accelerator_handler (Gtk::Window& window, GdkEventKey* ev)
                        cerr << "\tactivate, then propagate\n";
                }
 #endif
-#ifdef GTKOSX
+#ifdef GTKOSX_ARDOUR_EVENTS_PATCH
                if (gdk_quartz_possibly_forward ((GdkEvent*) ev)) {
                        return true;
                }
@@ -539,7 +532,7 @@ key_press_focus_accelerator_handler (Gtk::Window& window, GdkEventKey* ev)
                        cerr << "\tpropagation didn't handle, so activate\n";
                }
 #endif
-#ifdef GTKOSX
+#ifdef GTKOSX_ARDOUR_EVENTS_PATCH
                if (gdk_quartz_possibly_forward ((GdkEvent*) ev)) {
                        return true;
                }
@@ -565,20 +558,30 @@ key_press_focus_accelerator_handler (Gtk::Window& window, GdkEventKey* ev)
 Glib::RefPtr<Gdk::Pixbuf>      
 get_xpm (std::string name)
 {
-       SearchPath spath(ARDOUR::ardour_search_path());
-       spath += ARDOUR::system_data_search_path();
-
-       spath.add_subdirectory_to_paths("pixmaps");
+       if (!xpm_map[name]) {
 
-       sys::path 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;
+               SearchPath spath(ARDOUR::ardour_search_path());
+               spath += ARDOUR::system_data_search_path();
+               
+               spath.add_subdirectory_to_paths("pixmaps");
+               
+               sys::path 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());
+               } catch(const Glib::Error& e)   {
+                       warning << "Caught Glib::Error: " << e.what() << endmsg;
+               }
        }
 
-       return Gdk::Pixbuf::create_from_file (data_file_path.to_string());
+       return xpm_map[name];
 }
 
+
 Glib::RefPtr<Gdk::Pixbuf>      
 get_icon (const char* cname)
 {
@@ -599,15 +602,11 @@ get_icon (const char* cname)
        Glib::RefPtr<Gdk::Pixbuf> img;
        try {
                img = Gdk::Pixbuf::create_from_file (data_file_path.to_string());
+       } catch (const Gdk::PixbufError &e) {
+               cerr << "Caught PixbufError: " << e.what() << endl;
+       } catch (...) {
+               g_message("Caught ... ");
        }
-       catch (const Gdk::PixbufError &e)
-    {
-        cerr << "Caught PixbufError: " << e.what() << endl;
-    }
-    catch (...)
-    {
-        g_message("Caught ... ");
-    }
 
        return img;
 }
@@ -687,6 +686,68 @@ key_is_legal_for_numeric_entry (guint keyval)
 
        return false;
 }
+void
+set_pango_fontsize ()
+{
+       long val = ARDOUR::Config->get_font_scale();
+
+       /* FT2 rendering - used by GnomeCanvas, sigh */
+
+       pango_ft2_font_map_set_resolution ((PangoFT2FontMap*) pango_ft2_font_map_for_display(), val/1024, val/1024);
+
+       /* Cairo rendering, in case there is any */
+       
+       pango_cairo_font_map_set_resolution ((PangoCairoFontMap*) pango_cairo_font_map_get_default(), val/1024);
+}
 
+void
+reset_dpi ()
+{
+       long val = ARDOUR::Config->get_font_scale();
+       set_pango_fontsize ();
+       /* Xft rendering */
 
+       gtk_settings_set_long_property (gtk_settings_get_default(),
+                                       "gtk-xft-dpi", val, "ardour");
+       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;
+}
+