X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Futils.cc;h=fcfdbe644cffb33871c4a16526231628e99ba0a2;hb=212a4c1f8d00a65e868f8a3baad1a7c48b795c67;hp=ba151fe3499d62718b2ea080337526e49666f044;hpb=976f006cc0ead49242d37377fce0038a8716b95a;p=ardour.git
diff --git a/gtk2_ardour/utils.cc b/gtk2_ardour/utils.cc
index ba151fe349..fcfdbe644c 100644
--- a/gtk2_ardour/utils.cc
+++ b/gtk2_ardour/utils.cc
@@ -263,112 +263,6 @@ ARDOUR_UI_UTILS::get_font_for_style (string widgetname)
return Pango::FontDescription (pfd); /* make a copy */
}
-uint32_t
-ARDOUR_UI_UTILS::rgba_from_style (string style, uint32_t r, uint32_t g, uint32_t b, uint32_t a, string attr, int state, bool rgba)
-{
- /* In GTK+2, styles aren't set up correctly if the widget is not
- attached to a toplevel window that has a screen pointer.
- */
-
- static Gtk::Window* window = 0;
-
- if (window == 0) {
- window = new Window (WINDOW_TOPLEVEL);
- }
-
- Gtk::Label foo;
-
- window->add (foo);
-
- foo.set_name (style);
- foo.ensure_style ();
-
- GtkRcStyle* rc = foo.get_style()->gobj()->rc_style;
-
- if (rc) {
- if (attr == "fg") {
- r = rc->fg[state].red / 257;
- g = rc->fg[state].green / 257;
- b = rc->fg[state].blue / 257;
-
- /* what a hack ... "a" is for "active" */
- if (state == Gtk::STATE_NORMAL && rgba) {
- a = rc->fg[GTK_STATE_ACTIVE].red / 257;
- }
- } else if (attr == "bg") {
- r = g = b = 0;
- r = rc->bg[state].red / 257;
- g = rc->bg[state].green / 257;
- b = rc->bg[state].blue / 257;
- } else if (attr == "base") {
- r = rc->base[state].red / 257;
- g = rc->base[state].green / 257;
- b = rc->base[state].blue / 257;
- } else if (attr == "text") {
- r = rc->text[state].red / 257;
- g = rc->text[state].green / 257;
- b = rc->text[state].blue / 257;
- }
- } else {
- warning << string_compose (_("missing RGBA style for \"%1\""), style) << endl;
- }
-
- window->remove ();
-
- if (state == Gtk::STATE_NORMAL && rgba) {
- return (uint32_t) RGBA_TO_UINT(r,g,b,a);
- } else {
- return (uint32_t) RGBA_TO_UINT(r,g,b,255);
- }
-}
-
-bool
-ARDOUR_UI_UTILS::rgba_p_from_style (string style, float *r, float *g, float *b, string attr, int state)
-{
- static Gtk::Window* window = 0;
- assert (r && g && b);
-
- if (window == 0) {
- window = new Window (WINDOW_TOPLEVEL);
- }
-
- Gtk::EventBox foo;
-
- window->add (foo);
-
- foo.set_name (style);
- foo.ensure_style ();
-
- GtkRcStyle* rc = foo.get_style()->gobj()->rc_style;
-
- if (!rc) {
- warning << string_compose (_("missing RGBA style for \"%1\""), style) << endl;
- return false;
- }
- if (attr == "fg") {
- *r = rc->fg[state].red / 65535.0;
- *g = rc->fg[state].green / 65535.0;
- *b = rc->fg[state].blue / 65535.0;
- } else if (attr == "bg") {
- *r = rc->bg[state].red / 65535.0;
- *g = rc->bg[state].green / 65535.0;
- *b = rc->bg[state].blue / 65535.0;
- } else if (attr == "base") {
- *r = rc->base[state].red / 65535.0;
- *g = rc->base[state].green / 65535.0;
- *b = rc->base[state].blue / 65535.0;
- } else if (attr == "text") {
- *r = rc->text[state].red / 65535.0;
- *g = rc->text[state].green / 65535.0;
- *b = rc->text[state].blue / 65535.0;
- } else {
- return false;
- }
-
- window->remove ();
- return true;
-}
-
void
ARDOUR_UI_UTILS::set_color_from_rgb (Gdk::Color& c, uint32_t rgb)
{
@@ -454,6 +348,64 @@ ARDOUR_UI_UTILS::emulate_key_event (Gtk::Widget* w, unsigned int keyval)
return forward_key_press(&ev);
}
+static string
+show_gdk_event_state (int state)
+{
+ string s;
+ if (state & GDK_SHIFT_MASK) {
+ s += "+SHIFT";
+ }
+ if (state & GDK_LOCK_MASK) {
+ s += "+LOCK";
+ }
+ if (state & GDK_CONTROL_MASK) {
+ s += "+CONTROL";
+ }
+ if (state & GDK_MOD1_MASK) {
+ s += "+MOD1";
+ }
+ if (state & GDK_MOD2_MASK) {
+ s += "+MOD2";
+ }
+ if (state & GDK_MOD3_MASK) {
+ s += "+MOD3";
+ }
+ if (state & GDK_MOD4_MASK) {
+ s += "+MOD4";
+ }
+ if (state & GDK_MOD5_MASK) {
+ s += "+MOD5";
+ }
+ if (state & GDK_BUTTON1_MASK) {
+ s += "+BUTTON1";
+ }
+ if (state & GDK_BUTTON2_MASK) {
+ s += "+BUTTON2";
+ }
+ if (state & GDK_BUTTON3_MASK) {
+ s += "+BUTTON3";
+ }
+ if (state & GDK_BUTTON4_MASK) {
+ s += "+BUTTON4";
+ }
+ if (state & GDK_BUTTON5_MASK) {
+ s += "+BUTTON5";
+ }
+ if (state & GDK_SUPER_MASK) {
+ s += "+SUPER";
+ }
+ if (state & GDK_HYPER_MASK) {
+ s += "+HYPER";
+ }
+ if (state & GDK_META_MASK) {
+ s += "+META";
+ }
+ if (state & GDK_RELEASE_MASK) {
+ s += "+RELEASE";
+ }
+
+ return s;
+}
bool
ARDOUR_UI_UTILS::key_press_focus_accelerator_handler (Gtk::Window& window, GdkEventKey* ev)
{
@@ -463,6 +415,9 @@ ARDOUR_UI_UTILS::key_press_focus_accelerator_handler (Gtk::Window& window, GdkEv
bool allow_activating = true;
/* consider all relevant modifiers but not LOCK or SHIFT */
const guint mask = (Keyboard::RelevantModifierKeyMask & ~(Gdk::SHIFT_MASK|Gdk::LOCK_MASK));
+ GdkModifierType modifier = GdkModifierType (ev->state);
+ modifier = GdkModifierType (modifier & gtk_accelerator_get_default_mod_mask());
+ Gtkmm2ext::possibly_translate_mod_to_make_legal_accelerator(modifier);
if (focus) {
if (GTK_IS_ENTRY(focus) || Keyboard::some_magic_widget_has_focus()) {
@@ -483,14 +438,15 @@ ARDOUR_UI_UTILS::key_press_focus_accelerator_handler (Gtk::Window& window, GdkEv
#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",
+ DEBUG_TRACE (DEBUG::Accelerators, string_compose ("Win = %1 focus = %7 (%8) Key event: code = %2 state = %3 special handling ? %4 magic widget focus ? %5 allow_activation ? %6\n",
win,
ev->keyval,
- ev->state,
+ show_gdk_event_state (ev->state),
special_handling_of_unmodified_accelerators,
Keyboard::some_magic_widget_has_focus(),
allow_activating,
- focus));
+ focus,
+ (focus ? gtk_widget_get_name (focus) : "no focus widget")));
/* This exists to allow us to override the way GTK handles
key events. The normal sequence is:
@@ -525,6 +481,7 @@ ARDOUR_UI_UTILS::key_press_focus_accelerator_handler (Gtk::Window& window, GdkEv
if (!special_handling_of_unmodified_accelerators) {
+
/* XXX note that for a brief moment, the conditional above
* included "|| (ev->state & mask)" so as to enforce the
* implication of special_handling_of_UNMODIFIED_accelerators.
@@ -552,29 +509,9 @@ ARDOUR_UI_UTILS::key_press_focus_accelerator_handler (Gtk::Window& window, GdkEv
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, string_compose ("\tmodified modifier was %1\n", show_gdk_event_state (modifier)));
+
+ if (allow_activating && gtk_accel_groups_activate(G_OBJECT(win), fakekey, modifier)) {
DEBUG_TRACE (DEBUG::Accelerators, "\taccel group activated by fakekey\n");
return true;
}
@@ -591,8 +528,8 @@ ARDOUR_UI_UTILS::key_press_focus_accelerator_handler (Gtk::Window& window, GdkEv
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");
+ if (gtk_accel_groups_activate (G_OBJECT(win), ev->keyval, modifier)) {
+ DEBUG_TRACE (DEBUG::Accelerators, "\t\thandled\n");
return true;
}
} else {
@@ -611,7 +548,7 @@ ARDOUR_UI_UTILS::key_press_focus_accelerator_handler (Gtk::Window& window, GdkEv
if (!gtk_window_propagate_key_event (win, ev)) {
DEBUG_TRACE (DEBUG::Accelerators, "\tpropagation didn't handle, so activate\n");
if (allow_activating) {
- return gtk_window_activate_key (win, ev);
+ return gtk_accel_groups_activate (G_OBJECT(win), ev->keyval, modifier);
} else {
DEBUG_TRACE (DEBUG::Accelerators, "\tactivation skipped\n");
}
@@ -676,11 +613,14 @@ ARDOUR_UI_UTILS::get_icon_sets ()
}
std::string
-ARDOUR_UI_UTILS::get_icon_path (const char* cname, string icon_set)
+ARDOUR_UI_UTILS::get_icon_path (const char* cname, string icon_set, bool is_image)
{
std::string data_file_path;
string name = cname;
- name += X_(".png");
+
+ if (is_image) {
+ name += X_(".png");
+ }
Searchpath spath(ARDOUR::ardour_data_search_path());
@@ -690,10 +630,13 @@ ARDOUR_UI_UTILS::get_icon_path (const char* cname, string icon_set)
spath.add_subdirectory_to_paths ("icons");
spath.add_subdirectory_to_paths (icon_set);
+ find_file (spath, name, data_file_path);
+ } else {
+ spath.add_subdirectory_to_paths ("icons");
find_file (spath, name, data_file_path);
}
- if (data_file_path.empty()) {
+ if (is_image && data_file_path.empty()) {
if (!icon_set.empty() && icon_set != _("default")) {
warning << string_compose (_("icon \"%1\" not found for icon set \"%2\", fallback to default"), cname, icon_set) << endmsg;
@@ -704,7 +647,7 @@ ARDOUR_UI_UTILS::get_icon_path (const char* cname, string icon_set)
if (!find_file (def, name, data_file_path)) {
fatal << string_compose (_("cannot find icon image for %1 using %2"), name, spath.to_string()) << endmsg;
- /*NOTREACHED*/
+ abort(); /*NOTREACHED*/
}
}
@@ -859,7 +802,7 @@ ARDOUR_UI_UTILS::key_is_legal_for_numeric_entry (guint keyval)
void
ARDOUR_UI_UTILS::set_pango_fontsize ()
{
- long val = ARDOUR::Config->get_font_scale();
+ long val = ARDOUR_UI::config()->get_font_scale();
/* FT2 rendering - used by GnomeCanvas, sigh */
@@ -875,7 +818,7 @@ ARDOUR_UI_UTILS::set_pango_fontsize ()
void
ARDOUR_UI_UTILS::reset_dpi ()
{
- long val = ARDOUR::Config->get_font_scale();
+ long val = ARDOUR_UI::config()->get_font_scale();
set_pango_fontsize ();
/* Xft rendering */
@@ -979,27 +922,39 @@ ARDOUR_UI_UTILS::rate_as_string (float r)
return buf;
}
-
-string
-ARDOUR_UI_UTILS::track_number_to_string (
- int64_t tracknumber,
- std::string sep,
- std::string postfix
- )
+bool
+ARDOUR_UI_UTILS::windows_overlap (Gtk::Window *a, Gtk::Window *b)
{
- string rv;
- if (tracknumber > 0) {
- rv = "";
- rv += PBD::to_string (tracknumber, std::dec);
- rv += "";
- rv += sep;
- }
- else if (tracknumber < 0) {
- rv = "";
- rv += PBD::to_string (-tracknumber, std::dec);
- rv += "";
- rv += sep;
- }
- rv += Glib::Markup::escape_text(postfix);
- return rv;
+
+ if (!a || !b) {
+ return false;
+ }
+ if (a->get_screen() == b->get_screen()) {
+ gint ex, ey, ew, eh;
+ gint mx, my, mw, mh;
+
+ a->get_position (ex, ey);
+ a->get_size (ew, eh);
+ b->get_position (mx, my);
+ b->get_size (mw, mh);
+
+ GdkRectangle e;
+ GdkRectangle m;
+ GdkRectangle r;
+
+ e.x = ex;
+ e.y = ey;
+ e.width = ew;
+ e.height = eh;
+
+ m.x = mx;
+ m.y = my;
+ m.width = mw;
+ m.height = mh;
+
+ if (gdk_rectangle_intersect (&e, &m, &r)) {
+ return true;
+ }
+ }
+ return false;
}