X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fgtkmm2ext%2Fpixscroller.cc;h=55bbef8c80a357a3ed576b94a4d7499d306f8c5a;hb=6a622d86dca2c8af8993d85be8bd8a44debc5b8c;hp=f459726f274820caa910d180ab55620dbe39c571;hpb=449aab3c465bbbf66d221fac3d7ea559f1720357;p=ardour.git diff --git a/libs/gtkmm2ext/pixscroller.cc b/libs/gtkmm2ext/pixscroller.cc index f459726f27..55bbef8c80 100644 --- a/libs/gtkmm2ext/pixscroller.cc +++ b/libs/gtkmm2ext/pixscroller.cc @@ -1,6 +1,6 @@ /* Copyright (C) 2005 Paul Davis - + This program is free software; you can 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 @@ -23,19 +23,22 @@ #include -#include +#include "gtkmm2ext/pixscroller.h" +#include "gtkmm2ext/keyboard.h" using namespace std; using namespace Gtk; using namespace Gtkmm2ext; -PixScroller::PixScroller (Adjustment& a, +PixScroller::PixScroller (Adjustment& a, Glib::RefPtr s, Glib::RefPtr r) : adj (a), rail (r), slider (s) { + Cairo::Format format; + dragging = false; add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::POINTER_MOTION_MASK|Gdk::SCROLL_MASK); @@ -54,6 +57,26 @@ PixScroller::PixScroller (Adjustment& a, sliderrect.set_y((int) rint ((overall_height - sliderrect.get_height()) * (adj.get_upper() - adj.get_value()))); railrect.set_x((sliderrect.get_width() / 2) - 2); + + if (rail->get_has_alpha()) { + format = Cairo::FORMAT_ARGB32; + } else { + format = Cairo::FORMAT_RGB24; + } + rail_surface = Cairo::ImageSurface::create (format, rail->get_width(), rail->get_height()); + rail_context = Cairo::Context::create (rail_surface); + Gdk::Cairo::set_source_pixbuf (rail_context, rail, 0.0, 0.0); + rail_context->paint(); + + if (slider->get_has_alpha()) { + format = Cairo::FORMAT_ARGB32; + } else { + format = Cairo::FORMAT_RGB24; + } + slider_surface = Cairo::ImageSurface::create (format, slider->get_width(), slider->get_height()); + slider_context = Cairo::Context::create (slider_surface); + Gdk::Cairo::set_source_pixbuf (slider_context, slider, 0.0, 0.0); + slider_context->paint(); } void @@ -68,45 +91,31 @@ PixScroller::on_expose_event (GdkEventExpose* ev) { GdkRectangle intersect; Glib::RefPtr win (get_window()); - - win->draw_rectangle (get_style()->get_bg_gc(get_state()), TRUE, - ev->area.x, - ev->area.y, - ev->area.width, - ev->area.height); + Cairo::RefPtr context = get_window()->create_cairo_context(); if (gdk_rectangle_intersect (railrect.gobj(), &ev->area, &intersect)) { - Glib::RefPtr gc(get_style()->get_bg_gc(get_state())); - win->draw_pixbuf (gc, rail, - intersect.x - railrect.get_x(), - intersect.y - railrect.get_y(), - intersect.x, - intersect.y, - intersect.width, - intersect.height, - Gdk::RGB_DITHER_NONE, 0, 0); + + context->save(); + context->rectangle (intersect.x, intersect.y, intersect.width, intersect.height); + context->clip(); + context->set_source (rail_surface, intersect.x - railrect.get_x(), intersect.y - railrect.get_y()); + context->rectangle (intersect.x, intersect.y, intersect.width, intersect.height); + context->clip(); + context->paint(); + context->restore(); } - + if (gdk_rectangle_intersect (sliderrect.gobj(), &ev->area, &intersect)) { - Glib::RefPtr gc(get_style()->get_fg_gc(get_state())); - // Glib::RefPtr mask (slider_mask); - - GdkGCValues values; - gdk_gc_get_values(gc->gobj(), &values); - gc->set_clip_origin (sliderrect.get_x(), sliderrect.get_y()); - // gc->set_clip_mask (mask); - win->draw_pixbuf (gc, slider, - intersect.x - sliderrect.get_x(), - intersect.y - sliderrect.get_y(), - intersect.x, - intersect.y, - intersect.width, - intersect.height, - Gdk::RGB_DITHER_NONE, 0, 0); - gc->set_clip_origin (values.clip_x_origin, values.clip_y_origin); - // gdk_gc_set_clip_mask (gc->gobj(), values.clip_mask); - } + context->save(); + context->rectangle (intersect.x, intersect.y, intersect.width, intersect.height); + context->clip(); + context->set_source (rail_surface, intersect.x - sliderrect.get_x(), intersect.y - sliderrect.get_y()); + context->rectangle (intersect.x, intersect.y, intersect.width, intersect.height); + context->clip(); + context->paint(); + context->restore(); + } return true; } @@ -116,7 +125,7 @@ PixScroller::on_button_press_event (GdkEventButton* ev) { switch (ev->button) { case 1: - if (!(ev->state & Gdk::SHIFT_MASK)) { + if (!(ev->state & Keyboard::TertiaryModifier)) { add_modal_grab(); grab_y = ev->y; grab_start = ev->y; @@ -126,8 +135,8 @@ PixScroller::on_button_press_event (GdkEventButton* ev) break; default: break; - } - + } + return false; } @@ -136,9 +145,9 @@ bool PixScroller::on_button_release_event (GdkEventButton* ev) { double scale; - - if (ev->state & GDK_CONTROL_MASK) { - if (ev->state & GDK_MOD1_MASK) { + + if (ev->state & Keyboard::PrimaryModifier) { + if (ev->state & Keyboard::SecondaryModifier) { scale = 0.05; } else { scale = 0.1; @@ -170,7 +179,7 @@ PixScroller::on_button_release_event (GdkEventButton* ev) adj.set_value (scale * fract * (adj.get_upper() - adj.get_lower())); } } else { - if (ev->state & Gdk::SHIFT_MASK) { + if (ev->state & Keyboard::TertiaryModifier) { adj.set_value (default_value); cerr << "default value = " << default_value << endl; } @@ -186,9 +195,9 @@ bool PixScroller::on_scroll_event (GdkEventScroll* ev) { double scale; - - if (ev->state & GDK_CONTROL_MASK) { - if (ev->state & GDK_MOD1_MASK) { + + if (ev->state & Keyboard::PrimaryModifier) { + if (ev->state & Keyboard::SecondaryModifier) { scale = 0.05; } else { scale = 0.1; @@ -226,9 +235,9 @@ PixScroller::on_motion_notify_event (GdkEventMotion* ev) grab_window = ev->window; return true; } - - if (ev->state & GDK_CONTROL_MASK) { - if (ev->state & GDK_MOD1_MASK) { + + if (ev->state & Keyboard::PrimaryModifier) { + if (ev->state & Keyboard::SecondaryModifier) { scale = 0.05; } else { scale = 0.1; @@ -244,7 +253,7 @@ PixScroller::on_motion_notify_event (GdkEventMotion* ev) fract = min (1.0, fract); fract = max (-1.0, fract); - + fract = -fract; adj.set_value (adj.get_value() + scale * fract * (adj.get_upper() - adj.get_lower()));