port to GTK+ 3
This commit is contained in:
8
Makefile
8
Makefile
@@ -1,9 +1,9 @@
|
|||||||
CC = gcc
|
CC = gcc
|
||||||
EXTRA_CFLAGS ?=
|
EXTRA_CFLAGS ?=
|
||||||
EXTRA_LDFLAGS ?=
|
EXTRA_LDFLAGS ?=
|
||||||
CFLAGS := $(shell pkg-config --cflags glib-2.0 gio-2.0 gtk+-2.0) -Wall -g -ansi -std=c99 $(EXTRA_CFLAGS)
|
CFLAGS := $(shell pkg-config --cflags glib-2.0 gio-2.0 gtk+-3.0) -Wall -g -ansi -std=c99 $(EXTRA_CFLAGS)
|
||||||
LDFLAGS = $(EXTRA_LDFLAGS) -Wl,--as-needed
|
LDFLAGS = $(EXTRA_LDFLAGS) -Wl,--as-needed
|
||||||
LDADD := $(shell pkg-config --libs glib-2.0 gio-2.0 gtk+-2.0 gthread-2.0 alsa) -lexpat
|
LDADD := $(shell pkg-config --libs glib-2.0 gio-2.0 gtk+-3.0 gthread-2.0 alsa) -lexpat
|
||||||
OBJECTS = gdigi.o gui.o effects.o preset.o gtkknob.o
|
OBJECTS = gdigi.o gui.o effects.o preset.o gtkknob.o
|
||||||
DEPFILES = $(foreach m,$(OBJECTS:.o=),.$(m).m)
|
DEPFILES = $(foreach m,$(OBJECTS:.o=),.$(m).m)
|
||||||
|
|
||||||
@@ -19,12 +19,8 @@ all: gdigi
|
|||||||
gdigi: $(OBJECTS)
|
gdigi: $(OBJECTS)
|
||||||
$(CC) $(LDFLAGS) -o $@ $+ $(LDADD)
|
$(CC) $(LDFLAGS) -o $@ $+ $(LDADD)
|
||||||
|
|
||||||
knob.h: knob.png
|
|
||||||
gdk-pixbuf-csource --name=knob_pixbuf knob.png > $@
|
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -f *.o
|
rm -f *.o
|
||||||
rm -f knob.h
|
|
||||||
|
|
||||||
distclean : clean
|
distclean : clean
|
||||||
rm -f .*.m
|
rm -f .*.m
|
||||||
|
|||||||
2
gdigi.c
2
gdigi.c
@@ -122,13 +122,11 @@ GString *pack_data(gchar *data, gint len)
|
|||||||
gint i;
|
gint i;
|
||||||
gint new_len;
|
gint new_len;
|
||||||
unsigned char status;
|
unsigned char status;
|
||||||
gint offset;
|
|
||||||
gint status_byte;
|
gint status_byte;
|
||||||
|
|
||||||
new_len = len + (len/7);
|
new_len = len + (len/7);
|
||||||
packed = g_string_sized_new(new_len);
|
packed = g_string_sized_new(new_len);
|
||||||
status = 0;
|
status = 0;
|
||||||
offset = -1;
|
|
||||||
status_byte = 0;
|
status_byte = 0;
|
||||||
|
|
||||||
for (i=0; i<len; i++) {
|
for (i=0; i<len; i++) {
|
||||||
|
|||||||
414
gtkknob.c
414
gtkknob.c
@@ -4,7 +4,7 @@
|
|||||||
* Tony Garnock-Jones, with modifications from Sean Bolton,
|
* Tony Garnock-Jones, with modifications from Sean Bolton,
|
||||||
* copyright (C) 2004, William Weston copyright (C) 2007,
|
* copyright (C) 2004, William Weston copyright (C) 2007,
|
||||||
* Pete Shorthose copyright (C) 2007, and Tomasz Moń,
|
* Pete Shorthose copyright (C) 2007, and Tomasz Moń,
|
||||||
* copyright (C) 2009
|
* copyright (C) 2009-2011
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU General Public License
|
* modify it under the terms of the GNU General Public License
|
||||||
@@ -24,8 +24,9 @@
|
|||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include <gtk/gtk.h>
|
#include <gtk/gtk.h>
|
||||||
#include <gdk/gdkkeysyms.h>
|
#include <gdk/gdkkeysyms.h>
|
||||||
|
#include <string.h>
|
||||||
#include "gtkknob.h"
|
#include "gtkknob.h"
|
||||||
|
#include "knob.h"
|
||||||
|
|
||||||
#ifndef M_PI
|
#ifndef M_PI
|
||||||
# define M_PI 3.14159265358979323846 /* pi */
|
# define M_PI 3.14159265358979323846 /* pi */
|
||||||
@@ -44,11 +45,15 @@
|
|||||||
|
|
||||||
static void gtk_knob_class_init(GtkKnobClass *klass);
|
static void gtk_knob_class_init(GtkKnobClass *klass);
|
||||||
static void gtk_knob_init(GtkKnob *knob);
|
static void gtk_knob_init(GtkKnob *knob);
|
||||||
static void gtk_knob_destroy(GtkObject *object);
|
static void gtk_knob_destroy(GtkWidget *object);
|
||||||
static void gtk_knob_realize(GtkWidget *widget);
|
static void gtk_knob_realize(GtkWidget *widget);
|
||||||
static void gtk_knob_size_request(GtkWidget *widget, GtkRequisition *requisition);
|
static void gtk_knob_unrealize(GtkWidget *widget);
|
||||||
|
static void gtk_knob_map(GtkWidget *widget);
|
||||||
|
static void gtk_knob_unmap(GtkWidget *widget);
|
||||||
|
static void gtk_knob_get_preferred_width(GtkWidget *widget, gint *minimum_width, gint *natural_width);
|
||||||
|
static void gtk_knob_get_preferred_height(GtkWidget *widget, gint *minimum_height, gint *natural_height);
|
||||||
static void gtk_knob_size_allocate(GtkWidget *widget, GtkAllocation *allocation);
|
static void gtk_knob_size_allocate(GtkWidget *widget, GtkAllocation *allocation);
|
||||||
static gint gtk_knob_expose(GtkWidget *widget, GdkEventExpose *event);
|
static gboolean gtk_knob_draw(GtkWidget *widget, cairo_t *cr);
|
||||||
static gint gtk_knob_scroll(GtkWidget *widget, GdkEventScroll *event);
|
static gint gtk_knob_scroll(GtkWidget *widget, GdkEventScroll *event);
|
||||||
static gint gtk_knob_button_press(GtkWidget *widget, GdkEventButton *event);
|
static gint gtk_knob_button_press(GtkWidget *widget, GdkEventButton *event);
|
||||||
static gint gtk_knob_button_release(GtkWidget *widget, GdkEventButton *event);
|
static gint gtk_knob_button_release(GtkWidget *widget, GdkEventButton *event);
|
||||||
@@ -102,25 +107,27 @@ gtk_knob_get_type(void) {
|
|||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
static void
|
static void
|
||||||
gtk_knob_class_init (GtkKnobClass *klass) {
|
gtk_knob_class_init (GtkKnobClass *klass) {
|
||||||
GtkObjectClass *object_class;
|
|
||||||
GtkWidgetClass *widget_class;
|
GtkWidgetClass *widget_class;
|
||||||
|
|
||||||
object_class = (GtkObjectClass*) klass;
|
|
||||||
widget_class = (GtkWidgetClass*) klass;
|
widget_class = (GtkWidgetClass*) klass;
|
||||||
|
|
||||||
parent_class = g_type_class_peek_parent(klass);
|
parent_class = g_type_class_peek_parent(klass);
|
||||||
|
|
||||||
object_class->destroy = gtk_knob_destroy;
|
widget_class->destroy = gtk_knob_destroy;
|
||||||
|
|
||||||
widget_class->realize = gtk_knob_realize;
|
widget_class->realize = gtk_knob_realize;
|
||||||
widget_class->expose_event = gtk_knob_expose;
|
widget_class->unrealize = gtk_knob_unrealize;
|
||||||
widget_class->size_request = gtk_knob_size_request;
|
widget_class->draw = gtk_knob_draw;
|
||||||
|
widget_class->get_preferred_width = gtk_knob_get_preferred_width;
|
||||||
|
widget_class->get_preferred_height = gtk_knob_get_preferred_height;
|
||||||
widget_class->size_allocate = gtk_knob_size_allocate;
|
widget_class->size_allocate = gtk_knob_size_allocate;
|
||||||
widget_class->scroll_event = gtk_knob_scroll;
|
widget_class->scroll_event = gtk_knob_scroll;
|
||||||
widget_class->button_press_event = gtk_knob_button_press;
|
widget_class->button_press_event = gtk_knob_button_press;
|
||||||
widget_class->button_release_event = gtk_knob_button_release;
|
widget_class->button_release_event = gtk_knob_button_release;
|
||||||
widget_class->key_press_event = gtk_knob_key_press;
|
widget_class->key_press_event = gtk_knob_key_press;
|
||||||
widget_class->motion_notify_event = gtk_knob_motion_notify;
|
widget_class->motion_notify_event = gtk_knob_motion_notify;
|
||||||
|
widget_class->map = gtk_knob_map;
|
||||||
|
widget_class->unmap = gtk_knob_unmap;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -131,19 +138,21 @@ gtk_knob_class_init (GtkKnobClass *klass) {
|
|||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
static void
|
static void
|
||||||
gtk_knob_init (GtkKnob *knob) {
|
gtk_knob_init (GtkKnob *knob) {
|
||||||
knob->policy = GTK_UPDATE_CONTINUOUS;
|
knob->policy = GTK_KNOB_UPDATE_CONTINUOUS;
|
||||||
knob->state = STATE_IDLE;
|
knob->state = STATE_IDLE;
|
||||||
knob->saved_x = 0;
|
knob->saved_x = 0;
|
||||||
knob->saved_y = 0;
|
knob->saved_y = 0;
|
||||||
knob->timer = 0;
|
knob->timer = 0;
|
||||||
knob->anim = NULL;
|
knob->anim = NULL;
|
||||||
knob->mask = NULL;
|
|
||||||
knob->mask_gc = NULL;
|
|
||||||
knob->red_gc = NULL;
|
|
||||||
knob->old_value = 0.0;
|
knob->old_value = 0.0;
|
||||||
knob->old_lower = 0.0;
|
knob->old_lower = 0.0;
|
||||||
knob->old_upper = 0.0;
|
knob->old_upper = 0.0;
|
||||||
knob->adjustment = NULL;
|
knob->adjustment = NULL;
|
||||||
|
|
||||||
|
gtk_widget_set_can_focus(GTK_WIDGET(knob), TRUE);
|
||||||
|
gtk_widget_set_has_window(GTK_WIDGET(knob), FALSE);
|
||||||
|
gtk_widget_set_hexpand(GTK_WIDGET(knob), FALSE);
|
||||||
|
gtk_widget_set_vexpand(GTK_WIDGET(knob), FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -157,7 +166,6 @@ gtk_knob_new(GtkAdjustment *adjustment, GtkKnobAnim *anim) {
|
|||||||
GtkKnob *knob;
|
GtkKnob *knob;
|
||||||
|
|
||||||
g_return_val_if_fail (anim != NULL, NULL);
|
g_return_val_if_fail (anim != NULL, NULL);
|
||||||
g_return_val_if_fail (GDK_IS_PIXBUF (anim->pixbuf), NULL);
|
|
||||||
|
|
||||||
knob = g_object_new (gtk_knob_get_type (), NULL);
|
knob = g_object_new (gtk_knob_get_type (), NULL);
|
||||||
|
|
||||||
@@ -180,7 +188,7 @@ gtk_knob_new(GtkAdjustment *adjustment, GtkKnobAnim *anim) {
|
|||||||
*
|
*
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
static void
|
static void
|
||||||
gtk_knob_destroy(GtkObject *object) {
|
gtk_knob_destroy(GtkWidget *object) {
|
||||||
GtkKnob *knob;
|
GtkKnob *knob;
|
||||||
|
|
||||||
g_return_if_fail (object != NULL);
|
g_return_if_fail (object != NULL);
|
||||||
@@ -196,22 +204,8 @@ gtk_knob_destroy(GtkObject *object) {
|
|||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (knob->mask) {
|
if (GTK_WIDGET_CLASS(parent_class)->destroy) {
|
||||||
g_object_unref (knob->mask);
|
(*GTK_WIDGET_CLASS (parent_class)->destroy) (object);
|
||||||
knob->mask = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (knob->mask_gc) {
|
|
||||||
g_object_unref (knob->mask_gc);
|
|
||||||
knob->mask_gc = NULL;
|
|
||||||
}
|
|
||||||
if (knob->red_gc) {
|
|
||||||
g_object_unref (knob->red_gc);
|
|
||||||
knob->red_gc = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (GTK_OBJECT_CLASS (parent_class)->destroy) {
|
|
||||||
(*GTK_OBJECT_CLASS (parent_class)->destroy) (object);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -237,7 +231,7 @@ gtk_knob_get_adjustment(GtkKnob *knob) {
|
|||||||
*
|
*
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
void
|
void
|
||||||
gtk_knob_set_update_policy(GtkKnob *knob, GtkUpdateType policy) {
|
gtk_knob_set_update_policy(GtkKnob *knob, GtkKnobUpdateType policy) {
|
||||||
|
|
||||||
g_return_if_fail (knob != NULL);
|
g_return_if_fail (knob != NULL);
|
||||||
g_return_if_fail (GTK_IS_KNOB (knob));
|
g_return_if_fail (GTK_IS_KNOB (knob));
|
||||||
@@ -276,9 +270,9 @@ gtk_knob_set_adjustment(GtkKnob *knob, GtkAdjustment *adjustment) {
|
|||||||
G_CALLBACK(gtk_knob_adjustment_value_changed),
|
G_CALLBACK(gtk_knob_adjustment_value_changed),
|
||||||
knob);
|
knob);
|
||||||
|
|
||||||
knob->old_value = adjustment->value;
|
knob->old_value = gtk_adjustment_get_value(adjustment);
|
||||||
knob->old_lower = adjustment->lower;
|
knob->old_lower = gtk_adjustment_get_lower(adjustment);
|
||||||
knob->old_upper = adjustment->upper;
|
knob->old_upper = gtk_adjustment_get_upper(adjustment);
|
||||||
|
|
||||||
gtk_knob_update (knob);
|
gtk_knob_update (knob);
|
||||||
}
|
}
|
||||||
@@ -293,66 +287,98 @@ gtk_knob_set_adjustment(GtkKnob *knob, GtkAdjustment *adjustment) {
|
|||||||
static void
|
static void
|
||||||
gtk_knob_realize(GtkWidget *widget) {
|
gtk_knob_realize(GtkWidget *widget) {
|
||||||
GtkKnob *knob;
|
GtkKnob *knob;
|
||||||
|
GdkWindow *window;
|
||||||
GdkWindowAttr attributes;
|
GdkWindowAttr attributes;
|
||||||
|
GtkAllocation allocation;
|
||||||
|
|
||||||
gint attributes_mask;
|
gint attributes_mask;
|
||||||
GdkColor color = { 0, 0xffff, 0, 0 };
|
|
||||||
|
|
||||||
g_return_if_fail (widget != NULL);
|
g_return_if_fail (widget != NULL);
|
||||||
g_return_if_fail (GTK_IS_KNOB (widget));
|
g_return_if_fail (GTK_IS_KNOB (widget));
|
||||||
|
|
||||||
GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED);
|
gtk_widget_get_allocation (widget, &allocation);
|
||||||
GTK_WIDGET_SET_FLAGS (widget, GTK_CAN_FOCUS);
|
gtk_widget_set_realized(widget, TRUE);
|
||||||
knob = GTK_KNOB (widget);
|
knob = GTK_KNOB (widget);
|
||||||
|
|
||||||
attributes.x = widget->allocation.x;
|
|
||||||
attributes.y = widget->allocation.y;
|
|
||||||
attributes.width = widget->allocation.width;
|
|
||||||
attributes.height = widget->allocation.height;
|
|
||||||
attributes.wclass = GDK_INPUT_OUTPUT;
|
|
||||||
attributes.window_type = GDK_WINDOW_CHILD;
|
attributes.window_type = GDK_WINDOW_CHILD;
|
||||||
|
attributes.x = allocation.x;
|
||||||
|
attributes.y = allocation.y;
|
||||||
|
attributes.width = allocation.width;
|
||||||
|
attributes.height = allocation.height;
|
||||||
|
attributes.wclass = GDK_INPUT_ONLY;;
|
||||||
attributes.event_mask =
|
attributes.event_mask =
|
||||||
gtk_widget_get_events (widget) |
|
gtk_widget_get_events (widget) |
|
||||||
GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK |
|
GDK_BUTTON_PRESS_MASK |
|
||||||
GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK |
|
GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK |
|
||||||
GDK_POINTER_MOTION_HINT_MASK;
|
GDK_POINTER_MOTION_HINT_MASK;
|
||||||
attributes.visual = gtk_widget_get_visual (widget);
|
|
||||||
attributes.colormap = gtk_widget_get_colormap (widget);
|
|
||||||
|
|
||||||
attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP;
|
attributes_mask = GDK_WA_X | GDK_WA_Y;
|
||||||
|
|
||||||
widget->window = gdk_window_new (widget->parent->window,
|
window = gtk_widget_get_parent_window(widget);
|
||||||
&attributes, attributes_mask);
|
gtk_widget_set_window(widget, window);
|
||||||
|
g_object_ref(window);
|
||||||
|
|
||||||
widget->style = gtk_style_attach (widget->style, widget->window);
|
knob->event_window = gdk_window_new(window, &attributes, attributes_mask);
|
||||||
|
gdk_window_set_user_data(knob->event_window, knob);
|
||||||
gdk_window_set_user_data (widget->window, widget);
|
|
||||||
|
|
||||||
gtk_style_set_background (widget->style, widget->window, GTK_STATE_NORMAL);
|
|
||||||
|
|
||||||
knob->mask_gc = gdk_gc_new (widget->window);
|
|
||||||
gdk_gc_copy (knob->mask_gc, widget->style->bg_gc[GTK_STATE_NORMAL]);
|
|
||||||
gdk_gc_set_clip_mask (knob->mask_gc, knob->mask);
|
|
||||||
|
|
||||||
knob->red_gc = gdk_gc_new (widget->window);
|
|
||||||
gdk_gc_copy (knob->red_gc, widget->style->bg_gc[GTK_STATE_NORMAL]);
|
|
||||||
gdk_colormap_alloc_color (attributes.colormap, &color, FALSE, TRUE);
|
|
||||||
gdk_gc_set_foreground (knob->red_gc, &color);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*****************************************************************************
|
|
||||||
*
|
|
||||||
* gtk_knob_size_request()
|
|
||||||
*
|
|
||||||
*****************************************************************************/
|
|
||||||
static void
|
static void
|
||||||
gtk_knob_size_request (GtkWidget *widget, GtkRequisition *requisition) {
|
gtk_knob_unrealize(GtkWidget *widget)
|
||||||
|
{
|
||||||
|
GtkKnob *knob = GTK_KNOB(widget);
|
||||||
|
|
||||||
|
if (knob->event_window)
|
||||||
|
{
|
||||||
|
gdk_window_set_user_data(knob->event_window, NULL);
|
||||||
|
gdk_window_destroy(knob->event_window);
|
||||||
|
knob->event_window = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
GTK_WIDGET_CLASS(parent_class)->unrealize(widget);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gtk_knob_map(GtkWidget *widget)
|
||||||
|
{
|
||||||
|
GtkKnob *knob = GTK_KNOB(widget);
|
||||||
|
|
||||||
|
GTK_WIDGET_CLASS(parent_class)->map(widget);
|
||||||
|
|
||||||
|
if (knob->event_window)
|
||||||
|
gdk_window_show(knob->event_window);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gtk_knob_unmap(GtkWidget *widget)
|
||||||
|
{
|
||||||
|
GtkKnob *knob = GTK_KNOB(widget);
|
||||||
|
|
||||||
|
if (knob->event_window)
|
||||||
|
gdk_window_hide(knob->event_window);
|
||||||
|
|
||||||
|
GTK_WIDGET_CLASS(parent_class)->unmap(widget);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gtk_knob_get_preferred_width(GtkWidget *widget,
|
||||||
|
gint *minimum_width,
|
||||||
|
gint *natural_width)
|
||||||
|
{
|
||||||
g_return_if_fail (widget != NULL);
|
g_return_if_fail (widget != NULL);
|
||||||
g_return_if_fail (GTK_IS_KNOB (widget));
|
g_return_if_fail (GTK_IS_KNOB (widget));
|
||||||
|
|
||||||
requisition->width = GTK_KNOB (widget)->width;
|
*minimum_width = *natural_width = GTK_KNOB(widget)->width;
|
||||||
requisition->height = GTK_KNOB (widget)->height;
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gtk_knob_get_preferred_height(GtkWidget *widget,
|
||||||
|
gint *minimum_height,
|
||||||
|
gint *natural_height)
|
||||||
|
{
|
||||||
|
g_return_if_fail (widget != NULL);
|
||||||
|
g_return_if_fail (GTK_IS_KNOB (widget));
|
||||||
|
|
||||||
|
*minimum_height = *natural_height = GTK_KNOB(widget)->height;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -369,11 +395,11 @@ gtk_knob_size_allocate (GtkWidget *widget, GtkAllocation *allocation) {
|
|||||||
g_return_if_fail (GTK_IS_KNOB (widget));
|
g_return_if_fail (GTK_IS_KNOB (widget));
|
||||||
g_return_if_fail (allocation != NULL);
|
g_return_if_fail (allocation != NULL);
|
||||||
|
|
||||||
widget->allocation = *allocation;
|
gtk_widget_set_allocation(widget, allocation);
|
||||||
knob = GTK_KNOB (widget);
|
knob = GTK_KNOB (widget);
|
||||||
|
|
||||||
if (GTK_WIDGET_REALIZED (widget)) {
|
if (gtk_widget_get_realized (widget)) {
|
||||||
gdk_window_move_resize (widget->window,
|
gdk_window_move_resize (knob->event_window,
|
||||||
allocation->x, allocation->y,
|
allocation->x, allocation->y,
|
||||||
allocation->width, allocation->height);
|
allocation->width, allocation->height);
|
||||||
}
|
}
|
||||||
@@ -382,39 +408,50 @@ gtk_knob_size_allocate (GtkWidget *widget, GtkAllocation *allocation) {
|
|||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
*
|
*
|
||||||
* gtk_knob_expose()
|
* gtk_knob_draw()
|
||||||
*
|
*
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
static gint
|
static gboolean
|
||||||
gtk_knob_expose(GtkWidget *widget, GdkEventExpose *event) {
|
gtk_knob_draw(GtkWidget *widget, cairo_t *cr) {
|
||||||
GtkKnob *knob;
|
GtkKnob *knob;
|
||||||
gfloat dx, dy;
|
gdouble dx, dy;
|
||||||
gint frames;
|
gint frames;
|
||||||
|
|
||||||
g_return_val_if_fail (widget != NULL, FALSE);
|
g_return_val_if_fail (widget != NULL, FALSE);
|
||||||
g_return_val_if_fail (GTK_IS_KNOB (widget), FALSE);
|
g_return_val_if_fail (GTK_IS_KNOB (widget), FALSE);
|
||||||
g_return_val_if_fail (event != NULL, FALSE);
|
g_return_val_if_fail (cr != NULL, FALSE);
|
||||||
g_return_val_if_fail (GTK_IS_ADJUSTMENT (GTK_KNOB (widget)->adjustment), FALSE);
|
g_return_val_if_fail (GTK_IS_ADJUSTMENT (GTK_KNOB (widget)->adjustment), FALSE);
|
||||||
|
|
||||||
if (event->count > 0)
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
knob = GTK_KNOB (widget);
|
knob = GTK_KNOB (widget);
|
||||||
|
|
||||||
frames = ((knob->anim->width / knob->anim->frame_width) - 1);
|
frames = ((knob->anim->width / knob->anim->frame_width) - 1);
|
||||||
dx = knob->adjustment->value - knob->adjustment->lower; /* value, from 0 */
|
dx = gtk_adjustment_get_value(knob->adjustment) - gtk_adjustment_get_lower(knob->adjustment); /* value, from 0 */
|
||||||
dy = knob->adjustment->upper - knob->adjustment->lower; /* range */
|
dy = gtk_adjustment_get_upper(knob->adjustment) - gtk_adjustment_get_lower(knob->adjustment); /* range */
|
||||||
|
|
||||||
dx = (int)(frames * dx / dy) * knob->width; /* check this for height != width */
|
dx = (int)(frames * dx / dy) * knob->width; /* check this for height != width */
|
||||||
|
|
||||||
gdk_draw_pixbuf (widget->window, knob->mask_gc, knob->anim->pixbuf,
|
cairo_surface_t *surface =
|
||||||
dx, 0, 0, 0, knob->width, knob->height,
|
cairo_surface_create_for_rectangle(knob->anim->image,
|
||||||
GDK_RGB_DITHER_NONE, 0, 0);
|
dx, 0.0,
|
||||||
|
(double)knob->width,
|
||||||
|
(double)knob->height);
|
||||||
|
cairo_set_source_surface(cr, surface, 0, 0);
|
||||||
|
cairo_paint(cr);
|
||||||
|
cairo_surface_destroy(surface);
|
||||||
|
|
||||||
if (GTK_WIDGET_HAS_FOCUS(widget)) {
|
if (gtk_widget_has_focus(widget)) {
|
||||||
gtk_paint_focus (widget->style, widget->window, widget->state,
|
GtkStyleContext *context;
|
||||||
NULL, widget, NULL, 0, 0,
|
|
||||||
widget->allocation.width, widget->allocation.height);
|
context = gtk_widget_get_style_context(widget);
|
||||||
|
gtk_style_context_save(context);
|
||||||
|
gtk_style_context_set_state(context, gtk_widget_get_state_flags (widget));
|
||||||
|
cairo_save(cr);
|
||||||
|
gtk_render_focus(context, cr,
|
||||||
|
0, 0,
|
||||||
|
gtk_widget_get_allocated_width(widget),
|
||||||
|
gtk_widget_get_allocated_height(widget));
|
||||||
|
cairo_restore(cr);
|
||||||
|
gtk_style_context_restore(context);
|
||||||
}
|
}
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
@@ -439,11 +476,15 @@ gtk_knob_scroll(GtkWidget *widget, GdkEventScroll *event) {
|
|||||||
|
|
||||||
switch (event->direction) {
|
switch (event->direction) {
|
||||||
case GDK_SCROLL_UP:
|
case GDK_SCROLL_UP:
|
||||||
knob->adjustment->value += knob->adjustment->step_increment;
|
gtk_adjustment_set_value(knob->adjustment,
|
||||||
|
gtk_adjustment_get_value(knob->adjustment) +
|
||||||
|
gtk_adjustment_get_step_increment(knob->adjustment));
|
||||||
g_signal_emit_by_name (knob->adjustment, "value_changed");
|
g_signal_emit_by_name (knob->adjustment, "value_changed");
|
||||||
break;
|
break;
|
||||||
case GDK_SCROLL_DOWN:
|
case GDK_SCROLL_DOWN:
|
||||||
knob->adjustment->value -= knob->adjustment->step_increment;
|
gtk_adjustment_set_value(knob->adjustment,
|
||||||
|
gtk_adjustment_get_value(knob->adjustment) -
|
||||||
|
gtk_adjustment_get_step_increment(knob->adjustment));
|
||||||
g_signal_emit_by_name (knob->adjustment, "value_changed");
|
g_signal_emit_by_name (knob->adjustment, "value_changed");
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@@ -475,16 +516,17 @@ gtk_knob_button_press(GtkWidget *widget, GdkEventButton *event) {
|
|||||||
switch (event->button) {
|
switch (event->button) {
|
||||||
case 1:
|
case 1:
|
||||||
case 3:
|
case 3:
|
||||||
if (!GTK_WIDGET_HAS_FOCUS(widget))
|
if (!gtk_widget_has_focus(widget))
|
||||||
gtk_widget_grab_focus(widget);
|
gtk_widget_grab_focus(widget);
|
||||||
knob->state = STATE_PRESSED;
|
knob->state = STATE_PRESSED;
|
||||||
knob->saved_x = event->x;
|
knob->saved_x = event->x;
|
||||||
knob->saved_y = event->y;
|
knob->saved_y = event->y;
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
knob->adjustment->value = floor ((knob->adjustment->lower +
|
gtk_adjustment_set_value(knob->adjustment,
|
||||||
knob->adjustment->upper + 1.0)
|
floor ((gtk_adjustment_get_lower(knob->adjustment) +
|
||||||
* 0.5);
|
gtk_adjustment_get_upper(knob->adjustment) + 1.0)
|
||||||
|
* 0.5));
|
||||||
g_signal_emit_by_name (knob->adjustment, "value_changed");
|
g_signal_emit_by_name (knob->adjustment, "value_changed");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -523,8 +565,8 @@ gtk_knob_button_release(GtkWidget *widget, GdkEventButton *event) {
|
|||||||
switch (event->button) {
|
switch (event->button) {
|
||||||
case 1:
|
case 1:
|
||||||
case 3:
|
case 3:
|
||||||
if (knob->policy != GTK_UPDATE_CONTINUOUS
|
if (knob->policy != GTK_KNOB_UPDATE_CONTINUOUS
|
||||||
&& knob->old_value != knob->adjustment->value)
|
&& knob->old_value != gtk_adjustment_get_value(knob->adjustment))
|
||||||
{
|
{
|
||||||
g_signal_emit_by_name (knob->adjustment, "value_changed");
|
g_signal_emit_by_name (knob->adjustment, "value_changed");
|
||||||
}
|
}
|
||||||
@@ -550,20 +592,20 @@ static gint gtk_knob_key_press(GtkWidget *widget, GdkEventKey *event)
|
|||||||
|
|
||||||
switch (event->keyval) {
|
switch (event->keyval) {
|
||||||
|
|
||||||
case GDK_Up:
|
case GDK_KEY_Up:
|
||||||
if (GTK_WIDGET_HAS_FOCUS (widget))
|
if (gtk_widget_has_focus (widget))
|
||||||
{
|
{
|
||||||
gtk_adjustment_set_value (knob->adjustment,
|
gtk_adjustment_set_value (knob->adjustment,
|
||||||
knob->old_value + knob->adjustment->step_increment);
|
knob->old_value + gtk_adjustment_get_step_increment(knob->adjustment));
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
case GDK_Down:
|
case GDK_KEY_Down:
|
||||||
if (GTK_WIDGET_HAS_FOCUS (widget))
|
if (gtk_widget_has_focus (widget))
|
||||||
{
|
{
|
||||||
gtk_adjustment_set_value (knob->adjustment,
|
gtk_adjustment_set_value (knob->adjustment,
|
||||||
knob->old_value - knob->adjustment->step_increment);
|
knob->old_value - gtk_adjustment_get_step_increment(knob->adjustment));
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
return FALSE;
|
return FALSE;
|
||||||
@@ -594,8 +636,8 @@ gtk_knob_motion_notify(GtkWidget *widget, GdkEventMotion *event) {
|
|||||||
x = event->x;
|
x = event->x;
|
||||||
y = event->y;
|
y = event->y;
|
||||||
|
|
||||||
if (event->is_hint || (event->window != widget->window)) {
|
if (event->is_hint || (event->window != gtk_widget_get_window(widget))) {
|
||||||
gdk_window_get_pointer (widget->window, &x, &y, &mods);
|
gdk_window_get_pointer(gtk_widget_get_window(widget), &x, &y, &mods);
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (knob->state) {
|
switch (knob->state) {
|
||||||
@@ -632,7 +674,7 @@ gtk_knob_timer(GtkKnob *knob) {
|
|||||||
g_return_val_if_fail (GTK_IS_KNOB (knob), FALSE);
|
g_return_val_if_fail (GTK_IS_KNOB (knob), FALSE);
|
||||||
g_return_val_if_fail (GTK_IS_ADJUSTMENT (knob->adjustment), FALSE);
|
g_return_val_if_fail (GTK_IS_ADJUSTMENT (knob->adjustment), FALSE);
|
||||||
|
|
||||||
if (knob->policy == GTK_UPDATE_DELAYED) {
|
if (knob->policy == GTK_KNOB_UPDATE_DELAYED) {
|
||||||
g_signal_emit_by_name (knob->adjustment, "value_changed");
|
g_signal_emit_by_name (knob->adjustment, "value_changed");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -650,13 +692,13 @@ static void
|
|||||||
gtk_knob_update_mouse_update(GtkKnob *knob) {
|
gtk_knob_update_mouse_update(GtkKnob *knob) {
|
||||||
g_return_if_fail(GTK_IS_ADJUSTMENT (knob->adjustment));
|
g_return_if_fail(GTK_IS_ADJUSTMENT (knob->adjustment));
|
||||||
|
|
||||||
if (knob->policy == GTK_UPDATE_CONTINUOUS) {
|
if (knob->policy == GTK_KNOB_UPDATE_CONTINUOUS) {
|
||||||
g_signal_emit_by_name (knob->adjustment, "value_changed");
|
g_signal_emit_by_name (knob->adjustment, "value_changed");
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
gtk_widget_queue_draw (GTK_WIDGET (knob));
|
gtk_widget_queue_draw (GTK_WIDGET (knob));
|
||||||
|
|
||||||
if (knob->policy == GTK_UPDATE_DELAYED) {
|
if (knob->policy == GTK_KNOB_UPDATE_DELAYED) {
|
||||||
if (knob->timer) {
|
if (knob->timer) {
|
||||||
g_source_remove (knob->timer);
|
g_source_remove (knob->timer);
|
||||||
}
|
}
|
||||||
@@ -675,14 +717,14 @@ gtk_knob_update_mouse_update(GtkKnob *knob) {
|
|||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
static void
|
static void
|
||||||
gtk_knob_update_mouse(GtkKnob *knob, gint x, gint y, gboolean step) {
|
gtk_knob_update_mouse(GtkKnob *knob, gint x, gint y, gboolean step) {
|
||||||
gfloat old_value, new_value, dv, dh;
|
gdouble old_value, new_value, dv, dh;
|
||||||
gfloat angle;
|
gdouble angle;
|
||||||
|
|
||||||
g_return_if_fail (knob != NULL);
|
g_return_if_fail (knob != NULL);
|
||||||
g_return_if_fail (GTK_IS_KNOB (knob));
|
g_return_if_fail (GTK_IS_KNOB (knob));
|
||||||
g_return_if_fail (GTK_IS_ADJUSTMENT (knob->adjustment));
|
g_return_if_fail (GTK_IS_ADJUSTMENT (knob->adjustment));
|
||||||
|
|
||||||
old_value = knob->adjustment->value;
|
old_value = gtk_adjustment_get_value(knob->adjustment);
|
||||||
|
|
||||||
angle = atan2f (-y + (knob->height >> 1), x - (knob->width >> 1));
|
angle = atan2f (-y + (knob->height >> 1), x - (knob->width >> 1));
|
||||||
|
|
||||||
@@ -699,17 +741,17 @@ gtk_knob_update_mouse(GtkKnob *knob, gint x, gint y, gboolean step) {
|
|||||||
dh *= angle * angle;
|
dh *= angle * angle;
|
||||||
}
|
}
|
||||||
|
|
||||||
new_value = knob->adjustment->value +
|
new_value = gtk_adjustment_get_value(knob->adjustment) +
|
||||||
dv * (step ? knob->adjustment->step_increment : knob->adjustment->page_increment) +
|
dv * (step ? gtk_adjustment_get_step_increment(knob->adjustment) : gtk_adjustment_get_page_increment(knob->adjustment)) +
|
||||||
dh * (knob->adjustment->upper -
|
dh * (gtk_adjustment_get_upper(knob->adjustment) -
|
||||||
knob->adjustment->lower) * 0.005; /* 0.005 == (1 / 200) */
|
gtk_adjustment_get_lower(knob->adjustment)) * 0.005; /* 0.005 == (1 / 200) */
|
||||||
|
|
||||||
new_value = MAX (MIN (new_value, knob->adjustment->upper),
|
new_value = MAX (MIN (new_value, gtk_adjustment_get_upper(knob->adjustment)),
|
||||||
knob->adjustment->lower);
|
gtk_adjustment_get_lower(knob->adjustment));
|
||||||
|
|
||||||
knob->adjustment->value = new_value;
|
gtk_adjustment_set_value(knob->adjustment, new_value);
|
||||||
|
|
||||||
if (knob->adjustment->value != old_value) {
|
if (gtk_adjustment_get_value(knob->adjustment) != old_value) {
|
||||||
gtk_knob_update_mouse_update (knob);
|
gtk_knob_update_mouse_update (knob);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -722,29 +764,29 @@ gtk_knob_update_mouse(GtkKnob *knob, gint x, gint y, gboolean step) {
|
|||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
static void
|
static void
|
||||||
gtk_knob_update(GtkKnob *knob) {
|
gtk_knob_update(GtkKnob *knob) {
|
||||||
gfloat new_value;
|
gdouble new_value;
|
||||||
|
|
||||||
g_return_if_fail (knob != NULL);
|
g_return_if_fail (knob != NULL);
|
||||||
g_return_if_fail (GTK_IS_KNOB (knob));
|
g_return_if_fail (GTK_IS_KNOB (knob));
|
||||||
g_return_if_fail (GTK_IS_ADJUSTMENT (knob->adjustment));
|
g_return_if_fail (GTK_IS_ADJUSTMENT (knob->adjustment));
|
||||||
|
|
||||||
if (knob->adjustment->step_increment == 1) {
|
if (gtk_adjustment_get_step_increment(knob->adjustment) == 1) {
|
||||||
new_value = floor (knob->adjustment->value + 0.5);
|
new_value = floor (gtk_adjustment_get_value(knob->adjustment) + 0.5);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
new_value = knob->adjustment->value;
|
new_value = gtk_adjustment_get_value(knob->adjustment);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (new_value < knob->adjustment->lower) {
|
if (new_value < gtk_adjustment_get_lower(knob->adjustment)) {
|
||||||
new_value = knob->adjustment->lower;
|
new_value = gtk_adjustment_get_lower(knob->adjustment);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (new_value > knob->adjustment->upper) {
|
if (new_value > gtk_adjustment_get_upper(knob->adjustment)) {
|
||||||
new_value = knob->adjustment->upper;
|
new_value = gtk_adjustment_get_upper(knob->adjustment);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (new_value != knob->adjustment->value) {
|
if (new_value != gtk_adjustment_get_value(knob->adjustment)) {
|
||||||
knob->adjustment->value = new_value;
|
gtk_adjustment_set_value(knob->adjustment, new_value);
|
||||||
g_signal_emit_by_name (knob->adjustment, "value_changed");
|
g_signal_emit_by_name (knob->adjustment, "value_changed");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -766,15 +808,15 @@ gtk_knob_adjustment_changed(GtkAdjustment *adjustment, gpointer data) {
|
|||||||
|
|
||||||
knob = GTK_KNOB (data);
|
knob = GTK_KNOB (data);
|
||||||
|
|
||||||
if ((knob->old_value != adjustment->value) ||
|
if ((knob->old_value != gtk_adjustment_get_value(adjustment)) ||
|
||||||
(knob->old_lower != adjustment->lower) ||
|
(knob->old_lower != gtk_adjustment_get_lower(adjustment)) ||
|
||||||
(knob->old_upper != adjustment->upper))
|
(knob->old_upper != gtk_adjustment_get_upper(adjustment)))
|
||||||
{
|
{
|
||||||
gtk_knob_update (knob);
|
gtk_knob_update (knob);
|
||||||
|
|
||||||
knob->old_value = adjustment->value;
|
knob->old_value = gtk_adjustment_get_value(adjustment);
|
||||||
knob->old_lower = adjustment->lower;
|
knob->old_lower = gtk_adjustment_get_lower(adjustment);
|
||||||
knob->old_upper = adjustment->upper;
|
knob->old_upper = gtk_adjustment_get_upper(adjustment);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -793,9 +835,9 @@ gtk_knob_adjustment_value_changed (GtkAdjustment *adjustment, gpointer data) {
|
|||||||
|
|
||||||
knob = GTK_KNOB (data);
|
knob = GTK_KNOB (data);
|
||||||
|
|
||||||
if (knob->old_value != adjustment->value) {
|
if (knob->old_value != gtk_adjustment_get_value(adjustment)) {
|
||||||
gtk_knob_update (knob);
|
gtk_knob_update (knob);
|
||||||
knob->old_value = adjustment->value;
|
knob->old_value = gtk_adjustment_get_value(adjustment);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -810,29 +852,31 @@ gtk_knob_set_animation (GtkKnob *knob, GtkKnobAnim *anim) {
|
|||||||
g_return_if_fail (knob != NULL);
|
g_return_if_fail (knob != NULL);
|
||||||
g_return_if_fail (anim != NULL);
|
g_return_if_fail (anim != NULL);
|
||||||
g_return_if_fail (GTK_IS_KNOB (knob));
|
g_return_if_fail (GTK_IS_KNOB (knob));
|
||||||
g_return_if_fail (GDK_IS_PIXBUF (anim->pixbuf));
|
|
||||||
|
|
||||||
knob->anim = (GtkKnobAnim *)anim;
|
knob->anim = (GtkKnobAnim *)anim;
|
||||||
knob->width = anim->frame_width;
|
knob->width = anim->frame_width;
|
||||||
knob->height = anim->height;
|
knob->height = anim->height;
|
||||||
|
|
||||||
if (GTK_WIDGET_REALIZED (knob)) {
|
if (gtk_widget_get_realized (GTK_WIDGET(knob))) {
|
||||||
gtk_widget_queue_resize (GTK_WIDGET (knob));
|
gtk_widget_queue_resize (GTK_WIDGET (knob));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reads embedded knob image
|
||||||
|
**/
|
||||||
|
static cairo_status_t
|
||||||
|
get_knob_image(void *closure, unsigned char *data, unsigned int length)
|
||||||
|
{
|
||||||
|
int *offset = (int *)closure;
|
||||||
|
|
||||||
/*****************************************************************************
|
if ((*offset + length) > sizeof (knob_png))
|
||||||
*
|
return CAIRO_STATUS_READ_ERROR;
|
||||||
* gtk_knob_animation_new_from_file()
|
|
||||||
*
|
|
||||||
*****************************************************************************/
|
|
||||||
GtkKnobAnim *
|
|
||||||
gtk_knob_animation_new_from_file(gchar *filename) {
|
|
||||||
GtkKnobAnim *anim;
|
|
||||||
|
|
||||||
anim = gtk_knob_animation_new_from_file_full (filename, -1, -1, KNOB_SIZE);
|
memcpy (data, knob_png + *offset, length);
|
||||||
return anim;
|
*offset = *offset + length;
|
||||||
|
|
||||||
|
return CAIRO_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
@@ -841,68 +885,20 @@ gtk_knob_animation_new_from_file(gchar *filename) {
|
|||||||
*
|
*
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
GtkKnobAnim *
|
GtkKnobAnim *
|
||||||
gtk_knob_animation_new_from_inline(const guint8 *pixbuf) {
|
gtk_knob_animation_new_from_inline() {
|
||||||
GtkKnobAnim *anim = g_new0 (GtkKnobAnim, 1);
|
GtkKnobAnim *anim = g_new0 (GtkKnobAnim, 1);
|
||||||
|
int offset = 0;
|
||||||
|
|
||||||
g_return_val_if_fail((pixbuf != NULL), NULL);
|
anim->image =
|
||||||
|
cairo_image_surface_create_from_png_stream(get_knob_image, &offset);
|
||||||
|
|
||||||
anim->pixbuf = gdk_pixbuf_new_from_inline(-1, pixbuf, FALSE, NULL);
|
anim->width = cairo_image_surface_get_width(anim->image);
|
||||||
if (anim->pixbuf == NULL) {
|
anim->height = cairo_image_surface_get_height(anim->image);
|
||||||
g_free(anim);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
anim->height = gdk_pixbuf_get_height (anim->pixbuf);
|
|
||||||
anim->width = gdk_pixbuf_get_width (anim->pixbuf);
|
|
||||||
anim->frame_width = anim->height;
|
anim->frame_width = anim->height;
|
||||||
|
|
||||||
return anim;
|
return anim;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************
|
|
||||||
*
|
|
||||||
* gtk_knob_new_from_file_full()
|
|
||||||
*
|
|
||||||
* frame_width: overrides the frame width (to make rectangular frames)
|
|
||||||
* but doesn't affect the image size width and height cause optional
|
|
||||||
* scaling if not set to -1 when they are derived from the native
|
|
||||||
* image size.
|
|
||||||
*
|
|
||||||
* FIXME: account for any problems where (width % frame_width != 0)
|
|
||||||
*
|
|
||||||
*****************************************************************************/
|
|
||||||
GtkKnobAnim *
|
|
||||||
gtk_knob_animation_new_from_file_full(gchar *filename, gint frame_width,
|
|
||||||
gint width, gint height) {
|
|
||||||
GtkKnobAnim *anim = g_new0 (GtkKnobAnim, 1);
|
|
||||||
|
|
||||||
g_return_val_if_fail ((filename != NULL), NULL);
|
|
||||||
|
|
||||||
GError *gerror = NULL;
|
|
||||||
|
|
||||||
#if GTK_MINOR_VERSION < 10
|
|
||||||
if (!(anim->pixbuf = gdk_pixbuf_new_from_file (filename, &gerror))) {
|
|
||||||
g_error_free(gerror);
|
|
||||||
gerror = NULL;
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
#else /* GTK_MINOR_VERSION >= 10 */
|
|
||||||
if (!(anim->pixbuf = gdk_pixbuf_new_from_file_at_size (filename, width,
|
|
||||||
height, &gerror))) {
|
|
||||||
g_error_free(gerror);
|
|
||||||
gerror = NULL;
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
#endif /* GTK_MINOR_VERSION < 10 */
|
|
||||||
else {
|
|
||||||
anim->height = gdk_pixbuf_get_height (anim->pixbuf);
|
|
||||||
anim->width = gdk_pixbuf_get_width (anim->pixbuf);
|
|
||||||
anim->frame_width = (frame_width != -1) ? frame_width : anim->height;
|
|
||||||
}
|
|
||||||
|
|
||||||
return anim;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
*
|
*
|
||||||
* gtk_knob_animation_free()
|
* gtk_knob_animation_free()
|
||||||
@@ -912,8 +908,8 @@ void
|
|||||||
gtk_knob_animation_free(GtkKnobAnim *anim) {
|
gtk_knob_animation_free(GtkKnobAnim *anim) {
|
||||||
g_return_if_fail (anim != NULL);
|
g_return_if_fail (anim != NULL);
|
||||||
|
|
||||||
if (anim->pixbuf)
|
if (anim->image)
|
||||||
g_object_unref (anim->pixbuf);
|
cairo_surface_destroy(anim->image);
|
||||||
|
|
||||||
g_free (anim);
|
g_free (anim);
|
||||||
}
|
}
|
||||||
|
|||||||
31
gtkknob.h
31
gtkknob.h
@@ -3,7 +3,7 @@
|
|||||||
* Most of this code comes from gAlan 0.2.0, copyright (C) 1999
|
* Most of this code comes from gAlan 0.2.0, copyright (C) 1999
|
||||||
* Tony Garnock-Jones, with modifications by Sean Bolton,
|
* Tony Garnock-Jones, with modifications by Sean Bolton,
|
||||||
* copyright (C) 2004, and minor modifications by William Weston,
|
* copyright (C) 2004, and minor modifications by William Weston,
|
||||||
* copyright (C) 2007, Tomasz Moń, copyright (C) 2009
|
* copyright (C) 2007, Tomasz Moń, copyright (C) 2009-2011
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU General Public License
|
* modify it under the terms of the GNU General Public License
|
||||||
@@ -36,9 +36,16 @@ typedef struct _GtkKnob GtkKnob;
|
|||||||
typedef struct _GtkKnobClass GtkKnobClass;
|
typedef struct _GtkKnobClass GtkKnobClass;
|
||||||
typedef struct _GtkKnobAnim GtkKnobAnim;
|
typedef struct _GtkKnobAnim GtkKnobAnim;
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
GTK_KNOB_UPDATE_CONTINUOUS,
|
||||||
|
GTK_KNOB_UPDATE_DISCONTINUOUS,
|
||||||
|
GTK_KNOB_UPDATE_DELAYED
|
||||||
|
} GtkKnobUpdateType;
|
||||||
|
|
||||||
/* better to make this an object and let widgets ref/deref it perhaps */
|
/* better to make this an object and let widgets ref/deref it perhaps */
|
||||||
struct _GtkKnobAnim {
|
struct _GtkKnobAnim {
|
||||||
GdkPixbuf *pixbuf;
|
cairo_surface_t *image;
|
||||||
gint width; /* derived from image width */
|
gint width; /* derived from image width */
|
||||||
gint height; /* derived from image height. */
|
gint height; /* derived from image height. */
|
||||||
gint frame_width; /* derived from pixbuf (width / height) or provided override for rectangular frames */
|
gint frame_width; /* derived from pixbuf (width / height) or provided override for rectangular frames */
|
||||||
@@ -47,6 +54,7 @@ typedef struct _GtkKnobAnim GtkKnobAnim;
|
|||||||
struct _GtkKnob {
|
struct _GtkKnob {
|
||||||
GtkWidget widget;
|
GtkWidget widget;
|
||||||
|
|
||||||
|
GdkWindow *event_window;
|
||||||
/* update policy (GTK_UPDATE_[CONTINUOUS/DELAYED/DISCONTINUOUS]) */
|
/* update policy (GTK_UPDATE_[CONTINUOUS/DELAYED/DISCONTINUOUS]) */
|
||||||
guint policy : 2;
|
guint policy : 2;
|
||||||
|
|
||||||
@@ -61,14 +69,10 @@ typedef struct _GtkKnobAnim GtkKnobAnim;
|
|||||||
GtkKnobAnim *anim;
|
GtkKnobAnim *anim;
|
||||||
gint width, height;
|
gint width, height;
|
||||||
|
|
||||||
GdkBitmap *mask;
|
|
||||||
GdkGC *mask_gc;
|
|
||||||
GdkGC *red_gc;
|
|
||||||
|
|
||||||
/* Old values from adjustment stored so we know when something changes */
|
/* Old values from adjustment stored so we know when something changes */
|
||||||
gfloat old_value;
|
gdouble old_value;
|
||||||
gfloat old_lower;
|
gdouble old_lower;
|
||||||
gfloat old_upper;
|
gdouble old_upper;
|
||||||
|
|
||||||
/* The adjustment object that stores the data for this knob */
|
/* The adjustment object that stores the data for this knob */
|
||||||
GtkAdjustment *adjustment;
|
GtkAdjustment *adjustment;
|
||||||
@@ -82,16 +86,11 @@ typedef struct _GtkKnobAnim GtkKnobAnim;
|
|||||||
extern GtkWidget *gtk_knob_new(GtkAdjustment *adjustment, GtkKnobAnim *anim);
|
extern GtkWidget *gtk_knob_new(GtkAdjustment *adjustment, GtkKnobAnim *anim);
|
||||||
extern GType gtk_knob_get_type(void);
|
extern GType gtk_knob_get_type(void);
|
||||||
extern GtkAdjustment *gtk_knob_get_adjustment(GtkKnob *knob);
|
extern GtkAdjustment *gtk_knob_get_adjustment(GtkKnob *knob);
|
||||||
extern void gtk_knob_set_update_policy(GtkKnob *knob, GtkUpdateType policy);
|
extern void gtk_knob_set_update_policy(GtkKnob *knob, GtkKnobUpdateType policy);
|
||||||
extern void gtk_knob_set_adjustment(GtkKnob *knob, GtkAdjustment *adjustment);
|
extern void gtk_knob_set_adjustment(GtkKnob *knob, GtkAdjustment *adjustment);
|
||||||
|
|
||||||
GtkKnobAnim *gtk_knob_animation_new_from_inline(const guint8 *pixbuf);
|
GtkKnobAnim *gtk_knob_animation_new_from_inline();
|
||||||
GtkKnobAnim *gtk_knob_animation_new_from_file_full(gchar *filename,
|
|
||||||
gint frame_width,
|
|
||||||
gint width,
|
|
||||||
gint height);
|
|
||||||
|
|
||||||
GtkKnobAnim *gtk_knob_animation_new_from_file(gchar *filename);
|
|
||||||
void gtk_knob_set_animation (GtkKnob *knob, GtkKnobAnim *anim);
|
void gtk_knob_set_animation (GtkKnob *knob, GtkKnobAnim *anim);
|
||||||
void gtk_knob_animation_free(GtkKnobAnim *anim);
|
void gtk_knob_animation_free(GtkKnobAnim *anim);
|
||||||
|
|
||||||
|
|||||||
35
gui.c
35
gui.c
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2009 Tomasz Moń <desowin@gmail.com>
|
* Copyright (c) 2009-2011 Tomasz Moń <desowin@gmail.com>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -15,16 +15,16 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <gtk/gtk.h>
|
#include <gtk/gtk.h>
|
||||||
|
#include <glib-object.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "gdigi.h"
|
#include "gdigi.h"
|
||||||
#include "gui.h"
|
#include "gui.h"
|
||||||
#include "effects.h"
|
#include "effects.h"
|
||||||
#include "preset.h"
|
#include "preset.h"
|
||||||
#include "gtkknob.h"
|
#include "gtkknob.h"
|
||||||
#include "knob.h"
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
GtkObject *widget;
|
GObject *widget;
|
||||||
|
|
||||||
/* used for combo boxes, if widget isn't combo box, then both value and x are -1 */
|
/* used for combo boxes, if widget isn't combo box, then both value and x are -1 */
|
||||||
gint value; /**< effect type value */
|
gint value; /**< effect type value */
|
||||||
@@ -254,7 +254,7 @@ void toggled_cb(GtkToggleButton *button, Effect *effect)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \param widget GtkObject to add to widget tree
|
* \param widget GObject to add to widget tree
|
||||||
* \param id object controlled ID
|
* \param id object controlled ID
|
||||||
* \param position object controlled position
|
* \param position object controlled position
|
||||||
* \param value effect value type (if widget is GtkComboBox, otherwise -1)
|
* \param value effect value type (if widget is GtkComboBox, otherwise -1)
|
||||||
@@ -262,7 +262,7 @@ void toggled_cb(GtkToggleButton *button, Effect *effect)
|
|||||||
*
|
*
|
||||||
* Adds widget to widget tree.
|
* Adds widget to widget tree.
|
||||||
**/
|
**/
|
||||||
static WidgetTreeElem *widget_tree_add(GtkObject *widget, gint id, gint position, gint value, gint x)
|
static WidgetTreeElem *widget_tree_add(GObject *widget, gint id, gint position, gint value, gint x)
|
||||||
{
|
{
|
||||||
GList *list;
|
GList *list;
|
||||||
WidgetTreeElem *el;
|
WidgetTreeElem *el;
|
||||||
@@ -386,7 +386,7 @@ gboolean apply_current_preset_to_gui(gpointer data)
|
|||||||
GtkWidget *create_table(EffectSettings *settings, gint amt, GHashTable *widget_table)
|
GtkWidget *create_table(EffectSettings *settings, gint amt, GHashTable *widget_table)
|
||||||
{
|
{
|
||||||
GtkWidget *table, *label, *widget, *knob;
|
GtkWidget *table, *label, *widget, *knob;
|
||||||
GtkObject *adj;
|
GtkAdjustment *adj;
|
||||||
int x;
|
int x;
|
||||||
|
|
||||||
if (widget_table != NULL) {
|
if (widget_table != NULL) {
|
||||||
@@ -418,7 +418,8 @@ GtkWidget *create_table(EffectSettings *settings, gint amt, GHashTable *widget_t
|
|||||||
g_signal_connect(G_OBJECT(widget), "output", G_CALLBACK(custom_value_output_cb), settings[x].values);
|
g_signal_connect(G_OBJECT(widget), "output", G_CALLBACK(custom_value_output_cb), settings[x].values);
|
||||||
}
|
}
|
||||||
|
|
||||||
widget_tree_add(adj, settings[x].id, settings[x].position, -1, -1);
|
widget_tree_add(G_OBJECT(adj), settings[x].id,
|
||||||
|
settings[x].position, -1, -1);
|
||||||
gtk_table_attach(GTK_TABLE(table), label, 0, 1, x, x+1, GTK_SHRINK, GTK_SHRINK, 2, 2);
|
gtk_table_attach(GTK_TABLE(table), label, 0, 1, x, x+1, GTK_SHRINK, GTK_SHRINK, 2, 2);
|
||||||
gtk_table_attach(GTK_TABLE(table), knob, 1, 2, x, x+1, GTK_SHRINK, GTK_SHRINK, 2, 2);
|
gtk_table_attach(GTK_TABLE(table), knob, 1, 2, x, x+1, GTK_SHRINK, GTK_SHRINK, 2, 2);
|
||||||
gtk_table_attach(GTK_TABLE(table), widget, 2, 3, x, x+1, GTK_SHRINK, GTK_SHRINK, 2, 2);
|
gtk_table_attach(GTK_TABLE(table), widget, 2, 3, x, x+1, GTK_SHRINK, GTK_SHRINK, 2, 2);
|
||||||
@@ -449,7 +450,7 @@ GtkWidget *create_on_off_button(Effect *effect)
|
|||||||
button = gtk_check_button_new_with_label(effect->label);
|
button = gtk_check_button_new_with_label(effect->label);
|
||||||
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), FALSE);
|
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), FALSE);
|
||||||
g_signal_connect(G_OBJECT(button), "toggled", G_CALLBACK(toggled_cb), effect);
|
g_signal_connect(G_OBJECT(button), "toggled", G_CALLBACK(toggled_cb), effect);
|
||||||
widget_tree_add(GTK_OBJECT(button), effect->id, effect->position, -1, -1);
|
widget_tree_add(G_OBJECT(button), effect->id, effect->position, -1, -1);
|
||||||
return button;
|
return button;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -548,12 +549,13 @@ GtkWidget *create_widget_container(EffectGroup *group, gint amt, gint id, gint p
|
|||||||
for (x = 0; x<amt; x++) {
|
for (x = 0; x<amt; x++) {
|
||||||
if (group[x].label) {
|
if (group[x].label) {
|
||||||
if (combo_box == NULL) {
|
if (combo_box == NULL) {
|
||||||
combo_box = gtk_combo_box_new_text();
|
combo_box = gtk_combo_box_text_new();
|
||||||
gtk_container_add(GTK_CONTAINER(vbox), combo_box);
|
gtk_container_add(GTK_CONTAINER(vbox), combo_box);
|
||||||
g_signal_connect(G_OBJECT(combo_box), "changed", G_CALLBACK(combo_box_changed_cb), group);
|
g_signal_connect(G_OBJECT(combo_box), "changed", G_CALLBACK(combo_box_changed_cb), group);
|
||||||
g_object_set_data(G_OBJECT(combo_box), "vbox", vbox);
|
g_object_set_data(G_OBJECT(combo_box), "vbox", vbox);
|
||||||
}
|
}
|
||||||
gtk_combo_box_append_text(GTK_COMBO_BOX(combo_box), group[x].label);
|
gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(combo_box),
|
||||||
|
NULL, group[x].label);
|
||||||
cmbox_no++;
|
cmbox_no++;
|
||||||
|
|
||||||
if ((group[x].settings != NULL) && (group[x].settings_amt > 0)) {
|
if ((group[x].settings != NULL) && (group[x].settings_amt > 0)) {
|
||||||
@@ -568,7 +570,7 @@ GtkWidget *create_widget_container(EffectGroup *group, gint amt, gint id, gint p
|
|||||||
settings->position = position;
|
settings->position = position;
|
||||||
settings->child = widget;
|
settings->child = widget;
|
||||||
|
|
||||||
widget_tree_add(GTK_OBJECT(combo_box), id, position, group[x].type, x);
|
widget_tree_add(G_OBJECT(combo_box), id, position, group[x].type, x);
|
||||||
|
|
||||||
name = g_strdup_printf("SettingsGroup%d", cmbox_no);
|
name = g_strdup_printf("SettingsGroup%d", cmbox_no);
|
||||||
g_object_set_data_full(G_OBJECT(combo_box), name, settings, ((GDestroyNotify)effect_settings_group_free));
|
g_object_set_data_full(G_OBJECT(combo_box), name, settings, ((GDestroyNotify)effect_settings_group_free));
|
||||||
@@ -783,11 +785,11 @@ static void show_store_preset_window(GtkWidget *window, gchar *default_name)
|
|||||||
table = gtk_table_new(2, 2, FALSE);
|
table = gtk_table_new(2, 2, FALSE);
|
||||||
gtk_container_add(GTK_CONTAINER(vbox), table);
|
gtk_container_add(GTK_CONTAINER(vbox), table);
|
||||||
|
|
||||||
cmbox = gtk_combo_box_new_text();
|
cmbox = gtk_combo_box_text_new();
|
||||||
names = query_preset_names(PRESETS_USER);
|
names = query_preset_names(PRESETS_USER);
|
||||||
for (x=0; x<g_strv_length(names); x++) {
|
for (x=0; x<g_strv_length(names); x++) {
|
||||||
gchar *title = g_strdup_printf("%d - %s", x+1, names[x]);
|
gchar *title = g_strdup_printf("%d - %s", x+1, names[x]);
|
||||||
gtk_combo_box_append_text(GTK_COMBO_BOX(cmbox), title);
|
gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(cmbox), NULL, title);
|
||||||
g_free(title);
|
g_free(title);
|
||||||
}
|
}
|
||||||
g_strfreev(names);
|
g_strfreev(names);
|
||||||
@@ -1166,7 +1168,7 @@ void gui_create(Device *device)
|
|||||||
notebook = gtk_notebook_new();
|
notebook = gtk_notebook_new();
|
||||||
gtk_box_pack_start(GTK_BOX(hbox), notebook, TRUE, TRUE, 2);
|
gtk_box_pack_start(GTK_BOX(hbox), notebook, TRUE, TRUE, 2);
|
||||||
|
|
||||||
knob_anim = gtk_knob_animation_new_from_inline(knob_pixbuf);
|
knob_anim = gtk_knob_animation_new_from_inline();
|
||||||
|
|
||||||
widget_tree = g_tree_new_full(widget_tree_key_compare_func,
|
widget_tree = g_tree_new_full(widget_tree_key_compare_func,
|
||||||
NULL, /* key compare data */
|
NULL, /* key compare data */
|
||||||
@@ -1242,9 +1244,10 @@ gboolean unsupported_device_dialog(Device **device)
|
|||||||
"Please take a look at gdigi's HACKING file.");
|
"Please take a look at gdigi's HACKING file.");
|
||||||
gtk_container_add(GTK_CONTAINER(vbox), label);
|
gtk_container_add(GTK_CONTAINER(vbox), label);
|
||||||
|
|
||||||
combo_box = gtk_combo_box_new_text();
|
combo_box = gtk_combo_box_text_new();
|
||||||
for (x=0; x<n_supported_devices; x++) {
|
for (x=0; x<n_supported_devices; x++) {
|
||||||
gtk_combo_box_append_text(GTK_COMBO_BOX(combo_box), supported_devices[x]->name);
|
gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(combo_box),
|
||||||
|
NULL, supported_devices[x]->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
gtk_container_add(GTK_CONTAINER(vbox), combo_box);
|
gtk_container_add(GTK_CONTAINER(vbox), combo_box);
|
||||||
|
|||||||
Reference in New Issue
Block a user