13
0
This commit is contained in:
Paul Davis 2013-05-01 13:01:37 -04:00
commit ebb1271b6f
20 changed files with 20 additions and 3424 deletions

View File

@ -1,586 +0,0 @@
/* Image item type for GnomeCanvas widget
*
* GnomeCanvas is basically a port of the Tk toolkit's most excellent canvas widget. Tk is
* copyrighted by the Regents of the University of California, Sun Microsystems, and other parties.
*
* Copyright (C) 1998 The Free Software Foundation
*
* Author: Federico Mena <federico@nuclecu.unam.mx>
*/
#include <string.h> /* for memcpy() */
#include <math.h>
#include <stdio.h>
#include "libart_lgpl/art_misc.h"
#include "libart_lgpl/art_affine.h"
#include "libart_lgpl/art_pixbuf.h"
#include "libart_lgpl/art_rgb_pixbuf_affine.h"
#include "canvas-imageframe.h"
#include <libgnomecanvas/gnome-canvas-util.h>
#include "gettext.h"
#define _(Text) dgettext (PACKAGE,Text)
//GTK2FIX
//#include <libgnomecanvas/gnome-canvastypebuiltins.h>
enum {
PROP_0,
PROP_PIXBUF,
PROP_X,
PROP_Y,
PROP_WIDTH,
PROP_HEIGHT,
PROP_DRAWWIDTH,
PROP_ANCHOR
};
static void gnome_canvas_imageframe_class_init(GnomeCanvasImageFrameClass* class) ;
static void gnome_canvas_imageframe_init(GnomeCanvasImageFrame* image) ;
static void gnome_canvas_imageframe_destroy(GtkObject* object) ;
static void gnome_canvas_imageframe_set_property(GObject* object,
guint prop_id,
const GValue *value,
GParamSpec *pspec);
static void gnome_canvas_imageframe_get_property(GObject* object,
guint prop_id,
GValue *value,
GParamSpec *pspec);
static void gnome_canvas_imageframe_update(GnomeCanvasItem *item, double *affine, ArtSVP *clip_path, int flags) ;
static void gnome_canvas_imageframe_realize(GnomeCanvasItem *item) ;
static void gnome_canvas_imageframe_unrealize(GnomeCanvasItem *item) ;
static void gnome_canvas_imageframe_draw(GnomeCanvasItem *item, GdkDrawable *drawable, int x, int y, int width, int height) ;
static double gnome_canvas_imageframe_point(GnomeCanvasItem *item, double x, double y, int cx, int cy, GnomeCanvasItem **actual_item) ;
static void gnome_canvas_imageframe_bounds(GnomeCanvasItem *item, double *x1, double *y1, double *x2, double *y2) ;
static void gnome_canvas_imageframe_render(GnomeCanvasItem *item, GnomeCanvasBuf *buf) ;
static GnomeCanvasItemClass *parent_class;
GType
gnome_canvas_imageframe_get_type (void)
{
static GType imageframe_type = 0;
if (!imageframe_type) {
GtkTypeInfo imageframe_info = {
"GnomeCanvasImageFrame",
sizeof (GnomeCanvasImageFrame),
sizeof (GnomeCanvasImageFrameClass),
(GtkClassInitFunc) gnome_canvas_imageframe_class_init,
(GtkObjectInitFunc) gnome_canvas_imageframe_init,
NULL, /* reserved_1 */
NULL, /* reserved_2 */
(GtkClassInitFunc) NULL
};
imageframe_type = gtk_type_unique (gnome_canvas_item_get_type (), &imageframe_info);
}
return imageframe_type;
}
static void
gnome_canvas_imageframe_class_init (GnomeCanvasImageFrameClass *class)
{
GObjectClass *gobject_class;
GtkObjectClass *object_class;
GnomeCanvasItemClass *item_class;
gobject_class = (GObjectClass *) class;
object_class = (GtkObjectClass *) class;
item_class = (GnomeCanvasItemClass *) class;
parent_class = gtk_type_class (gnome_canvas_item_get_type ());
gobject_class->set_property = gnome_canvas_imageframe_set_property;
gobject_class->get_property = gnome_canvas_imageframe_get_property;
g_object_class_install_property (gobject_class,
PROP_PIXBUF,
g_param_spec_pointer ("pixbuf",
_("pixbuf"),
_("the pixbuf"),
G_PARAM_WRITABLE));
g_object_class_install_property (gobject_class,
PROP_X,
g_param_spec_double ("x",
_("x"),
_("x coordinate of upper left corner of rect"),
-G_MAXDOUBLE,
G_MAXDOUBLE,
0.0,
G_PARAM_READWRITE));
g_object_class_install_property (gobject_class,
PROP_Y,
g_param_spec_double ("y",
_("y"),
_("y coordinate of upper left corner of rect "),
-G_MAXDOUBLE,
G_MAXDOUBLE,
0.0,
G_PARAM_READWRITE));
g_object_class_install_property (gobject_class,
PROP_WIDTH,
g_param_spec_double ("width",
_("width"),
_("the width"),
-G_MAXDOUBLE,
G_MAXDOUBLE,
0.0,
G_PARAM_READWRITE));
g_object_class_install_property (gobject_class,
PROP_DRAWWIDTH,
g_param_spec_double ("drawwidth",
_("drawwidth"),
_("drawn width"),
-G_MAXDOUBLE,
G_MAXDOUBLE,
0.0,
G_PARAM_READWRITE));
g_object_class_install_property (gobject_class,
PROP_HEIGHT,
g_param_spec_double ("height",
_("height"),
_("the height"),
-G_MAXDOUBLE,
G_MAXDOUBLE,
0.0,
G_PARAM_READWRITE));
g_object_class_install_property (gobject_class,
PROP_ANCHOR,
g_param_spec_enum ("anchor",
_("anchor"),
_("the anchor"),
GTK_TYPE_ANCHOR_TYPE,
GTK_ANCHOR_NW,
G_PARAM_READWRITE));
object_class->destroy = gnome_canvas_imageframe_destroy;
item_class->update = gnome_canvas_imageframe_update;
item_class->realize = gnome_canvas_imageframe_realize;
item_class->unrealize = gnome_canvas_imageframe_unrealize;
item_class->draw = gnome_canvas_imageframe_draw;
item_class->point = gnome_canvas_imageframe_point;
item_class->bounds = gnome_canvas_imageframe_bounds;
item_class->render = gnome_canvas_imageframe_render;
}
static void
gnome_canvas_imageframe_init (GnomeCanvasImageFrame *image)
{
image->x = 0.0;
image->y = 0.0;
image->width = 0.0;
image->height = 0.0;
image->drawwidth = 0.0;
image->anchor = GTK_ANCHOR_CENTER;
}
static void
gnome_canvas_imageframe_destroy (GtkObject *object)
{
GnomeCanvasImageFrame *image;
g_return_if_fail (object != NULL);
g_return_if_fail (GNOME_CANVAS_IS_CANVAS_IMAGEFRAME (object));
image = GNOME_CANVAS_IMAGEFRAME (object);
image->cwidth = 0;
image->cheight = 0;
if (image->pixbuf)
{
art_pixbuf_free (image->pixbuf);
image->pixbuf = NULL;
}
if(GTK_OBJECT_CLASS (parent_class)->destroy)
{
(* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
}
}
/* Get's the image bounds expressed as item-relative coordinates. */
static void
get_bounds_item_relative (GnomeCanvasImageFrame *image, double *px1, double *py1, double *px2, double *py2)
{
GnomeCanvasItem *item;
double x, y;
item = GNOME_CANVAS_ITEM (image);
/* Get item coordinates */
x = image->x;
y = image->y;
/* Anchor image */
switch (image->anchor) {
case GTK_ANCHOR_NW:
case GTK_ANCHOR_W:
case GTK_ANCHOR_SW:
break;
case GTK_ANCHOR_N:
case GTK_ANCHOR_CENTER:
case GTK_ANCHOR_S:
x -= image->width / 2;
break;
case GTK_ANCHOR_NE:
case GTK_ANCHOR_E:
case GTK_ANCHOR_SE:
x -= image->width;
break;
}
switch (image->anchor) {
case GTK_ANCHOR_NW:
case GTK_ANCHOR_N:
case GTK_ANCHOR_NE:
break;
case GTK_ANCHOR_W:
case GTK_ANCHOR_CENTER:
case GTK_ANCHOR_E:
y -= image->height / 2;
break;
case GTK_ANCHOR_SW:
case GTK_ANCHOR_S:
case GTK_ANCHOR_SE:
y -= image->height;
break;
}
/* Bounds */
*px1 = x;
*py1 = y;
*px2 = x + image->width;
*py2 = y + image->height;
}
static void
gnome_canvas_imageframe_set_property (GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
{
GnomeCanvasItem *item;
GnomeCanvasImageFrame *image;
int update;
int calc_bounds;
item = GNOME_CANVAS_ITEM (object);
image = GNOME_CANVAS_IMAGEFRAME (object);
update = FALSE;
calc_bounds = FALSE;
switch (prop_id) {
case PROP_PIXBUF:
if (item->canvas->aa && g_value_get_pointer (value)) {
if (image->pixbuf != NULL)
art_pixbuf_free (image->pixbuf);
image->pixbuf = g_value_get_pointer (value);
}
update = TRUE;
break;
case PROP_X:
image->x = g_value_get_double (value);
update = TRUE;
break;
case PROP_Y:
image->y = g_value_get_double (value);
update = TRUE;
break;
case PROP_WIDTH:
image->width = fabs (g_value_get_double (value));
update = TRUE;
break;
case PROP_HEIGHT:
image->height = fabs (g_value_get_double (value));
update = TRUE;
break;
case PROP_DRAWWIDTH:
image->drawwidth = fabs (g_value_get_double (value));
update = TRUE;
break;
case PROP_ANCHOR:
image->anchor = g_value_get_enum (value);
update = TRUE;
break;
default:
break;
}
if (update)
gnome_canvas_item_request_update (item);
}
static void
gnome_canvas_imageframe_get_property (GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec)
{
GnomeCanvasImageFrame *image;
image = GNOME_CANVAS_IMAGEFRAME (object);
switch (prop_id) {
case PROP_X:
g_value_set_double (value, image->x);
break;
case PROP_Y:
g_value_set_double (value, image->y);
break;
case PROP_WIDTH:
g_value_set_double (value, image->width);
break;
case PROP_HEIGHT:
g_value_set_double (value, image->height);
break;
case PROP_DRAWWIDTH:
g_value_set_double (value, image->drawwidth);
break;
case PROP_ANCHOR:
g_value_set_enum (value, image->anchor);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static void
gnome_canvas_imageframe_update (GnomeCanvasItem *item, double *affine, ArtSVP *clip_path, int flags)
{
GnomeCanvasImageFrame *image;
ArtDRect i_bbox, c_bbox;
int w = 0;
int h = 0;
image = GNOME_CANVAS_IMAGEFRAME (item);
if (parent_class->update)
(* parent_class->update) (item, affine, clip_path, flags);
/* only works for non-rotated, non-skewed transforms */
image->cwidth = (int) (image->width * affine[0] + 0.5);
image->cheight = (int) (image->height * affine[3] + 0.5);
if (image->pixbuf) {
image->need_recalc = TRUE ;
}
get_bounds_item_relative (image, &i_bbox.x0, &i_bbox.y0, &i_bbox.x1, &i_bbox.y1);
art_drect_affine_transform (&c_bbox, &i_bbox, affine);
/* these values only make sense in the non-rotated, non-skewed case */
image->cx = c_bbox.x0;
image->cy = c_bbox.y0;
/* add a fudge factor */
c_bbox.x0--;
c_bbox.y0--;
c_bbox.x1++;
c_bbox.y1++;
gnome_canvas_update_bbox (item, c_bbox.x0, c_bbox.y0, c_bbox.x1, c_bbox.y1);
if (image->pixbuf) {
w = image->pixbuf->width;
h = image->pixbuf->height;
}
image->affine[0] = (affine[0] * image->width) / w;
image->affine[1] = (affine[1] * image->height) / h;
image->affine[2] = (affine[2] * image->width) / w;
image->affine[3] = (affine[3] * image->height) / h;
image->affine[4] = i_bbox.x0 * affine[0] + i_bbox.y0 * affine[2] + affine[4];
image->affine[5] = i_bbox.x0 * affine[1] + i_bbox.y0 * affine[3] + affine[5];
}
static void
gnome_canvas_imageframe_realize (GnomeCanvasItem *item)
{
GnomeCanvasImageFrame *image;
image = GNOME_CANVAS_IMAGEFRAME (item);
if (parent_class->realize)
(* parent_class->realize) (item);
}
static void
gnome_canvas_imageframe_unrealize (GnomeCanvasItem *item)
{
GnomeCanvasImageFrame *image;
image = GNOME_CANVAS_IMAGEFRAME(item);
if (parent_class->unrealize)
(* parent_class->unrealize) (item);
}
static void
recalc_if_needed (GnomeCanvasImageFrame *image)
{}
static void
gnome_canvas_imageframe_draw (GnomeCanvasItem *item, GdkDrawable *drawable,
int x, int y, int width, int height)
{
}
static double
gnome_canvas_imageframe_point (GnomeCanvasItem *item, double x, double y,
int cx, int cy, GnomeCanvasItem **actual_item)
{
GnomeCanvasImageFrame *image;
int x1, y1, x2, y2;
int dx, dy;
image = GNOME_CANVAS_IMAGEFRAME (item);
*actual_item = item;
recalc_if_needed (image);
x1 = image->cx - item->canvas->close_enough;
y1 = image->cy - item->canvas->close_enough;
x2 = image->cx + image->cwidth - 1 + item->canvas->close_enough;
y2 = image->cy + image->cheight - 1 + item->canvas->close_enough;
/* Hard case: is point inside image's gravity region? */
//if ((cx >= x1) && (cy >= y1) && (cx <= x2) && (cy <= y2))
//return dist_to_mask (image, cx, cy) / item->canvas->pixels_per_unit;
/* Point is outside image */
x1 += item->canvas->close_enough;
y1 += item->canvas->close_enough;
x2 -= item->canvas->close_enough;
y2 -= item->canvas->close_enough;
if (cx < x1)
dx = x1 - cx;
else if (cx > x2)
dx = cx - x2;
else
dx = 0;
if (cy < y1)
dy = y1 - cy;
else if (cy > y2)
dy = cy - y2;
else
dy = 0;
return sqrt (dx * dx + dy * dy) / item->canvas->pixels_per_unit;
}
static void
gnome_canvas_imageframe_bounds (GnomeCanvasItem *item, double *x1, double *y1, double *x2, double *y2)
{
GnomeCanvasImageFrame *image;
image = GNOME_CANVAS_IMAGEFRAME (item);
*x1 = image->x;
*y1 = image->y;
switch (image->anchor) {
case GTK_ANCHOR_NW:
case GTK_ANCHOR_W:
case GTK_ANCHOR_SW:
break;
case GTK_ANCHOR_N:
case GTK_ANCHOR_CENTER:
case GTK_ANCHOR_S:
*x1 -= image->width / 2.0;
break;
case GTK_ANCHOR_NE:
case GTK_ANCHOR_E:
case GTK_ANCHOR_SE:
*x1 -= image->width;
break;
}
switch (image->anchor) {
case GTK_ANCHOR_NW:
case GTK_ANCHOR_N:
case GTK_ANCHOR_NE:
break;
case GTK_ANCHOR_W:
case GTK_ANCHOR_CENTER:
case GTK_ANCHOR_E:
*y1 -= image->height / 2.0;
break;
case GTK_ANCHOR_SW:
case GTK_ANCHOR_S:
case GTK_ANCHOR_SE:
*y1 -= image->height;
break;
}
*x2 = *x1 + image->width;
*y2 = *y1 + image->height;
}
static void
gnome_canvas_imageframe_render (GnomeCanvasItem *item, GnomeCanvasBuf *buf)
{
GnomeCanvasImageFrame *image;
image = GNOME_CANVAS_IMAGEFRAME (item);
gnome_canvas_buf_ensure_buf (buf);
#ifdef VERBOSE
{
char str[128];
art_affine_to_string (str, image->affine);
g_print ("gnome_canvas_imageframe_render %s\n", str);
}
#endif
art_rgb_pixbuf_affine (buf->buf,
buf->rect.x0, buf->rect.y0, buf->rect.x1, buf->rect.y1,
buf->buf_rowstride,
image->pixbuf,
image->affine,
ART_FILTER_NEAREST, NULL);
buf->is_bg = 0;
}

View File

@ -1,87 +0,0 @@
/* Image item type for GnomeCanvas widget
*
* GnomeCanvas is basically a port of the Tk toolkit's most excellent canvas widget. Tk is
* copyrighted by the Regents of the University of California, Sun Microsystems, and other parties.
*
* Copyright (C) 1998 The Free Software Foundation
*
* Author: Federico Mena <federico@nuclecu.unam.mx>
*/
#ifndef __GNOME_CANVAS_IMAGEFRAME_H__
#define __GNOME_CANVAS_IMAGEFRAME_H__
#include <stdint.h>
#include <libgnomecanvas/libgnomecanvas.h>
#include <gtk/gtkenums.h>
#ifdef __cplusplus
extern "C" {
#endif
#include <libart_lgpl/art_misc.h>
#ifdef __cplusplus
}
#endif
#include <libart_lgpl/art_pixbuf.h>
G_BEGIN_DECLS
/* Image item for the canvas. Images are positioned by anchoring them to a point.
* The following arguments are available:
*
* name type read/write description
* ------------------------------------------------------------------------------------------
* pixbuf ArtPixBuf* W Pointer to an ArtPixBuf (aa-mode)
* x double RW X coordinate of anchor point
* y double RW Y coordinate of anchor point
* width double RW Width to scale image to, in canvas units
* height double RW Height to scale image to, in canvas units
* drawwidth double RW Width to scale image to, in canvas units
* anchor GtkAnchorType RW Anchor side for the image
*/
#define GNOME_CANVAS_TYPE_CANVAS_IMAGEFRAME (gnome_canvas_imageframe_get_type ())
#define GNOME_CANVAS_IMAGEFRAME(obj) (GTK_CHECK_CAST ((obj), GNOME_CANVAS_TYPE_CANVAS_IMAGEFRAME, GnomeCanvasImageFrame))
#define GNOME_CANVAS_IMAGEFRAME_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), GNOME_CANVAS_TYPE_CANVAS_IMAGEFRAME, GnomeCanvasImageFrameClass))
#define GNOME_CANVAS_IS_CANVAS_IMAGEFRAME(obj) (GTK_CHECK_TYPE ((obj), GNOME_CANVAS_TYPE_CANVAS_IMAGEFRAME))
#define GNOME_CANVAS_IS_CANVAS_IMAGEFRAME_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), GNOME_CANVAS_TYPE_CANVAS_IMAGEFRAME))
typedef struct _GnomeCanvasImageFrame GnomeCanvasImageFrame;
typedef struct _GnomeCanvasImageFrameClass GnomeCanvasImageFrameClass;
struct _GnomeCanvasImageFrame {
GnomeCanvasItem item;
double x, y; /* Position at anchor, item relative */
double width, height; /* Size of image, item relative */
double drawwidth ; /* the amount of the image we draw width-wise (0-drawwidth)*/
GtkAnchorType anchor; /* Anchor side for image */
int cx, cy; /* Top-left canvas coordinates for display */
int cwidth, cheight; /* Rendered size in pixels */
uint32_t need_recalc : 1; /* Do we need to rescale the image? */
ArtPixBuf *pixbuf; /* A pixbuf, for aa rendering */
double affine[6]; /* The item -> canvas affine */
};
struct _GnomeCanvasImageFrameClass {
GnomeCanvasItemClass parent_class;
};
/* Standard Gtk function */
GtkType gnome_canvas_imageframe_get_type (void);
G_END_DECLS
#endif

View File

@ -1,190 +0,0 @@
// Generated by gtkmmproc -- DO NOT MODIFY!
#include "imageframe.h"
#include "imageframe_p.h"
#include <libgnomecanvasmm/private/shape_p.h>
/* rect.c
*
* Copyright (C) 1998 EMC Capital Management Inc.
* Developed by Havoc Pennington <hp@pobox.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
namespace Gnome
{
namespace Canvas
{
ImageFrame::ImageFrame(Group& parentx, ArtPixBuf* pbuf, double x, double y, Gtk::AnchorType anchor, double w, double h)
: Item(GNOME_CANVAS_ITEM(g_object_new(get_type(),0)))
{
item_construct(parentx);
set("pixbuf", pbuf, "x", x,"y", y,"width", w,"height", h, 0);
}
ImageFrame::ImageFrame(Group& parentx)
: Item(GNOME_CANVAS_ITEM(g_object_new(get_type(),0)))
{
item_construct(parentx);
}
} /* namespace Canvas */
} /* namespace Gnome */
namespace
{
} // anonymous namespace
namespace Glib
{
Gnome::Canvas::ImageFrame* wrap(GnomeCanvasImageFrame* object, bool take_copy)
{
return dynamic_cast<Gnome::Canvas::ImageFrame *> (Glib::wrap_auto ((GObject*)(object), take_copy));
}
} /* namespace Glib */
namespace Gnome
{
namespace Canvas
{
/* The *_Class implementation: */
const Glib::Class& ImageFrame_Class::init()
{
if(!gtype_) // create the GType if necessary
{
// Glib::Class has to know the class init function to clone custom types.
class_init_func_ = &ImageFrame_Class::class_init_function;
// This is actually just optimized away, apparently with no harm.
// Make sure that the parent type has been created.
//CppClassParent::CppObjectType::get_type();
// Create the wrapper type, with the same class/instance size as the base type.
register_derived_type(gnome_canvas_imageframe_get_type());
// Add derived versions of interfaces, if the C type implements any interfaces:
}
return *this;
}
void ImageFrame_Class::class_init_function(void* g_class, void* class_data)
{
BaseClassType *const klass = static_cast<BaseClassType*>(g_class);
CppClassParent::class_init_function(klass, class_data);
}
Glib::ObjectBase* ImageFrame_Class::wrap_new(GObject* o)
{
return manage(new ImageFrame((GnomeCanvasImageFrame*)(o)));
}
/* The implementation: */
ImageFrame::ImageFrame(const Glib::ConstructParams& construct_params)
: Item(construct_params)
{
}
ImageFrame::ImageFrame(GnomeCanvasImageFrame* castitem)
: Item ((GnomeCanvasItem*)(castitem))
{
}
ImageFrame::~ImageFrame()
{
destroy_();
}
ImageFrame::CppClassType ImageFrame::rect_class_; // initialize static member
GType ImageFrame::get_type()
{
return rect_class_.init().get_type();
}
GType ImageFrame::get_base_type()
{
return gnome_canvas_imageframe_get_type();
}
Glib::PropertyProxy<double> ImageFrame::property_x()
{
return Glib::PropertyProxy<double> (this, "x");
}
Glib::PropertyProxy_ReadOnly<double> ImageFrame::property_x() const
{
return Glib::PropertyProxy_ReadOnly<double> (this, "x");
}
Glib::PropertyProxy<double> ImageFrame::property_y()
{
return Glib::PropertyProxy<double> (this, "y");
}
Glib::PropertyProxy_ReadOnly<double> ImageFrame::property_y() const
{
return Glib::PropertyProxy_ReadOnly<double> (this, "y");
}
Glib::PropertyProxy<double> ImageFrame::property_width()
{
return Glib::PropertyProxy<double> (this, "width");
}
Glib::PropertyProxy_ReadOnly<double> ImageFrame::property_width() const
{
return Glib::PropertyProxy_ReadOnly<double> (this, "width");
}
Glib::PropertyProxy<double> ImageFrame::property_drawwidth()
{
return Glib::PropertyProxy<double> (this, "drawwidth");
}
Glib::PropertyProxy_ReadOnly<double> ImageFrame::property_drawwidth() const
{
return Glib::PropertyProxy_ReadOnly<double> (this, "drawwidth");
}
Glib::PropertyProxy<double> ImageFrame::property_height()
{
return Glib::PropertyProxy<double> (this, "height");
}
Glib::PropertyProxy_ReadOnly<double> ImageFrame::property_height() const
{
return Glib::PropertyProxy_ReadOnly<double> (this, "height");
}
Glib::PropertyProxy<Gtk::AnchorType> ImageFrame::property_anchor()
{
return Glib::PropertyProxy<Gtk::AnchorType>(this, "anchor");
}
Glib::PropertyProxy_ReadOnly<Gtk::AnchorType> ImageFrame::property_anchor() const
{
return Glib::PropertyProxy_ReadOnly<Gtk::AnchorType>(this, "anchor");
}
} // namespace Canvas
} // namespace Gnome

View File

@ -27,10 +27,23 @@
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/ */
#include <stdint.h>
#include <libgnomecanvasmm/item.h> #include <libgnomecanvasmm/item.h>
#include <libgnomecanvasmm/group.h> #include <libgnomecanvasmm/group.h>
#include <libgnomecanvasmm/shape.h> #include <libgnomecanvasmm/shape.h>
#include "canvas-imageframe.h"
#include <libgnomecanvas/libgnomecanvas.h>
#include <gtk/gtkenums.h>
#ifdef __cplusplus
extern "C" {
#endif
#include <libart_lgpl/art_misc.h>
#ifdef __cplusplus
}
#endif
#include <libart_lgpl/art_pixbuf.h>
#ifndef DOXYGEN_SHOULD_SKIP_THIS #ifndef DOXYGEN_SHOULD_SKIP_THIS

View File

@ -1,158 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<Session version="3001" name="rec_enabled" sample-rate="48000" id-counter="121" event-counter="0">
<Config>
<Option name="xfade-model" value="FullCrossfade"/>
<Option name="xfade-choice" value="ConstantPowerMinus3dB"/>
<Option name="auto-xfade" value="1"/>
<Option name="short-xfade-seconds" value="0.015"/>
<Option name="destructive-xfade-msecs" value="2"/>
<Option name="use-region-fades" value="1"/>
<Option name="show-region-fades" value="1"/>
<Option name="native-file-data-format" value="FormatFloat"/>
<Option name="native-file-header-format" value="WAVE"/>
<Option name="auto-play" value="0"/>
<Option name="auto-return" value="0"/>
<Option name="auto-input" value="1"/>
<Option name="punch-in" value="0"/>
<Option name="punch-out" value="0"/>
<Option name="subframes-per-frame" value="100"/>
<Option name="timecode-format" value="timecode_30"/>
<Option name="raid-path" value=""/>
<Option name="audio-search-path" value=""/>
<Option name="midi-search-path" value=""/>
<Option name="auditioner-output-left" value="default"/>
<Option name="auditioner-output-right" value="default"/>
<Option name="timecode-source-is-synced" value="1"/>
<Option name="jack-time-master" value="1"/>
<Option name="use-video-sync" value="0"/>
<Option name="video-pullup" value="0"/>
<Option name="show-summary" value="1"/>
<Option name="show-group-tabs" value="1"/>
<Option name="external-sync" value="0"/>
<Option name="sync-source" value="JACK"/>
<Option name="insert-merge-policy" value="InsertMergeRelax"/>
<Option name="timecode-offset" value="0"/>
<Option name="timecode-offset-negative" value="1"/>
<Option name="glue-new-markers-to-bars-and-beats" value="0"/>
<Option name="midi-copy-is-fork" value="0"/>
<Option name="glue-new-regions-to-bars-and-beats" value="0"/>
</Config>
<Metadata/>
<Sources/>
<Regions/>
<Locations>
<Location id="86" name="Loop" start="0" end="1" flags="IsAutoLoop,IsHidden" locked="no" position-lock-style="AudioTime"/>
<Location id="87" name="Punch" start="0" end="1" flags="IsAutoPunch,IsHidden" locked="no" position-lock-style="AudioTime"/>
</Locations>
<Bundles/>
<Routes>
<Route id="88" name="Audio 1" default-type="audio" active="yes" phase-invert="0" denormal-protection="no" meter-point="MeterPostFader" order-keys="" self-solo="no" soloed-by-upstream="0" soloed-by-downstream="0" solo-isolated="no" solo-safe="no" monitoring="" saved-meter-point="MeterPostFader" mode="Normal">
<IO name="Audio 1" id="105" direction="Input" default-type="audio" user-latency="0">
<Port type="audio" name="Audio 1/audio_in 1">
<Connection other="system:capture_1"/>
</Port>
</IO>
<IO name="Audio 1" id="106" direction="Output" default-type="audio" user-latency="0">
<Port type="audio" name="Audio 1/audio_out 1">
<Connection other="master/audio_in 1"/>
</Port>
<Port type="audio" name="Audio 1/audio_out 2">
<Connection other="master/audio_in 2"/>
</Port>
</IO>
<Controllable name="solo" id="90" flags="Toggle" value="0.000000000000"/>
<Controllable name="mute" id="92" flags="Toggle" value="0.000000000000"/>
<MuteMaster mute-point="PreFader,PostFader,Listen,Main" muted="no"/>
<Pannable>
<Controllable name="pan-azimuth" id="96" flags="" value="0.500000000000"/>
<Controllable name="pan-width" id="100" flags="" value="0.000000000000"/>
<Controllable name="pan-elevation" id="98" flags="" value="0.000000000000"/>
<Controllable name="pan-frontback" id="102" flags="" value="0.000000000000"/>
<Controllable name="pan-lfe" id="104" flags="" value="0.000000000000"/>
<Automation/>
</Pannable>
<Processor id="107" name="Amp" active="yes" user-latency="0" type="amp">
<Controllable name="gaincontrol" id="109" flags="GainLike" value="1.000000000000"/>
</Processor>
<Processor id="110" name="Meter" active="yes" user-latency="0" type="meter"/>
<Processor id="111" name="Audio 1" active="yes" user-latency="0" own-input="yes" own-output="no" output="Audio 1" type="main-outs" role="Main">
<PannerShell bypassed="no">
<Panner type="Mono to Stereo Panner"/>
</PannerShell>
</Processor>
<Controllable name="recenable" id="113" flags="Toggle" value="0.000000000000"/>
<Diskstream flags="Recordable" playlist="Audio 1.1" name="Audio 1" id="115" speed="1.000000" capture-alignment="Automatic" channels="1"/>
</Route>
<Route id="21" name="master" default-type="audio" flags="MasterOut" active="yes" phase-invert="00" denormal-protection="no" meter-point="MeterPostFader" order-keys="EditorSort=318:MixerSort=318" self-solo="no" soloed-by-upstream="0" soloed-by-downstream="0" solo-isolated="no" solo-safe="no">
<IO name="master" id="38" direction="Input" default-type="audio" user-latency="0">
<Port type="audio" name="master/audio_in 1">
<Connection other="Audio 1/audio_out 1"/>
</Port>
<Port type="audio" name="master/audio_in 2">
<Connection other="Audio 1/audio_out 2"/>
</Port>
</IO>
<IO name="master" id="39" direction="Output" default-type="audio" user-latency="0">
<Port type="audio" name="master/audio_out 1">
<Connection other="system:playback_1"/>
</Port>
<Port type="audio" name="master/audio_out 2">
<Connection other="system:playback_2"/>
</Port>
</IO>
<Controllable name="solo" id="23" flags="Toggle" value="0.000000000000"/>
<Controllable name="mute" id="25" flags="Toggle" value="0.000000000000"/>
<MuteMaster mute-point="PreFader,PostFader,Listen,Main" muted="no"/>
<Pannable>
<Controllable name="pan-azimuth" id="29" flags="" value="0.500000000000"/>
<Controllable name="pan-width" id="33" flags="" value="1.000000000000"/>
<Controllable name="pan-elevation" id="31" flags="" value="0.000000000000"/>
<Controllable name="pan-frontback" id="35" flags="" value="0.000000000000"/>
<Controllable name="pan-lfe" id="37" flags="" value="0.000000000000"/>
<Automation/>
</Pannable>
<Processor id="40" name="Amp" active="yes" user-latency="0" type="amp">
<Controllable name="gaincontrol" id="42" flags="GainLike" value="1.000000000000"/>
</Processor>
<Processor id="43" name="Meter" active="yes" user-latency="0" type="meter"/>
<Processor id="44" name="master" active="yes" user-latency="0" own-input="yes" own-output="no" output="master" type="main-outs" role="Main">
<PannerShell bypassed="no">
<Panner type="Equal Power Stereo"/>
</PannerShell>
</Processor>
</Route>
</Routes>
<Playlists>
<Playlist id="116" name="Audio 1.1" type="audio" orig-track-id="88" frozen="no" combine-ops="0"/>
</Playlists>
<UnusedPlaylists/>
<RouteGroups/>
<Click>
<IO name="click" id="46" direction="Output" default-type="audio" user-latency="0">
<Port type="audio" name="click/audio_out 1">
<Connection other="system:playback_1"/>
</Port>
<Port type="audio" name="click/audio_out 2">
<Connection other="system:playback_2"/>
</Port>
</IO>
<Processor id="47" name="Amp" active="yes" user-latency="0" type="amp">
<Controllable name="gaincontrol" id="49" flags="GainLike" value="1.000000000000"/>
</Processor>
</Click>
<Speakers>
<Speaker azimuth="0" elevation="0" distance="1"/>
<Speaker azimuth="180" elevation="0" distance="0"/>
</Speakers>
<TempoMap>
<Tempo start="1|1|0" beats-per-minute="120.000000" note-type="4.000000" movable="no"/>
<Meter start="1|1|0" note-type="4.000000" divisions-per-bar="4.000000" movable="no"/>
</TempoMap>
<ControlProtocols>
<Protocol name="Open Sound Control (OSC)" active="no"/>
<Protocol name="Generic MIDI" feedback="0" feedback-interval="10000" active="yes">
<Controls/>
</Protocol>
<Protocol name="Mackie" bank="0" ipmidi-base="21928" device-profile="" device-name="Mackie Control Universal Pro" active="yes"/>
</ControlProtocols>
</Session>

View File

@ -1,2 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<UndoHistory/>

View File

@ -1,148 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<Session version="3001" name="1region" sample-rate="48000" id-counter="120" event-counter="0">
<Config>
<Option name="xfade-model" value="FullCrossfade"/>
<Option name="xfade-choice" value="ConstantPowerMinus3dB"/>
<Option name="auto-xfade" value="1"/>
<Option name="short-xfade-seconds" value="0.015"/>
<Option name="destructive-xfade-msecs" value="2"/>
<Option name="use-region-fades" value="1"/>
<Option name="show-region-fades" value="1"/>
<Option name="native-file-data-format" value="FormatFloat"/>
<Option name="native-file-header-format" value="WAVE"/>
<Option name="auto-play" value="0"/>
<Option name="auto-return" value="0"/>
<Option name="auto-input" value="1"/>
<Option name="punch-in" value="0"/>
<Option name="punch-out" value="0"/>
<Option name="subframes-per-frame" value="100"/>
<Option name="timecode-format" value="timecode_30"/>
<Option name="raid-path" value=""/>
<Option name="audio-search-path" value=""/>
<Option name="midi-search-path" value=""/>
<Option name="auditioner-output-left" value="default"/>
<Option name="auditioner-output-right" value="default"/>
<Option name="timecode-source-is-synced" value="1"/>
<Option name="jack-time-master" value="1"/>
<Option name="use-video-sync" value="0"/>
<Option name="video-pullup" value="0"/>
<Option name="show-summary" value="1"/>
<Option name="show-group-tabs" value="1"/>
<Option name="external-sync" value="0"/>
<Option name="sync-source" value="JACK"/>
<Option name="insert-merge-policy" value="InsertMergeRelax"/>
<Option name="timecode-offset" value="0"/>
<Option name="timecode-offset-negative" value="1"/>
<Option name="glue-new-markers-to-bars-and-beats" value="0"/>
<Option name="midi-copy-is-fork" value="0"/>
<Option name="glue-new-regions-to-bars-and-beats" value="0"/>
</Config>
<Metadata/>
<Sources/>
<Regions/>
<Locations>
<Location id="86" name="Loop" start="0" end="1" flags="IsAutoLoop,IsHidden" locked="no" position-lock-style="AudioTime"/>
<Location id="87" name="Punch" start="0" end="1" flags="IsAutoPunch,IsHidden" locked="no" position-lock-style="AudioTime"/>
</Locations>
<Bundles/>
<Routes>
<Route id="21" name="master" default-type="audio" flags="MasterOut" active="yes" phase-invert="00" denormal-protection="no" meter-point="MeterPostFader" order-keys="editor=0:signal=0" self-solo="no" soloed-by-upstream="0" soloed-by-downstream="0" solo-isolated="no" solo-safe="no">
<IO name="master" id="38" direction="Input" default-type="audio" user-latency="0">
<Port type="audio" name="master/audio_in 1"/>
<Port type="audio" name="master/audio_in 2"/>
</IO>
<IO name="master" id="39" direction="Output" default-type="audio" user-latency="0">
<Port type="audio" name="master/audio_out 1">
<Connection other="system:playback_1"/>
</Port>
<Port type="audio" name="master/audio_out 2">
<Connection other="system:playback_2"/>
</Port>
</IO>
<Controllable name="solo" id="23" flags="Toggle" value="0.000000000000"/>
<Controllable name="mute" id="25" flags="Toggle" value="0.000000000000"/>
<MuteMaster mute-point="PreFader,PostFader,Listen,Main" muted="no"/>
<RemoteControl id="318"/>
<Pannable>
<Controllable name="pan-azimuth" id="29" flags="" value="0.500000000000"/>
<Controllable name="pan-width" id="33" flags="" value="1.000000000000"/>
<Controllable name="pan-elevation" id="31" flags="" value="0.000000000000"/>
<Controllable name="pan-frontback" id="35" flags="" value="0.000000000000"/>
<Controllable name="pan-lfe" id="37" flags="" value="0.000000000000"/>
<Automation/>
</Pannable>
<Processor id="40" name="Amp" active="yes" user-latency="0" type="amp">
<Controllable name="gaincontrol" id="42" flags="GainLike" value="1.000000000000"/>
</Processor>
<Processor id="43" name="Meter" active="yes" user-latency="0" type="meter"/>
<Processor id="44" name="master" active="yes" user-latency="0" own-input="yes" own-output="no" output="master" type="main-outs" role="Main">
<PannerShell bypassed="no">
<Panner type="Equal Power Stereo"/>
</PannerShell>
</Processor>
</Route>
<Route id="88" name="MIDI 1" default-type="midi" active="yes" phase-invert="" denormal-protection="no" meter-point="MeterPostFader" order-keys="signal=2" self-solo="no" soloed-by-upstream="0" soloed-by-downstream="0" solo-isolated="no" solo-safe="no" monitoring="" saved-meter-point="MeterPostFader" note-mode="Sustained" step-editing="no" input-active="yes">
<IO name="MIDI 1" id="105" direction="Input" default-type="midi" user-latency="0">
<Port type="midi" name="MIDI 1/midi_in 1"/>
</IO>
<IO name="MIDI 1" id="106" direction="Output" default-type="midi" user-latency="0">
<Port type="midi" name="MIDI 1/midi_out 1"/>
</IO>
<Controllable name="solo" id="90" flags="Toggle" value="0.000000000000"/>
<Controllable name="mute" id="92" flags="Toggle" value="0.000000000000"/>
<MuteMaster mute-point="PreFader,PostFader,Listen,Main" muted="no"/>
<RemoteControl id="2"/>
<Pannable>
<Controllable name="pan-azimuth" id="96" flags="" value="0.500000000000"/>
<Controllable name="pan-width" id="100" flags="" value="0.000000000000"/>
<Controllable name="pan-elevation" id="98" flags="" value="0.000000000000"/>
<Controllable name="pan-frontback" id="102" flags="" value="0.000000000000"/>
<Controllable name="pan-lfe" id="104" flags="" value="0.000000000000"/>
<Automation/>
</Pannable>
<Processor id="107" name="Amp" active="yes" user-latency="0" type="amp">
<Controllable name="gaincontrol" id="109" flags="GainLike" value="1.000000000000"/>
</Processor>
<Processor id="110" name="Meter" active="yes" user-latency="0" type="meter"/>
<Processor id="111" name="MIDI 1" active="yes" user-latency="0" own-input="yes" own-output="no" output="MIDI 1" type="main-outs" role="Main">
<PannerShell bypassed="no"/>
</Processor>
<Controllable name="recenable" id="113" flags="Toggle" value="0.000000000000"/>
<Diskstream flags="Recordable" playlist="MIDI 1.1" name="MIDI 1" id="115" speed="1.000000" capture-alignment="Automatic" channel-mode="AllChannels" channel-mask="0xffff"/>
</Route>
</Routes>
<Playlists>
<Playlist id="116" name="MIDI 1.1" type="midi" orig-track-id="88" frozen="no" combine-ops="0"/>
</Playlists>
<UnusedPlaylists/>
<RouteGroups/>
<Click>
<IO name="click" id="46" direction="Output" default-type="audio" user-latency="0">
<Port type="audio" name="click/audio_out 1">
<Connection other="system:playback_1"/>
</Port>
<Port type="audio" name="click/audio_out 2">
<Connection other="system:playback_2"/>
</Port>
</IO>
<Processor id="47" name="Amp" active="yes" user-latency="0" type="amp">
<Controllable name="gaincontrol" id="49" flags="GainLike" value="1.000000000000"/>
</Processor>
</Click>
<NamedSelections/>
<Speakers>
<Speaker azimuth="0" elevation="0" distance="1"/>
<Speaker azimuth="180" elevation="0" distance="0"/>
</Speakers>
<TempoMap>
<Tempo start="1|1|0" beats-per-minute="120.000000" note-type="4.000000" movable="no"/>
<Meter start="1|1|0" note-type="4.000000" divisions-per-bar="4.000000" movable="no"/>
</TempoMap>
<ControlProtocols>
<Protocol name="Open Sound Control (OSC)" active="no"/>
<Protocol name="Generic MIDI" feedback="0" feedback-interval="10000" active="yes">
<Controls/>
</Protocol>
<Protocol name="Mackie" bank="0" ipmidi-base="21928" device-profile="" device-name="Mackie Control Universal Pro" active="yes"/>
</ControlProtocols>
</Session>

View File

@ -1,2 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<UndoHistory/>

View File

@ -1,2 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<UndoHistory/>

View File

@ -1,102 +0,0 @@
/*
* file that facilitates C++ program debugging.
*
* Copyright 1995 by Gray Watson
*
* This file is part of the dmalloc package.
*
* Permission to use, copy, modify, and distribute this software for any
* NON-COMMERCIAL purpose and without fee is hereby granted, provided
* that the above copyright notice and this permission notice appear
* in all copies, and that the name of Gray Watson not be used in
* advertising or publicity pertaining to distribution of the document
* or software without specific, written prior permission.
*
* Please see the PERMISSIONS file or contact the author for information
* about commercial licenses.
*
* Gray Watson makes no representations about the suitability of the
* software described herein for any purpose. It is provided "as is"
* without express or implied warranty.
*
* The author may be contacted via http://www.letters.com/~gray/
*
* $Id$
*/
/*
* This file is used to effectively redirect new to the more familiar
* malloc and delete to the more familiar free so they can be debugged
* with the debug malloc library.. They also give the known error
* behavior, too.
*
* Compile and link this in with the C++ program you want to debug.
*
* NOTE: I am not a C++ hacker so feedback in the form of other hints
* and ideas for C++ users would be much appreciated.
*/
#ifdef DEBUG_MALLOC
extern "C" {
#include <stdlib.h>
#include <dmalloc.h>
#include "/usr/local/src/dmalloc-4.1.2/return.h"
}
/*
* An overload function for the C++ new.
*/
void *
operator new(size_t size)
{
char *file;
GET_RET_ADDR(file);
/* handle correct C++ semantics for an alloc of size 0 */
if (size == 0) size = 1;
return _malloc_leap(file, 0, size);
}
/*
* An overload function for the C++ new[].
*/
void *
operator new[](size_t size)
{
char *file;
GET_RET_ADDR(file);
/* handle correct C++ semantics for an alloc of size 0 */
if (size == 0) size = 1;
return _malloc_leap(file, 0, size);
}
/*
* An overload function for the C++ delete.
*/
void
operator delete(void *pnt)
{
char *file;
GET_RET_ADDR(file);
_free_leap(file, 0, pnt);
}
/*
* An overload function for the C++ delete[]. Thanks to Jens Krinke
* <j.krinke@gmx.de>
*/
void
operator delete[](void *pnt)
{
char *file;
GET_RET_ADDR(file);
_free_leap(file, 0, pnt);
}
#endif

View File

@ -1,6 +1,10 @@
/* Copyright unknown. Code by Laurent de Soras <laurent@ohmforce.com>. /*
*/ Copyright © 2013 Laurent de Soras <laurent.de.soras@free.fr>
This work is free. You can redistribute it and/or modify it under the
terms of the Do What The Fuck You Want To Public License, Version 2,
as published by Sam Hocevar. See http://www.wtfpl.net/ for more details.
*/
#ifndef __pbd_fastlog_h__ #ifndef __pbd_fastlog_h__
#define __pbd_fastlog_h__ #define __pbd_fastlog_h__

View File

@ -43,7 +43,6 @@ libpbd_sources = [
'debug.cc', 'debug.cc',
'enumwriter.cc', 'enumwriter.cc',
'event_loop.cc', 'event_loop.cc',
'dmalloc.cc',
'enums.cc', 'enums.cc',
'epa.cc', 'epa.cc',
'error.cc', 'error.cc',

View File

@ -1,21 +0,0 @@
This module works with the Griffin Powermate and allows some basic transport control.
It autodetects the Powermate on any input device of the form "/dev/input/event*". This means you must have the powermate module in your kernel. It works out-of-the-box with 64Studio and presumably lots of other modern distributions.
Turning the wheel left and right will act as a "Shuttle" wheel, adjusting playback speed up and down
Pushing the knob will switch between play and stop
Pushing the knob while turning will jump to the next or previous markers
In order for the powermate to work, you have to have permission to open the input device for reading.
In debian, I changed /etc/udev/rules.d/0_permissions.rules to have the line:
KERNEL=="event[0-9]*", MODE="0666"
but there are other ways to achieve this
Feedback, tweaks, bug fixes and feature ideas are encouraged
-Ben Loftis, ben@benloftis.com

View File

@ -1,16 +0,0 @@
#ifndef __i18n_h__
#define __i18n_h__
#include "pbd/compose.h"
#include "pbd/convert.h"
#include "gettext.h"
#include <vector>
#include <string>
#define _(Text) dgettext (PACKAGE,Text)
#define N_(Text) gettext_noop (Text)
#define X_(Text) Text
#define I18N(Array) PBD::internationalize (PACKAGE, Array)
#endif // __i18n_h__

View File

@ -1,57 +0,0 @@
/*
Ardour9pin interface file
Ben Loftis
Created: 05/18/06 11:07:56
Copyright Harrison Audio, LLC, 2007
*/
#include "powermate.h"
using namespace ARDOUR;
ControlProtocol*
new_powermate_protocol (ControlProtocolDescriptor* /*descriptor*/, Session* s)
{
PowermateControlProtocol* pcp = new PowermateControlProtocol (*s);
if (pcp->set_active (true)) {
delete pcp;
return 0;
}
return pcp;
}
void
delete_powermate_protocol (ControlProtocolDescriptor* /*descriptor*/, ControlProtocol* cp)
{
delete cp;
}
bool
probe_powermate_protocol (ControlProtocolDescriptor* /*descriptor*/)
{
return PowermateControlProtocol::probe ();
}
static ControlProtocolDescriptor powermate_descriptor = {
name : "powermate",
id : "uri://ardour.org/ardour/powermate:0",
ptr : 0,
module : 0,
mandatory : 0,
supports_feedback : false,
probe : probe_powermate_protocol,
initialize : new_powermate_protocol,
destroy : delete_powermate_protocol
};
extern "C" {
ControlProtocolDescriptor*
protocol_descriptor () {
return &powermate_descriptor;
}
}

View File

@ -1,258 +0,0 @@
/*
powermate.cc
Ben Loftis
Created: 03/26/07 20:07:56
*/
#include <linux/input.h>
#include <cstring>
#include <cerrno>
#include <cstdio>
#include <unistd.h>
#include <fcntl.h>
#include <glibmm.h>
#include "pbd/pthread_utils.h"
#include "pbd/xml++.h"
#include "pbd/error.h"
#include "ardour/debug.h"
#include "powermate.h"
#include "i18n.h"
using namespace ARDOUR;
using namespace std;
using namespace sigc;
using namespace PBD;
#define NUM_VALID_PREFIXES 2
static const char *valid_prefix[NUM_VALID_PREFIXES] = {
"Griffin PowerMate",
"Griffin SoundKnob"
};
#define NUM_EVENT_DEVICES 16
int open_powermate (const char *dev, int mode)
{
if (!Glib::file_test (dev, Glib::FILE_TEST_EXISTS)) {
return -1;
}
int fd = open(dev, mode);
int i;
char name[255];
if (fd < 0) {
if (errno != EACCES) {
error << string_compose ("Unable to open \"%1\": %2", dev, strerror(errno)) << endmsg;
}
return -1;
}
/* placate valgrind */
name[0] = '\0';
if (ioctl (fd, EVIOCGNAME (sizeof(name)), name) < 0) {
error << string_compose ("\"%1\": EVIOCGNAME failed: %2", dev, strerror(errno)) << endmsg;
close (fd);
return -1;
}
// it's the correct device if the prefix matches what we expect it to be:
for (i = 0; i < NUM_VALID_PREFIXES; ++i) {
if (!strncasecmp (name, valid_prefix[i], strlen (valid_prefix[i]))) {
return fd;
}
}
close (fd);
return -1;
}
int find_powermate(int mode)
{
char devname[256];
int i, r;
for (i = 0; i < NUM_EVENT_DEVICES; i++) {
sprintf (devname, "/dev/input/event%d", i);
r = open_powermate (devname, mode);
if (r >= 0) {
return r;
}
}
return -1;
}
PowermateControlProtocol::PowermateControlProtocol (Session& s)
: ControlProtocol (s, "powermate")
{
}
PowermateControlProtocol::~PowermateControlProtocol ()
{
set_active (false);
}
bool
PowermateControlProtocol::probe ()
{
int port = find_powermate( O_RDONLY );
if (port < 0) {
if (errno == ENOENT) {
DEBUG_TRACE (DEBUG::ControlProtocols, "Powermate device not found; perhaps you have no powermate connected");
} else {
DEBUG_TRACE (DEBUG::ControlProtocols, string_compose ("powermate: Opening of powermate failed - %1\n", strerror(errno)));
}
return false;
}
close (port);
return true;
}
int
PowermateControlProtocol::set_active (bool inActivate)
{
if (inActivate != _active) {
if (inActivate) {
mPort = find_powermate(O_RDONLY);
if ( mPort < 0 ) {
return -1;
}
if (pthread_create_and_store ("Powermate", &mThread, SerialThreadEntry, this) == 0) {
_active = true;
} else {
return -1;
}
printf("Powermate Control Protocol activated\n");
} else {
pthread_cancel (mThread);
close (mPort);
_active = false;
printf("Powermate Control Protocol deactivated\n");
}
}
return 0;
}
XMLNode&
PowermateControlProtocol::get_state ()
{
XMLNode* node = new XMLNode (X_("Protocol"));
node->add_property (X_("name"), _name);
return *node;
}
int
PowermateControlProtocol::set_state (const XMLNode& /*node*/, int /*version*/)
{
return 0;
}
void*
PowermateControlProtocol::SerialThreadEntry (void* arg)
{
static_cast<PowermateControlProtocol*>(arg)->register_thread ("Powermate");
return static_cast<PowermateControlProtocol*>(arg)->SerialThread ();
}
#define BUFFER_SIZE 32
bool held = false;
bool skippingMarkers = false;
void
PowermateControlProtocol::ProcessEvent(struct input_event *ev)
{
#ifdef VERBOSE
fprintf(stderr, "type=0x%04x, code=0x%04x, value=%d\n",
ev->type, ev->code, (int)ev->value);
#endif
switch(ev->type){
case EV_MSC:
printf("The LED pulse settings were changed; code=0x%04x, value=0x%08x\n", ev->code, ev->value);
break;
case EV_REL:
if(ev->code != REL_DIAL)
fprintf(stderr, "Warning: unexpected rotation event; ev->code = 0x%04x\n", ev->code);
else{
if (held) {
//click and hold to skip forward and back by markers
skippingMarkers = true;;
if (ev->value > 0)
next_marker();
else
prev_marker();
} else {
//scale the range so that we can go from +/-8x within 180 degrees, with less precision at the higher speeds
float speed = get_transport_speed();
speed += (float)ev->value * 0.05;
if (speed > 1.5 || speed < -1.5 )
speed += ev->value;
set_transport_speed( speed );
}
}
break;
case EV_KEY:
if(ev->code != BTN_0)
fprintf(stderr, "Warning: unexpected key event; ev->code = 0x%04x\n", ev->code);
else
if (ev->value)
held = true;
else {
held = false;
if (skippingMarkers) {
skippingMarkers = false;
} else {
if (get_transport_speed() == 0.0) {
set_transport_speed(1.0);
} else {
set_transport_speed(0.0);
}
}
}
break;
}
fflush(stdout);
}
void*
PowermateControlProtocol::SerialThread ()
{
struct input_event ibuffer[BUFFER_SIZE];
int r, events, i;
while(1){
r = read(mPort, ibuffer, sizeof(struct input_event) * BUFFER_SIZE);
if( r > 0 ){
events = r / sizeof(struct input_event);
for(i=0; i<events; i++)
ProcessEvent(&ibuffer[i]);
}else{
fprintf(stderr, "read() failed: %s\n", strerror(errno));
return (void*) 0;
}
}
return (void*) 0;
}

View File

@ -1,34 +0,0 @@
#ifndef ardour_powermate_h
#define ardour_powermate_h
#include <sys/time.h>
#include <pthread.h>
#include "control_protocol/control_protocol.h"
class PowermateControlProtocol : public ARDOUR::ControlProtocol
{
public:
PowermateControlProtocol (ARDOUR::Session&);
virtual ~PowermateControlProtocol();
int set_active (bool yn);
static bool probe ();
XMLNode& get_state ();
int set_state (const XMLNode&, int version);
private:
static void* SerialThreadEntry (void* arg);
void* SerialThread ();
void ProcessEvent(struct input_event *ev);
int mPort;
pthread_t mThread;
};
#endif

View File

@ -1,37 +0,0 @@
#!/usr/bin/env python
from waflib.extras import autowaf as autowaf
import os
# Library version (UNIX style major, minor, micro)
# major increment <=> incompatible changes
# minor increment <=> compatible changes (additions)
# micro increment <=> no interface changes
LIBARDOUR_POWERMATE_LIB_VERSION = '4.1.0'
# Mandatory variables
top = '.'
out = 'build'
def options(opt):
autowaf.set_options(opt)
def configure(conf):
autowaf.configure(conf)
def build(bld):
obj = bld(features = 'cxx cxxshlib')
obj.source = '''
interface.cc
powermate.cc
'''
obj.export_includes = ['.']
obj.cxxflags = '-DPACKAGE="ardour_powermate"'
obj.includes = ['.' ]
obj.name = 'libpowermate'
obj.target = 'powermate'
obj.use = 'libardour libardour_cp'
obj.vnum = LIBARDOUR_POWERMATE_LIB_VERSION
obj.install_path = os.path.join(bld.env['LIBDIR'], 'ardour3', 'surfaces')
def shutdown():
autowaf.shutdown()

View File

@ -25,7 +25,6 @@ children = [
'generic_midi', 'generic_midi',
'mackie', 'mackie',
'osc', 'osc',
'powermate',
'tranzport', 'tranzport',
'wiimote' 'wiimote'
] ]
@ -48,7 +47,6 @@ def configure(conf):
#if Options.options.tranzport and conf.is_defined('HAVE_USB'): #if Options.options.tranzport and conf.is_defined('HAVE_USB'):
# conf.define('BUILD_TRANZPORT', 1) # conf.define('BUILD_TRANZPORT', 1)
conf.check_cc (header_name='linux/input.h', define_name='BUILD_POWERMATE',mandatory=False)
autowaf.check_pkg (conf, 'liblo', mandatory=False, uselib_store="LO", atleast_version="0.24") autowaf.check_pkg (conf, 'liblo', mandatory=False, uselib_store="LO", atleast_version="0.24")
conf.check_cc (header_name='cwiid.h', define_name='HAVE_CWIID_H',mandatory=False) conf.check_cc (header_name='cwiid.h', define_name='HAVE_CWIID_H',mandatory=False)
@ -68,8 +66,6 @@ def build(bld):
bld.recurse('mackie') bld.recurse('mackie')
if bld.is_defined ('HAVE_LO'): if bld.is_defined ('HAVE_LO'):
bld.recurse('osc') bld.recurse('osc')
if bld.is_defined('BUILD_POWERMATE'):
bld.recurse('powermate')
if bld.is_defined('BUILD_WIIMOTE'): if bld.is_defined('BUILD_WIIMOTE'):
bld.recurse('wiimote') bld.recurse('wiimote')
if bld.is_defined('BUILD_TRANZPORT'): if bld.is_defined('BUILD_TRANZPORT'):