17 |
* 02110-1301 USA. |
* 02110-1301 USA. |
18 |
*/ |
*/ |
19 |
|
|
20 |
|
#include "compat.h" |
21 |
#include "global.h" |
#include "global.h" |
22 |
#include "regionchooser.h" |
#include "regionchooser.h" |
23 |
|
|
26 |
|
|
27 |
#include <cairomm/context.h> |
#include <cairomm/context.h> |
28 |
#include <gdkmm/general.h> |
#include <gdkmm/general.h> |
29 |
|
#if HAS_GDKMM_SEAT |
30 |
|
# include <gdkmm/seat.h> |
31 |
|
#endif |
32 |
#include <gdkmm/cursor.h> |
#include <gdkmm/cursor.h> |
33 |
#include <gtkmm/stock.h> |
#if HAS_GTKMM_STOCK |
34 |
|
# include <gtkmm/stock.h> |
35 |
|
#endif |
36 |
#include <gdkmm/pixbuf.h> |
#include <gdkmm/pixbuf.h> |
37 |
#include <gtkmm/spinbutton.h> |
#include <gtkmm/spinbutton.h> |
38 |
#include <gtkmm/dialog.h> |
#include <gtkmm/dialog.h> |
132 |
} |
} |
133 |
|
|
134 |
Cairo::RefPtr<Cairo::ImageSurface> imageSurface = Cairo::ImageSurface::create( |
Cairo::RefPtr<Cairo::ImageSurface> imageSurface = Cairo::ImageSurface::create( |
135 |
|
#if HAS_CAIROMM_CPP11_ENUMS |
136 |
|
this->blueHatchedPatternARGB->get_pixels(), Cairo::Surface::Format::ARGB32, width, height, stride |
137 |
|
#else |
138 |
this->blueHatchedPatternARGB->get_pixels(), Cairo::FORMAT_ARGB32, width, height, stride |
this->blueHatchedPatternARGB->get_pixels(), Cairo::FORMAT_ARGB32, width, height, stride |
139 |
|
#endif |
140 |
); |
); |
141 |
this->blueHatchedSurfacePattern = Cairo::SurfacePattern::create(imageSurface); |
this->blueHatchedSurfacePattern = Cairo::SurfacePattern::create(imageSurface); |
142 |
|
#if HAS_CAIROMM_CPP11_ENUMS |
143 |
|
this->blueHatchedSurfacePattern->set_extend(Cairo::Pattern::Extend::REPEAT); |
144 |
|
#else |
145 |
this->blueHatchedSurfacePattern->set_extend(Cairo::EXTEND_REPEAT); |
this->blueHatchedSurfacePattern->set_extend(Cairo::EXTEND_REPEAT); |
146 |
|
#endif |
147 |
} |
} |
148 |
|
|
149 |
instrument = 0; |
instrument = 0; |
177 |
m_VirtKeybPropsBox.show(); |
m_VirtKeybPropsBox.show(); |
178 |
for (int i = 0 ; i < 128 ; i++) key_pressed[i] = false; |
for (int i = 0 ; i < 128 ; i++) key_pressed[i] = false; |
179 |
|
|
180 |
actionGroup = Gtk::ActionGroup::create(); |
actionGroup = ActionGroup::create(); |
181 |
|
#if USE_GLIB_ACTION |
182 |
|
actionGroup->add_action( |
183 |
|
"Properties", sigc::mem_fun(*this, &RegionChooser::show_region_properties) |
184 |
|
); |
185 |
|
actionGroup->add_action( |
186 |
|
"Remove", sigc::mem_fun(*this, &RegionChooser::delete_region) |
187 |
|
); |
188 |
|
actionGroup->add_action( |
189 |
|
"Add", sigc::mem_fun(*this, &RegionChooser::add_region) |
190 |
|
); |
191 |
|
actionGroup->add_action( |
192 |
|
"Dimensions", sigc::mem_fun(*this, &RegionChooser::manage_dimensions) |
193 |
|
); |
194 |
|
insert_action_group("PopupMenuInsideRegion", actionGroup); |
195 |
|
#else |
196 |
actionGroup->add(Gtk::Action::create("Properties", |
actionGroup->add(Gtk::Action::create("Properties", |
197 |
Gtk::Stock::PROPERTIES), |
Gtk::Stock::PROPERTIES), |
198 |
sigc::mem_fun(*this, |
sigc::mem_fun(*this, |
203 |
sigc::mem_fun(*this, &RegionChooser::add_region)); |
sigc::mem_fun(*this, &RegionChooser::add_region)); |
204 |
actionGroup->add(Gtk::Action::create("Dimensions", _("Dimensions...")), |
actionGroup->add(Gtk::Action::create("Dimensions", _("Dimensions...")), |
205 |
sigc::mem_fun(*this, &RegionChooser::manage_dimensions)); |
sigc::mem_fun(*this, &RegionChooser::manage_dimensions)); |
206 |
|
#endif |
207 |
|
|
208 |
|
#if USE_GTKMM_BUILDER |
209 |
|
uiManager = Gtk::Builder::create(); |
210 |
|
Glib::ustring ui_info = |
211 |
|
"<interface>" |
212 |
|
" <menu id='menu-PopupMenuInsideRegion'>" |
213 |
|
" <section>" |
214 |
|
" <item>" |
215 |
|
" <attribute name='label' translatable='yes'>Properties</attribute>" |
216 |
|
" <attribute name='action'>PopupMenuInsideRegion.Properties</attribute>" |
217 |
|
" </item>" |
218 |
|
" <item>" |
219 |
|
" <attribute name='label' translatable='yes'>Dimensions</attribute>" |
220 |
|
" <attribute name='action'>PopupMenuInsideRegion.Dimensions</attribute>" |
221 |
|
" </item>" |
222 |
|
" <item>" |
223 |
|
" <attribute name='label' translatable='yes'>Remove</attribute>" |
224 |
|
" <attribute name='action'>PopupMenuInsideRegion.Remove</attribute>" |
225 |
|
" </item>" |
226 |
|
" </section>" |
227 |
|
" </menu>" |
228 |
|
" <menu id='menu-PopupMenuOutsideRegion'>" |
229 |
|
" <section>" |
230 |
|
" <item>" |
231 |
|
" <attribute name='label' translatable='yes'>Add</attribute>" |
232 |
|
" <attribute name='action'>PopupMenuInsideRegion.Add</attribute>" |
233 |
|
" </item>" |
234 |
|
" </section>" |
235 |
|
" </menu>" |
236 |
|
"</interface>"; |
237 |
|
uiManager->add_from_string(ui_info); |
238 |
|
|
239 |
|
popup_menu_inside_region = new Gtk::Menu( |
240 |
|
Glib::RefPtr<Gio::Menu>::cast_dynamic( |
241 |
|
uiManager->get_object("menu-PopupMenuInsideRegion") |
242 |
|
) |
243 |
|
); |
244 |
|
popup_menu_outside_region = new Gtk::Menu( |
245 |
|
Glib::RefPtr<Gio::Menu>::cast_dynamic( |
246 |
|
uiManager->get_object("menu-PopupMenuOutsideRegion") |
247 |
|
) |
248 |
|
); |
249 |
|
#else |
250 |
uiManager = Gtk::UIManager::create(); |
uiManager = Gtk::UIManager::create(); |
251 |
uiManager->insert_action_group(actionGroup); |
uiManager->insert_action_group(actionGroup); |
252 |
Glib::ustring ui_info = |
Glib::ustring ui_info = |
267 |
popup_menu_outside_region = dynamic_cast<Gtk::Menu*>( |
popup_menu_outside_region = dynamic_cast<Gtk::Menu*>( |
268 |
uiManager->get_widget("/PopupMenuOutsideRegion")); |
uiManager->get_widget("/PopupMenuOutsideRegion")); |
269 |
|
|
270 |
|
#endif // USE_GTKMM_BUILDER |
271 |
|
|
272 |
|
#if GTKMM_MAJOR_VERSION > 3 || (GTKMM_MAJOR_VERSION == 3 && GTKMM_MINOR_VERSION > 22) |
273 |
|
# warning GTKMM4 event registration code missing for regionchooser! |
274 |
|
//add_events(Gdk::EventMask::BUTTON_PRESS_MASK); |
275 |
|
#else |
276 |
add_events(Gdk::BUTTON_PRESS_MASK | Gdk::BUTTON_RELEASE_MASK | |
add_events(Gdk::BUTTON_PRESS_MASK | Gdk::BUTTON_RELEASE_MASK | |
277 |
Gdk::POINTER_MOTION_MASK | Gdk::POINTER_MOTION_HINT_MASK); |
Gdk::POINTER_MOTION_MASK | Gdk::POINTER_MOTION_HINT_MASK); |
278 |
|
#endif |
279 |
|
|
280 |
dimensionManager.region_to_be_changed_signal.connect( |
dimensionManager.region_to_be_changed_signal.connect( |
281 |
region_to_be_changed_signal.make_slot() |
region_to_be_changed_signal.make_slot() |
354 |
#if (GTKMM_MAJOR_VERSION == 2 && GTKMM_MINOR_VERSION < 90) || GTKMM_MAJOR_VERSION < 2 |
#if (GTKMM_MAJOR_VERSION == 2 && GTKMM_MINOR_VERSION < 90) || GTKMM_MAJOR_VERSION < 2 |
355 |
const Gdk::Color bg = get_style()->get_bg(Gtk::STATE_NORMAL); |
const Gdk::Color bg = get_style()->get_bg(Gtk::STATE_NORMAL); |
356 |
#else |
#else |
357 |
|
#if GTKMM_MAJOR_VERSION > 3 || (GTKMM_MAJOR_VERSION == 3 && GTKMM_MINOR_VERSION > 22) |
358 |
|
GdkRGBA gdkBgRGBA; |
359 |
|
gtk_style_context_get_background_color(get_style_context()->gobj(), &gdkBgRGBA); |
360 |
|
const Gdk::RGBA bg = Glib::wrap(&gdkBgRGBA, true); |
361 |
|
# else |
362 |
const Gdk::RGBA bg = get_style_context()->get_background_color(); |
const Gdk::RGBA bg = get_style_context()->get_background_color(); |
363 |
|
# endif |
364 |
#endif |
#endif |
365 |
Gdk::Cairo::set_source_rgba(cr, bg); |
Gdk::Cairo::set_source_rgba(cr, bg); |
366 |
cr->paint(); |
cr->paint(); |
659 |
#if (GTKMM_MAJOR_VERSION == 2 && GTKMM_MINOR_VERSION < 90) || GTKMM_MAJOR_VERSION < 2 |
#if (GTKMM_MAJOR_VERSION == 2 && GTKMM_MINOR_VERSION < 90) || GTKMM_MAJOR_VERSION < 2 |
660 |
get_window()->pointer_ungrab(event->time); |
get_window()->pointer_ungrab(event->time); |
661 |
#else |
#else |
662 |
|
# if GTKMM_MAJOR_VERSION < 3 || (GTKMM_MAJOR_VERSION == 3 && GTKMM_MINOR_VERSION < 20) |
663 |
Glib::wrap(event->device, true)->ungrab(event->time); |
Glib::wrap(event->device, true)->ungrab(event->time); |
664 |
|
# else |
665 |
|
gdk_device_ungrab(Glib::wrap(event->device, true)->gobj(), event->time); |
666 |
|
# endif |
667 |
#endif |
#endif |
668 |
resize.active = false; |
resize.active = false; |
669 |
|
|
675 |
#if (GTKMM_MAJOR_VERSION == 2 && GTKMM_MINOR_VERSION < 90) || GTKMM_MAJOR_VERSION < 2 |
#if (GTKMM_MAJOR_VERSION == 2 && GTKMM_MINOR_VERSION < 90) || GTKMM_MAJOR_VERSION < 2 |
676 |
get_window()->pointer_ungrab(event->time); |
get_window()->pointer_ungrab(event->time); |
677 |
#else |
#else |
678 |
|
# if GTKMM_MAJOR_VERSION < 3 || (GTKMM_MAJOR_VERSION == 3 && GTKMM_MINOR_VERSION < 20) |
679 |
Glib::wrap(event->device, true)->ungrab(event->time); |
Glib::wrap(event->device, true)->ungrab(event->time); |
680 |
|
# else |
681 |
|
gdk_device_ungrab(Glib::wrap(event->device, true)->gobj(), event->time); |
682 |
|
# endif |
683 |
#endif |
#endif |
684 |
move.active = false; |
move.active = false; |
685 |
|
|
687 |
#if (GTKMM_MAJOR_VERSION == 2 && GTKMM_MINOR_VERSION < 90) || GTKMM_MAJOR_VERSION < 2 |
#if (GTKMM_MAJOR_VERSION == 2 && GTKMM_MINOR_VERSION < 90) || GTKMM_MAJOR_VERSION < 2 |
688 |
get_window()->set_cursor(Gdk::Cursor(Gdk::SB_H_DOUBLE_ARROW)); |
get_window()->set_cursor(Gdk::Cursor(Gdk::SB_H_DOUBLE_ARROW)); |
689 |
#else |
#else |
690 |
get_window()->set_cursor(Gdk::Cursor::create(Gdk::SB_H_DOUBLE_ARROW)); |
get_window()->set_cursor( |
691 |
|
# if GTKMM_MAJOR_VERSION < 3 || (GTKMM_MAJOR_VERSION == 3 && GTKMM_MINOR_VERSION < 20) |
692 |
|
Gdk::Cursor::create(Gdk::SB_H_DOUBLE_ARROW) |
693 |
|
# else |
694 |
|
Gdk::Cursor::create( |
695 |
|
Glib::wrap(event->device, true)->get_seat()->get_display(), |
696 |
|
Gdk::SB_H_DOUBLE_ARROW |
697 |
|
) |
698 |
|
# endif |
699 |
|
); |
700 |
#endif |
#endif |
701 |
cursor_is_resize = true; |
cursor_is_resize = true; |
702 |
} |
} |
792 |
Gdk::Cursor(Gdk::SB_H_DOUBLE_ARROW), |
Gdk::Cursor(Gdk::SB_H_DOUBLE_ARROW), |
793 |
event->time); |
event->time); |
794 |
#else |
#else |
795 |
|
# if GTKMM_MAJOR_VERSION < 3 || (GTKMM_MAJOR_VERSION == 3 && GTKMM_MINOR_VERSION < 20) |
796 |
Glib::wrap(event->device, true)->grab(get_window(), |
Glib::wrap(event->device, true)->grab(get_window(), |
797 |
Gdk::OWNERSHIP_NONE, |
Gdk::OWNERSHIP_NONE, |
798 |
false, |
false, |
801 |
Gdk::POINTER_MOTION_HINT_MASK, |
Gdk::POINTER_MOTION_HINT_MASK, |
802 |
Gdk::Cursor::create(Gdk::SB_H_DOUBLE_ARROW), |
Gdk::Cursor::create(Gdk::SB_H_DOUBLE_ARROW), |
803 |
event->time); |
event->time); |
804 |
|
# else |
805 |
|
gdk_device_grab( |
806 |
|
Glib::wrap(event->device, true)->gobj(), |
807 |
|
get_window()->gobj(), |
808 |
|
GDK_OWNERSHIP_NONE, |
809 |
|
false, |
810 |
|
GdkEventMask(GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK | |
811 |
|
GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON1_MOTION_MASK), |
812 |
|
Gdk::Cursor::create( |
813 |
|
Glib::wrap(event->device, true)->get_seat()->get_display(), |
814 |
|
Gdk::SB_H_DOUBLE_ARROW |
815 |
|
)->gobj(), |
816 |
|
event->time |
817 |
|
); |
818 |
|
# endif |
819 |
#endif |
#endif |
820 |
resize.active = true; |
resize.active = true; |
821 |
} else { |
} else { |
834 |
Gdk::Cursor(Gdk::FLEUR), |
Gdk::Cursor(Gdk::FLEUR), |
835 |
event->time); |
event->time); |
836 |
#else |
#else |
837 |
Glib::wrap(event->device, true)->grab(get_window(), |
# if GTKMM_MAJOR_VERSION < 3 || (GTKMM_MAJOR_VERSION == 3 && GTKMM_MINOR_VERSION < 20) |
838 |
Gdk::OWNERSHIP_NONE, |
Glib::wrap(event->device, true)->grab(get_window(), |
839 |
false, |
Gdk::OWNERSHIP_NONE, |
840 |
Gdk::BUTTON_RELEASE_MASK | |
false, |
841 |
Gdk::POINTER_MOTION_MASK | |
Gdk::BUTTON_RELEASE_MASK | |
842 |
Gdk::POINTER_MOTION_HINT_MASK, |
Gdk::POINTER_MOTION_MASK | |
843 |
Gdk::Cursor::create(Gdk::FLEUR), |
Gdk::POINTER_MOTION_HINT_MASK, |
844 |
event->time); |
Gdk::Cursor::create(Gdk::FLEUR), |
845 |
|
event->time); |
846 |
|
# else |
847 |
|
gdk_device_grab( |
848 |
|
Glib::wrap(event->device, true)->gobj(), |
849 |
|
get_window()->gobj(), |
850 |
|
GDK_OWNERSHIP_NONE, |
851 |
|
false, |
852 |
|
GdkEventMask(GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK | |
853 |
|
GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON1_MOTION_MASK), |
854 |
|
Gdk::Cursor::create( |
855 |
|
Glib::wrap(event->device, true)->get_seat()->get_display(), |
856 |
|
Gdk::FLEUR |
857 |
|
)->gobj(), |
858 |
|
event->time |
859 |
|
); |
860 |
|
# endif |
861 |
#endif |
#endif |
862 |
move.active = true; |
move.active = true; |
863 |
move.offset = event->x - key_to_x(region->KeyRange.low, w); |
move.offset = event->x - key_to_x(region->KeyRange.low, w); |
1075 |
{ |
{ |
1076 |
Glib::RefPtr<Gdk::Window> window = get_window(); |
Glib::RefPtr<Gdk::Window> window = get_window(); |
1077 |
int x, y; |
int x, y; |
1078 |
|
#if HAS_GDKMM_SEAT |
1079 |
|
x = event->x; |
1080 |
|
y = event->y; |
1081 |
|
Gdk::ModifierType state = Gdk::ModifierType(event->state); |
1082 |
|
#else |
1083 |
Gdk::ModifierType state = Gdk::ModifierType(0); |
Gdk::ModifierType state = Gdk::ModifierType(0); |
1084 |
window->get_pointer(x, y, state); |
window->get_pointer(x, y, state); |
1085 |
|
#endif |
1086 |
|
|
1087 |
// handle virtual MIDI keyboard |
// handle virtual MIDI keyboard |
1088 |
if (m_VirtKeybModeChoice.get_value() != VIRT_KEYBOARD_MODE_CHORD && |
if (m_VirtKeybModeChoice.get_value() != VIRT_KEYBOARD_MODE_CHORD && |
1113 |
#if (GTKMM_MAJOR_VERSION == 2 && GTKMM_MINOR_VERSION < 90) || GTKMM_MAJOR_VERSION < 2 |
#if (GTKMM_MAJOR_VERSION == 2 && GTKMM_MINOR_VERSION < 90) || GTKMM_MAJOR_VERSION < 2 |
1114 |
window->set_cursor(Gdk::Cursor(Gdk::SB_H_DOUBLE_ARROW)); |
window->set_cursor(Gdk::Cursor(Gdk::SB_H_DOUBLE_ARROW)); |
1115 |
#else |
#else |
1116 |
window->set_cursor(Gdk::Cursor::create(Gdk::SB_H_DOUBLE_ARROW)); |
window->set_cursor( |
1117 |
|
# if GTKMM_MAJOR_VERSION < 3 || (GTKMM_MAJOR_VERSION == 3 && GTKMM_MINOR_VERSION < 20) |
1118 |
|
Gdk::Cursor::create(Gdk::SB_H_DOUBLE_ARROW) |
1119 |
|
# else |
1120 |
|
Gdk::Cursor::create( |
1121 |
|
Glib::wrap(event->device, true)->get_seat()->get_display(), |
1122 |
|
Gdk::SB_H_DOUBLE_ARROW |
1123 |
|
) |
1124 |
|
# endif |
1125 |
|
); |
1126 |
#endif |
#endif |
1127 |
cursor_is_resize = true; |
cursor_is_resize = true; |
1128 |
} |
} |
1202 |
// add "Keygroup" checkbox |
// add "Keygroup" checkbox |
1203 |
Gtk::CheckButton checkBoxKeygroup(_("Member of a Keygroup (Exclusive Group)")); |
Gtk::CheckButton checkBoxKeygroup(_("Member of a Keygroup (Exclusive Group)")); |
1204 |
checkBoxKeygroup.set_active(region->KeyGroup); |
checkBoxKeygroup.set_active(region->KeyGroup); |
1205 |
|
#if USE_GTKMM_BOX |
1206 |
|
dialog.get_content_area()->pack_start(checkBoxKeygroup); |
1207 |
|
#else |
1208 |
dialog.get_vbox()->pack_start(checkBoxKeygroup); |
dialog.get_vbox()->pack_start(checkBoxKeygroup); |
1209 |
|
#endif |
1210 |
checkBoxKeygroup.show(); |
checkBoxKeygroup.show(); |
1211 |
// add "Keygroup" spinbox |
// add "Keygroup" spinbox |
1212 |
#if (GTKMM_MAJOR_VERSION == 2 && GTKMM_MINOR_VERSION < 90) || GTKMM_MAJOR_VERSION < 2 |
#if (GTKMM_MAJOR_VERSION == 2 && GTKMM_MINOR_VERSION < 90) || GTKMM_MAJOR_VERSION < 2 |
1216 |
Gtk::SpinButton spinBox(Gtk::Adjustment::create(1, 1, 999)); |
Gtk::SpinButton spinBox(Gtk::Adjustment::create(1, 1, 999)); |
1217 |
#endif |
#endif |
1218 |
if (region->KeyGroup) spinBox.set_value(region->KeyGroup); |
if (region->KeyGroup) spinBox.set_value(region->KeyGroup); |
1219 |
|
#if USE_GTKMM_BOX |
1220 |
|
dialog.get_content_area()->pack_start(spinBox); |
1221 |
|
#else |
1222 |
dialog.get_vbox()->pack_start(spinBox); |
dialog.get_vbox()->pack_start(spinBox); |
1223 |
|
#endif |
1224 |
spinBox.show(); |
spinBox.show(); |
1225 |
// add OK and CANCEL buttons to the dialog |
// add OK and CANCEL buttons to the dialog |
1226 |
|
#if HAS_GTKMM_STOCK |
1227 |
dialog.add_button(Gtk::Stock::OK, 0); |
dialog.add_button(Gtk::Stock::OK, 0); |
1228 |
dialog.add_button(Gtk::Stock::CANCEL, 1); |
dialog.add_button(Gtk::Stock::CANCEL, 1); |
1229 |
|
#else |
1230 |
|
dialog.add_button(_("_OK"), 0); |
1231 |
|
dialog.add_button(_("_Cancel"), 1); |
1232 |
|
#endif |
1233 |
dialog.set_position(Gtk::WIN_POS_MOUSE); |
dialog.set_position(Gtk::WIN_POS_MOUSE); |
1234 |
|
#if HAS_GTKMM_SHOW_ALL_CHILDREN |
1235 |
dialog.show_all_children(); |
dialog.show_all_children(); |
1236 |
|
#endif |
1237 |
if (!dialog.run()) { // OK selected ... |
if (!dialog.run()) { // OK selected ... |
1238 |
region->KeyGroup = |
region->KeyGroup = |
1239 |
(checkBoxKeygroup.get_active()) ? spinBox.get_value_as_int() : 0; |
(checkBoxKeygroup.get_active()) ? spinBox.get_value_as_int() : 0; |