/*
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.
*/
+#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>
#include <pbd/file_utils.h>
#include <gtkmm2ext/utils.h>
+#include <ardour/configuration.h>
+#include <ardour/configuration.h>
#include <ardour/filesystem_paths.h>
using namespace Glib;
using namespace PBD;
+sigc::signal<void> DPIReset;
+
int
pixel_width (const ustring& str, Pango::FontDescription& font)
{
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]);
}
return Gdk::Color ("red");
}
-
bool
canvas_item_visible (ArdourCanvas::Item* item)
{
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*);
}
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
}
}
cerr << "\tactivate, then propagate\n";
}
#endif
-#ifdef GTKOSX
+#ifdef GTKOSX_ARDOUR_EVENTS_PATCH
if (gdk_quartz_possibly_forward ((GdkEvent*) ev)) {
return true;
}
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;
}
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)
{
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;
}
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;
+}
+