24 #include <gtk/gtkpaned.h>
27 #include <gtkmm/widget.h>
28 #include <gtkmm/button.h>
29 #include <gtkmm/window.h>
30 #include <gtkmm/paned.h>
31 #include <gtkmm/label.h>
32 #include <gtkmm/comboboxtext.h>
33 #include <gtkmm/tooltip.h>
55 Pango::Rectangle ink_rect = layout->get_ink_extents ();
57 width = (ink_rect.get_width() + PANGO_SCALE / 2) / PANGO_SCALE;
58 height = (ink_rect.get_height() + PANGO_SCALE / 2) / PANGO_SCALE;
66 layout->get_pixel_size (width, height);
71 gint hpadding, gint vpadding)
77 w.set_size_request(width + hpadding, height + vpadding);
88 static const gchar* vtext =
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
98 w.set_size_request(hwidth + hpadding, vheight + vpadding);
104 static const gchar* vtext =
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
111 w.set_size_request(-1, height + vpadding);
116 gint hpadding, gint vpadding)
122 w.set_size_request(width + hpadding, height + vpadding);
127 const std::vector<std::string>& strings,
128 gint hpadding, gint vpadding)
135 const vector<string>* to_use;
136 vector<string>::const_iterator i;
138 for (i = strings.begin(); i != strings.end(); ++i) {
139 if ((*i).find_first_of (
"gy") != string::npos) {
145 if (i == strings.end()) {
148 copy.push_back (
"g");
154 for (vector<string>::const_iterator i = to_use->begin(); i != to_use->end(); ++i) {
156 width_max = max(width_max,width);
157 height_max = max(height_max, height);
160 w.set_size_request(width_max + hpadding, height_max + vpadding);
168 const std::vector<std::string>& strings,
169 const std::string& hpadding,
176 for (vector<string>::const_iterator i = strings.begin(); i != strings.end(); ++i) {
179 width_max = max(width_max,width);
180 height_max = max(height_max, height);
185 get_pixel_size (w.create_pango_layout (hpadding), pad_width, pad_height);
187 w.set_size_request(width_max + pad_width, height_max + vpadding);
203 return alpha ? ((guint (src) << 8) - src) / alpha : 0;
212 guint8
const* src_pixel = src;
213 guint8* dst_pixel = dst;
224 for (
int y = 0; y < height; y++) {
225 for (
int x = 0; x < width; x++) {
226 #if G_BYTE_ORDER == G_LITTLE_ENDIAN
237 dst_pixel[3] = src_pixel[3];
239 #elif G_BYTE_ORDER == G_BIG_ENDIAN
250 dst_pixel[3] = src_pixel[0];
253 #error ardour does not currently support PDP-endianess
262 Glib::RefPtr<Gdk::Pixbuf>
265 static Glib::RefPtr<Gdk::Pixbuf>* empty_pixbuf = 0;
268 if (empty_pixbuf == 0) {
269 empty_pixbuf =
new Glib::RefPtr<Gdk::Pixbuf>;
270 *empty_pixbuf = Gdk::Pixbuf::create(Gdk::COLORSPACE_RGB,
true, 8, clip_width, clip_height);
272 return *empty_pixbuf;
275 Glib::RefPtr<Gdk::Pixbuf> buf = Gdk::Pixbuf::create(Gdk::COLORSPACE_RGB,
true, 8, clip_width, clip_height);
277 cairo_surface_t* surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, clip_width, clip_height);
278 cairo_t* cr = cairo_create (surface);
279 cairo_text_extents_t te;
281 cairo_set_source_rgba (cr, fg.get_red_p(), fg.get_green_p(), fg.get_blue_p(), 1.0);
282 cairo_select_font_face (cr, font.get_family().c_str(),
283 CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL);
284 cairo_set_font_size (cr, font.get_size() / Pango::SCALE);
285 cairo_text_extents (cr, name.c_str(), &te);
287 cairo_move_to (cr, 0.5,
int (0.5 - te.height / 2 - te.y_bearing + clip_height / 2));
288 cairo_show_text (cr, name.c_str());
290 convert_bgra_to_rgba(cairo_image_surface_get_data (surface), buf->get_pixels(), clip_width, clip_height);
293 cairo_surface_destroy(surface);
301 vector<string>::const_iterator i;
305 for (i = strings.begin(); i != strings.end(); ++i) {
314 Glib::RefPtr<const Gtk::TreeModel> m = cr.get_model();
318 for(Gtk::TreeModel::iterator i = m->children().begin(); i != m->children().end(); ++i) {
320 (*i)->get_value(0, txt);
321 strings.push_back (txt);
328 std::vector<std::string> s;
330 return (std::find (s.begin(), s.end(), text) != s.end());
337 cr.set_active_text (text);
346 return GTK_PANED(paned.gobj())->handle;
352 win->get_window()->set_decorations (decor);
357 gtk_tree_view_column_set_widget( c->gobj(), GTK_WIDGET(0) );
368 if (menu.get_attach_widget()) {
391 if (mod & GDK_META_MASK) {
392 mod = GdkModifierType (mod & ~GDK_MOD2_MASK);
401 int fakekey = GDK_VoidSymbol;
405 case GDK_ISO_Left_Tab:
410 fakekey = GDK_uparrow;
414 fakekey = GDK_downarrow;
418 fakekey = GDK_rightarrow;
422 fakekey = GDK_leftarrow;
426 fakekey = GDK_3270_Enter;
437 if (fakekey != GDK_VoidSymbol) {
483 GdkScreen* scr = gdk_screen_get_default();
487 gint monitor = gdk_screen_get_monitor_at_window (scr, win->gobj());
488 gdk_screen_get_monitor_geometry (scr, monitor, &r);
491 return gdk_screen_get_height (scr);
498 GdkScreen* scr = gdk_screen_get_default();
502 gint monitor = gdk_screen_get_monitor_at_window (scr, win->gobj());
503 gdk_screen_get_monitor_geometry (scr, monitor, &r);
506 return gdk_screen_get_width (scr);
513 list<Gtk::Widget*> children = c.get_children();
514 for (list<Gtk::Widget*>::iterator child = children.begin(); child != children.end(); ++child) {
565 double degrees = M_PI / 180.0;
567 cairo_new_sub_path (cr);
568 cairo_arc (cr, x + w - r, y + r, r, -90 * degrees, 0 * degrees);
569 cairo_arc (cr, x + w - r, y + h - r, r, 0 * degrees, 90 * degrees);
570 cairo_arc (cr, x + r, y + h - r, r, 90 * degrees, 180 * degrees);
571 cairo_arc (cr, x + r, y + r, r, 180 * degrees, 270 * degrees);
572 cairo_close_path (cr);
578 double degrees = M_PI / 180.0;
580 cairo_new_sub_path (cr);
581 cairo_line_to (cr, x+w, y);
582 cairo_line_to (cr, x+w, y + h);
583 cairo_arc (cr, x + r, y + h - r, r, 90 * degrees, 180 * degrees);
584 cairo_arc (cr, x + r, y + r, r, 180 * degrees, 270 * degrees);
585 cairo_close_path (cr);
591 double degrees = M_PI / 180.0;
593 cairo_new_sub_path (cr);
594 cairo_arc (cr, x + w - r, y + r, r, -90 * degrees, 0 * degrees);
595 cairo_arc (cr, x + w - r, y + h - r, r, 0 * degrees, 90 * degrees);
596 cairo_line_to (cr, x, y + h);
597 cairo_line_to (cr, x, y);
598 cairo_close_path (cr);
604 double degrees = M_PI / 180.0;
606 cairo_new_sub_path (cr);
607 cairo_move_to (cr, x+w, y+h);
608 cairo_line_to (cr, x, y+h);
609 cairo_arc (cr, x + r, y + r, r, 180 * degrees, 270 * degrees);
610 cairo_arc (cr, x + w - r, y + r, r, -90 * degrees, 0 * degrees);
611 cairo_close_path (cr);
617 double degrees = M_PI / 180.0;
619 cairo_new_sub_path (cr);
620 cairo_move_to (cr, x, y);
621 cairo_line_to (cr, x+w, y);
622 cairo_arc (cr, x + w - r, y + h - r, r, 0 * degrees, 90 * degrees);
623 cairo_arc (cr, x + r, y + h - r, r, 90 * degrees, 180 * degrees);
624 cairo_close_path (cr);
631 double degrees = M_PI / 180.0;
633 cairo_new_sub_path (cr);
634 cairo_move_to (cr, x+w, y+h);
635 cairo_line_to (cr, x, y+h);
636 cairo_arc (cr, x + r, y + r, r, 180 * degrees, 270 * degrees);
637 cairo_arc (cr, x + w - r, y + r, r, -90 * degrees, 0 * degrees);
638 cairo_close_path (cr);
650 cairo_move_to (cr, x+r,y);
651 cairo_line_to (cr, x+w,y);
652 cairo_line_to (cr, x+w,y+h);
653 cairo_line_to (cr, x,y+h);
654 cairo_line_to (cr, x,y+r);
655 cairo_curve_to (cr, x,y,x,y,x+r,y);
667 cairo_move_to (cr, x,y);
668 cairo_line_to (cr, x+w-r,y);
669 cairo_curve_to (cr, x+w,y,x+w,y,x+w,y+r);
670 cairo_line_to (cr, x+w,y+h);
671 cairo_line_to (cr, x,y+h);
672 cairo_line_to (cr, x,y);
675 Glib::RefPtr<Gdk::Window>
678 if (w.get_has_window()) {
679 return w.get_window();
682 (*parent) = w.get_parent();
685 if ((*parent)->get_has_window()) {
686 return (*parent)->get_window ();
688 (*parent) = (*parent)->get_parent ();
691 return Glib::RefPtr<Gdk::Window> ();
698 Glib::RefPtr<Pango::Layout> layout = foo.create_pango_layout (
"");
700 layout->set_font_description (font);
701 layout->set_text (str);
716 Glib::RefPtr<Pango::Layout> layout = foo.create_pango_layout (str);
717 Glib::RefPtr<const Pango::LayoutLine> line;
719 layout->set_font_description (font);
720 layout->set_width (pixel_width * PANGO_SCALE);
723 layout->set_ellipsize (Pango::ELLIPSIZE_END);
725 layout->set_wrap (Pango::WRAP_CHAR);
728 line = layout->get_line (0);
734 string s = string (layout->get_text ().substr(line->get_start_index(), line->get_length()));
736 cerr <<
"fit to pixels of " << str <<
" returns " << s << endl;
749 std::pair<std::string, double>
754 bool abbreviated =
false;
758 cairo_text_extents_t ext;
759 cairo_text_extents (cr, name.c_str(), &ext);
761 if (ext.width < avail || name.length() <= 4) {
767 name = name.substr (0, name.length() - 4) +
"...";
769 name = name.substr (0, name.length() - 3) +
"...";
774 return std::make_pair (name, width);
780 Gtk::Label* l =
new Gtk::Label (t);
781 l->set_alignment (0, 0.5);
788 t->set_tip_area (Gdk::Rectangle (0, 0, 0, 0));
799 w.property_has_tooltip() =
true;
806 gtk_rc_parse_string (
"gtk-enable-tooltips = 1");
812 gtk_rc_parse_string (
"gtk-enable-tooltips = 0");
820 if (!gdk_event_get_root_coords (ev, &evx, &evy)) {
826 gint width, height, depth;
829 Glib::RefPtr<Gdk::Window> widget_window = widget.get_window();
831 widget_window->get_geometry (x, y, width, height, depth);
832 widget_window->get_root_origin (wx, wy);
834 if ((evx >= wx && evx < wx + width) &&
835 (evy >= wy && evy < wy + height)) {
845 switch (event_type) {
854 case GDK_MOTION_NOTIFY:
855 return "motion_notify";
856 case GDK_BUTTON_PRESS:
857 return "button_press";
858 case GDK_2BUTTON_PRESS:
859 return "2button_press";
860 case GDK_3BUTTON_PRESS:
861 return "3button_press";
862 case GDK_BUTTON_RELEASE:
863 return "button_release";
866 case GDK_KEY_RELEASE:
867 return "key_release";
868 case GDK_ENTER_NOTIFY:
869 return "enter_notify";
870 case GDK_LEAVE_NOTIFY:
871 return "leave_notify";
872 case GDK_FOCUS_CHANGE:
873 return "focus_change";
880 case GDK_PROPERTY_NOTIFY:
881 return "property_notify";
882 case GDK_SELECTION_CLEAR:
883 return "selection_clear";
884 case GDK_SELECTION_REQUEST:
885 return "selection_request";
886 case GDK_SELECTION_NOTIFY:
887 return "selection_notify";
888 case GDK_PROXIMITY_IN:
889 return "proximity_in";
890 case GDK_PROXIMITY_OUT:
891 return "proximity_out";
896 case GDK_DRAG_MOTION:
897 return "drag_motion";
898 case GDK_DRAG_STATUS:
899 return "drag_status";
902 case GDK_DROP_FINISHED:
903 return "drop_finished";
904 case GDK_CLIENT_EVENT:
905 return "client_event";
906 case GDK_VISIBILITY_NOTIFY:
907 return "visibility_notify";
912 case GDK_WINDOW_STATE:
913 return "window_state";
916 case GDK_OWNER_CHANGE:
917 return "owner_change";
918 case GDK_GRAB_BROKEN:
919 return "grab_broken";
static guint8 demultiply_alpha(guint8 src, guint8 alpha)
LIBGTKMM2EXT_API void get_pixel_size(Glib::RefPtr< Pango::Layout >, int &width, int &height)
LIBGTKMM2EXT_API bool event_inside_widget_window(Gtk::Widget &widget, GdkEvent *ev)
LIBGTKMM2EXT_API void set_size_request_to_display_given_text(Gtk::Widget &w, const gchar *text, gint hpadding, gint vpadding)
LIBGTKMM2EXT_API bool possibly_translate_mod_to_make_legal_accelerator(GdkModifierType &mod)
static bool make_null_tooltip(int, int, bool, const Glib::RefPtr< Gtk::Tooltip > &t)
#define bind_textdomain_codeset(Domainname, Codeset)
LIBGTKMM2EXT_API int physical_screen_width(Glib::RefPtr< Gdk::Window >)
LIBGTKMM2EXT_API void rounded_left_half_rectangle(Cairo::RefPtr< Cairo::Context >, double x, double y, double w, double h, double r=10)
LIBGTKMM2EXT_API bool set_active_text_if_present(Gtk::ComboBoxText &, const std::string)
LIBGTKMM2EXT_API int physical_screen_height(Glib::RefPtr< Gdk::Window >)
LIBGTKMM2EXT_API void rounded_bottom_half_rectangle(Cairo::RefPtr< Cairo::Context >, double x, double y, double w, double h, double r=10)
LIBGTKMM2EXT_API Glib::RefPtr< Gdk::Window > window_to_draw_on(Gtk::Widget &w, Gtk::Widget **parent)
LIBGTKMM2EXT_API bool contains_value(Gtk::ComboBoxText &, const std::string)
LIBGTKMM2EXT_API void set_popdown_strings(Gtk::ComboBoxText &, const std::vector< std::string > &)
LIBGTKMM2EXT_API void set_size_request_to_display_given_text_width(Gtk::Widget &w, const gchar *htext, gint hpadding, gint vpadding)
LIBGTKMM2EXT_API uint32_t possibly_translate_legal_accelerator_to_real_key(uint32_t keyval)
LIBGTKMM2EXT_API void rounded_top_half_rectangle(Cairo::RefPtr< Cairo::Context >, double x, double y, double w, double h, double r=10)
LIBGTKMM2EXT_API std::string fit_to_pixels(const std::string &, int pixel_width, Pango::FontDescription &font, int &actual_width, bool with_ellipses=false)
LIBGTKMM2EXT_API void set_no_tooltip_whatsoever(Gtk::Widget &)
static const char * localedir
LIBGTKMM2EXT_API void rounded_top_rectangle(Cairo::RefPtr< Cairo::Context > context, double x, double y, double w, double h, double r=10)
LIBGTKMM2EXT_API void disable_tooltips()
LIBGTKMM2EXT_API void set_treeview_header_as_default_label(Gtk::TreeViewColumn *c)
LIBGTKMM2EXT_API Glib::RefPtr< Gdk::Pixbuf > pixbuf_from_string(const std::string &name, const Pango::FontDescription &font, int clip_width, int clip_height, Gdk::Color fg)
LIBGTKMM2EXT_API Gtk::Label * left_aligned_label(std::string const &)
LIBGTKMM2EXT_API GdkWindow * get_paned_handle(Gtk::Paned &paned)
LIBGTKMM2EXT_API void rounded_right_half_rectangle(Cairo::RefPtr< Cairo::Context >, double x, double y, double w, double h, double r=10)
LIBGTKMM2EXT_API void enable_tooltips()
LIBGTKMM2EXT_API bool possibly_translate_keyval_to_make_legal_accelerator(uint32_t &keyval)
#define bindtextdomain(Domainname, Dirname)
LIBGTKMM2EXT_API void convert_bgra_to_rgba(guint8 const *, guint8 *dst, int, int)
LIBGTKMM2EXT_API void get_popdown_strings(Gtk::ComboBoxText &, std::vector< std::string > &)
LIBGTKMM2EXT_API const char * event_type_string(int event_type)
LIBGTKMM2EXT_API void set_decoration(Gtk::Window *win, Gdk::WMDecoration decor)
LIBGTKMM2EXT_API void set_height_request_to_display_any_text(Gtk::Widget &w, gint vpadding)
LIBGTKMM2EXT_API void get_ink_pixel_size(Glib::RefPtr< Pango::Layout >, int &width, int &height)
LIBGTKMM2EXT_API void init(const char *)
LIBGTKMM2EXT_API void rounded_rectangle(Cairo::RefPtr< Cairo::Context > context, double x, double y, double w, double h, double r=10)
LIBGTKMM2EXT_API int pixel_width(const std::string &str, Pango::FontDescription &font)
LIBGTKMM2EXT_API void detach_menu(Gtk::Menu &)
LIBGTKMM2EXT_API void rounded_top_left_rectangle(Cairo::RefPtr< Cairo::Context > context, double x, double y, double w, double h, double r=10)
LIBGTKMM2EXT_API void rounded_top_right_rectangle(Cairo::RefPtr< Cairo::Context > context, double x, double y, double w, double h, double r=10)
LIBGTKMM2EXT_API void container_clear(Gtk::Container &)