1 /*
2 * Sweep, a sound wave editor.
3 *
4 * Copyright (C) 2000 Conrad Parker
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19 */
20
21 #ifdef HAVE_CONFIG_H
22 # include <config.h>
23 #endif
24
25 #include <stdio.h>
26 #include <string.h>
27 #include <stdlib.h>
28
29 #include <gtk/gtk.h>
30
31 #include "callbacks.h"
32
33 #include <sweep/sweep_i18n.h>
34 #include <sweep/sweep_types.h>
35 #include <sweep/sweep_undo.h>
36 #include <sweep/sweep_sample.h>
37 #include <sweep/sweep_typeconvert.h>
38
39 #include "sample.h"
40 #include "interface.h"
41 #include "edit.h"
42 #include "head.h"
43 #include "sample-display.h"
44 #include "play.h"
45 #include "driver.h"
46 #include "undo_dialog.h"
47 #include "paste_dialogs.h"
48 #include "print.h"
49 #include "record.h"
50 #include "file_dialogs.h"
51
52 /*
53 * Default zooming parameters.
54 *
55 * DEFAULT_ZOOM sets the ratio for zooming. Each time zoom_in is
56 * called, the view is adjusted to be 1/DEFAULT_ZOOM its current
57 * length. Each time zoom_out is called, the view is adjusted to
58 * DEFAULT_ZOOM times its current length.
59 *
60 * If you alter this, make sure
61 * (DEFAULT_ZOOM - 1) * DEFAULT_MIN_ZOOM > 1
62 *
63 * where DEFAULT_MIN_ZOOM is defined in view.c
64 */
65 #define DEFAULT_ZOOM 2.0
66
67 #define ZOOM_FRAMERATE 10
68
69 /* Sample creation */
70
71 void
sample_new_empty_cb(GtkWidget * widget,gpointer data)72 sample_new_empty_cb (GtkWidget * widget, gpointer data)
73 {
74 sw_view * view = (sw_view *)data;
75
76 if (view == NULL) {
77 create_sample_new_dialog_defaults (NULL);
78 } else {
79 create_sample_new_dialog_like (view->sample);
80 }
81 }
82
83 void
sample_new_copy_cb(GtkWidget * widget,gpointer data)84 sample_new_copy_cb (GtkWidget * widget, gpointer data)
85 {
86 sw_sample * ns;
87 SampleDisplay * sd = SAMPLE_DISPLAY(data);
88 sw_sample * s;
89 sw_view * v;
90
91 s = sd->view->sample;
92
93 if(!s) return;
94
95 ns = sample_new_copy(s);
96
97 while (ns->color == s->color) {
98 ns->color = (random()) % VIEW_COLOR_MAX;
99 }
100
101 v = view_new_all (ns, 1.0);
102 sample_add_view (ns, v);
103
104 sample_bank_add(ns);
105 }
106
107 /* Generic repeater */
108
109 static void
view_init_repeater(sw_view * view,GtkFunction function,gpointer data)110 view_init_repeater (sw_view * view, GtkFunction function, gpointer data)
111 {
112 function (data);
113 if (view->repeater_tag <= 0) {
114 view->repeater_tag = g_timeout_add ((guint32)1000/ZOOM_FRAMERATE,
115 (GSourceFunc) function, data);
116 }
117 }
118
119 void
repeater_released_cb(GtkWidget * widget,gpointer data)120 repeater_released_cb (GtkWidget * widget, gpointer data)
121 {
122 sw_view * view = (sw_view *)data;
123
124 if (view->repeater_tag > 0) {
125 g_source_remove(view->repeater_tag);
126 view->repeater_tag = 0;
127 }
128 }
129
130 /* View */
131
132 void
view_new_all_cb(GtkWidget * widget,gpointer data)133 view_new_all_cb (GtkWidget * widget, gpointer data)
134 {
135 SampleDisplay * sd = SAMPLE_DISPLAY(data);
136 sw_sample * s;
137 sw_view * v;
138
139 s = sd->view->sample;
140 v = view_new_all(s, 1.0);
141
142 sample_add_view (s, v);
143 }
144
145 void
view_new_cb(GtkWidget * widget,gpointer data)146 view_new_cb (GtkWidget * widget, gpointer data)
147 {
148 SampleDisplay * sd = SAMPLE_DISPLAY(data);
149 sw_sample * s;
150 sw_view * view, * v;
151
152 v = sd->view;
153 s = v->sample;
154
155 view = view_new (s, v->start, v->end, s->play_head->gain);
156
157 sample_add_view (s, view);
158 }
159
160 void
view_close_cb(GtkWidget * widget,gpointer data)161 view_close_cb (GtkWidget * widget, gpointer data)
162 {
163 SampleDisplay * sd = SAMPLE_DISPLAY(data);
164 sw_view * v;
165
166 v = sd->view;
167
168 view_close(v);
169 }
170
171 void
exit_cb(GtkWidget * widget,gpointer data)172 exit_cb (GtkWidget * widget, gpointer data)
173 {
174 sweep_quit ();
175 }
176
177 /* Tools */
178 void
set_tool_cb(GtkWidget * widget,gpointer data)179 set_tool_cb (GtkWidget * widget, gpointer data)
180 {
181 #if 0
182 gint tool = (gint)data;
183
184 /* current_tool = tool;*/
185 #endif
186 g_print ("NOOOOOOOOOOOOOO global current_tool\n");
187 }
188
189 void
view_set_tool_cb(GtkWidget * widget,gpointer data)190 view_set_tool_cb (GtkWidget * widget, gpointer data)
191 {
192 sw_view * view = (sw_view *)data;
193 sw_tool_t tool;
194
195 tool = (sw_tool_t)
196 GPOINTER_TO_INT(g_object_get_data (G_OBJECT(widget), "default"));
197
198 view->current_tool = tool;
199
200 view_refresh_tool_buttons (view);
201 }
202
203 /* Zooming */
204
205 static gboolean
zoom_in_step(gpointer data)206 zoom_in_step (gpointer data)
207 {
208 sw_view * view = (sw_view *)data;
209
210 view_zoom_in (view, DEFAULT_ZOOM);
211
212 return TRUE;
213 }
214
215 void
zoom_in_cb(GtkWidget * widget,gpointer data)216 zoom_in_cb (GtkWidget * widget, gpointer data)
217 {
218 sw_view * view = (sw_view *)data;
219 view_zoom_in (view, DEFAULT_ZOOM);
220 }
221
222 static gboolean
zoom_out_step(gpointer data)223 zoom_out_step (gpointer data)
224 {
225 sw_view * view = (sw_view *)data;
226
227 view_zoom_out (view, DEFAULT_ZOOM);
228
229 return TRUE;
230 }
231
232 void
zoom_out_cb(GtkWidget * widget,gpointer data)233 zoom_out_cb (GtkWidget * widget, gpointer data)
234 {
235 sw_view * view = (sw_view *)data;
236 view_zoom_out (view, DEFAULT_ZOOM);
237 }
238
239
240 void
zoom_in_pressed_cb(GtkWidget * widget,gpointer data)241 zoom_in_pressed_cb (GtkWidget * widget, gpointer data)
242 {
243 sw_view * view = (sw_view *)data;
244
245 view_zoom_in (view, DEFAULT_ZOOM);
246 view_init_repeater (view, (GtkFunction)zoom_in_step, data);
247 }
248
249 void
zoom_out_pressed_cb(GtkWidget * widget,gpointer data)250 zoom_out_pressed_cb (GtkWidget * widget, gpointer data)
251 {
252 sw_view * view = (sw_view *)data;
253
254 view_zoom_out (view, DEFAULT_ZOOM);
255 view_init_repeater (view, (GtkFunction)zoom_out_step, data);
256 }
257
258 void
zoom_to_sel_cb(GtkWidget * widget,gpointer data)259 zoom_to_sel_cb (GtkWidget * widget, gpointer data)
260 {
261 SampleDisplay * sd = SAMPLE_DISPLAY(data);
262 sw_view * v = sd->view;
263
264 view_zoom_to_sel (v);
265 }
266
267 void
zoom_left_cb(GtkWidget * widget,gpointer data)268 zoom_left_cb (GtkWidget * widget, gpointer data)
269 {
270 SampleDisplay * sd = SAMPLE_DISPLAY(data);
271 sw_view * v = sd->view;
272
273 view_zoom_left (v);
274 }
275
276 void
zoom_right_cb(GtkWidget * widget,gpointer data)277 zoom_right_cb (GtkWidget * widget, gpointer data)
278 {
279 SampleDisplay * sd = SAMPLE_DISPLAY(data);
280 sw_view * v = sd->view;
281
282 view_zoom_right (v);
283 }
284
285 void
zoom_all_cb(GtkWidget * widget,gpointer data)286 zoom_all_cb (GtkWidget * widget, gpointer data)
287 {
288 sw_view * v = (sw_view *)data;
289
290 view_zoom_all (v);
291 }
292
293 /* XXX: dump this ?? */
294 void
zoom_2_1_cb(GtkWidget * widget,gpointer data)295 zoom_2_1_cb (GtkWidget * widget, gpointer data)
296 {
297 SampleDisplay * sd = SAMPLE_DISPLAY(data);
298 sw_sample * s;
299
300 s = sd->view->sample;
301
302 view_set_ends(sd->view,
303 s->sounddata->nr_frames / 4,
304 3 * s->sounddata->nr_frames / 4);
305 }
306
307 void
zoom_norm_cb(GtkWidget * widget,gpointer data)308 zoom_norm_cb (GtkWidget * widget, gpointer data)
309 {
310 SampleDisplay * sd = SAMPLE_DISPLAY(data);
311 sw_view * view = sd->view;
312
313 view_zoom_normal (view);
314 }
315
316 void
zoom_1to1_cb(GtkWidget * widget,gpointer data)317 zoom_1to1_cb (GtkWidget * widget, gpointer data)
318 {
319 SampleDisplay * sd = SAMPLE_DISPLAY(data);
320
321 view_zoom_length (sd->view, sd->width);
322 view_center_on (sd->view, sd->view->sample->user_offset);
323 }
324
325 void
zoom_center_cb(GtkWidget * widget,gpointer data)326 zoom_center_cb (GtkWidget * widget, gpointer data)
327 {
328 SampleDisplay * sd = SAMPLE_DISPLAY(data);
329
330 view_center_on (sd->view, sd->view->sample->user_offset);
331 }
332
333 void
zoom_combo_changed_cb(GtkWidget * widget,gpointer data)334 zoom_combo_changed_cb (GtkWidget * widget, gpointer data)
335 {
336 sw_view * view = (sw_view *)data;
337 gchar * text;
338 sw_time_t zoom_time;
339 sw_framecount_t zoom_length;
340
341 text = (gchar *) gtk_entry_get_text (GTK_ENTRY(widget));
342
343 if (!strcmp (text, "All")) {
344 view_zoom_all (view);
345 } else {
346 zoom_time = (sw_time_t)strtime_to_seconds (text);
347 if (zoom_time != -1.0) {
348 zoom_length =
349 time_to_frames (view->sample->sounddata->format, zoom_time);
350
351 view_zoom_length (view, zoom_length);
352
353 /* Work around a bug, probably in gtkcombo, whereby all the other
354 * widgets sometimes lost input after choosing a zoom */
355 gtk_widget_grab_focus (view->display);
356 }
357 }
358 }
359
360 /* Device config */
361
362 void
device_config_cb(GtkWidget * widget,gpointer data)363 device_config_cb (GtkWidget * widget, gpointer data)
364 {
365 device_config ();
366 }
367
368 /* Sample */
369
370 void
sample_set_color_cb(GtkWidget * widget,gpointer data)371 sample_set_color_cb (GtkWidget * widget, gpointer data)
372 {
373 sw_view * view = (sw_view *) data;
374 gint color;
375
376 color = GPOINTER_TO_INT(g_object_get_data (G_OBJECT(widget), "default"));
377 sample_set_color (view->sample, color);
378 }
379
380 /* Playback */
381
382 void
follow_toggled_cb(GtkWidget * widget,gpointer data)383 follow_toggled_cb (GtkWidget * widget, gpointer data)
384 {
385 sw_view * view = (sw_view *) data;
386 gboolean active;
387
388 active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(widget));
389 view_set_following (view, active);
390 }
391
392 void
follow_toggle_cb(GtkWidget * widget,gpointer data)393 follow_toggle_cb (GtkWidget * widget, gpointer data)
394 {
395 sw_view * view = (sw_view *)data;
396 view_set_following (view, !view->following);
397 }
398
399 void
loop_toggled_cb(GtkWidget * widget,gpointer data)400 loop_toggled_cb (GtkWidget * widget, gpointer data)
401 {
402 sw_view * view = (sw_view *) data;
403 gboolean active;
404
405 active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(widget));
406 sample_set_looping (view->sample, active);
407 }
408
409 void
loop_toggle_cb(GtkWidget * widget,gpointer data)410 loop_toggle_cb (GtkWidget * widget, gpointer data)
411 {
412 sw_view * view = (sw_view *)data;
413 sample_set_looping (view->sample, !view->sample->play_head->looping);
414 }
415
416 void
playrev_toggled_cb(GtkWidget * widget,gpointer data)417 playrev_toggled_cb (GtkWidget * widget, gpointer data)
418 {
419 sw_view * view = (sw_view *) data;
420 gboolean active;
421
422 active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(widget));
423 sample_set_playrev (view->sample, active);
424 }
425
426 void
playrev_toggle_cb(GtkWidget * widget,gpointer data)427 playrev_toggle_cb (GtkWidget * widget, gpointer data)
428 {
429 sw_view * view = (sw_view *)data;
430 sample_set_playrev (view->sample, !view->sample->play_head->reverse);
431 }
432
433 void
mute_toggled_cb(GtkWidget * widget,gpointer data)434 mute_toggled_cb (GtkWidget * widget, gpointer data)
435 {
436 sw_view * view = (sw_view *) data;
437 gboolean active;
438
439 active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(widget));
440 sample_set_mute (view->sample, active);
441 }
442
443 void
mute_toggle_cb(GtkWidget * widget,gpointer data)444 mute_toggle_cb (GtkWidget * widget, gpointer data)
445 {
446 sw_view * view = (sw_view *)data;
447 sample_set_mute (view->sample, !view->sample->play_head->mute);
448 }
449
450 void
monitor_toggled_cb(GtkWidget * widget,gpointer data)451 monitor_toggled_cb (GtkWidget * widget, gpointer data)
452 {
453 sw_view * view = (sw_view *) data;
454 gboolean active;
455
456 active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(widget));
457 sample_set_monitor (view->sample, active);
458 }
459
460 void
monitor_toggle_cb(GtkWidget * widget,gpointer data)461 monitor_toggle_cb (GtkWidget * widget, gpointer data)
462 {
463 sw_view * view = (sw_view *)data;
464 sample_set_monitor (view->sample, !view->sample->play_head->monitor);
465 }
466
467 void
play_view_button_cb(GtkWidget * widget,gpointer data)468 play_view_button_cb (GtkWidget * widget, gpointer data)
469 {
470 sw_view * view = (sw_view *) data;
471 sw_head * head = view->sample->play_head;
472 gboolean was_restricted = head->restricted;
473
474 head_set_rate (head, 1.0);
475 /* head_set_restricted (head, FALSE);*/
476
477 if (head->going && (head->scrubbing || !was_restricted)) {
478 pause_playback_cb (widget, data);
479 } else {
480 play_view_all (view);
481 }
482 }
483
484 void
play_view_cb(GtkWidget * widget,gpointer data)485 play_view_cb (GtkWidget * widget, gpointer data)
486 {
487 sw_view * view = (sw_view *) data;
488 sw_head * head = view->sample->play_head;
489
490 head_set_rate (head, 1.0);
491 /* head_set_restricted (head, FALSE);*/
492
493 if (head->going) {
494 pause_playback_cb (widget, data);
495 } else {
496 play_view_all (view);
497 }
498 }
499
500 void
play_view_sel_button_cb(GtkWidget * widget,gpointer data)501 play_view_sel_button_cb (GtkWidget * widget, gpointer data)
502 {
503 sw_view * view = (sw_view *) data;
504 sw_head * head = view->sample->play_head;
505 gboolean was_restricted = head->restricted;
506
507 if (view->sample->sounddata->sels == NULL) {
508 play_view_cb (widget, data);
509 return;
510 }
511
512 head_set_rate (head, 1.0);
513 /* head_set_restricted (head, TRUE);*/
514
515 if (head->going && (head->scrubbing || was_restricted)) {
516 pause_playback_cb (widget, data);
517 } else {
518 play_view_sel (view);
519 }
520 }
521
522 void
play_view_sel_cb(GtkWidget * widget,gpointer data)523 play_view_sel_cb (GtkWidget * widget, gpointer data)
524 {
525 sw_view * view = (sw_view *) data;
526 sw_head * head = view->sample->play_head;
527
528 if (view->sample->sounddata->sels == NULL) {
529 play_view_cb (widget, data);
530 return;
531 }
532
533 head_set_rate (head, 1.0);
534 /* head_set_restricted (head, TRUE);*/
535
536 if (head->going) {
537 pause_playback_cb (widget, data);
538 } else {
539 play_view_sel (view);
540 }
541 }
542
543 void
pause_playback_cb(GtkWidget * widget,gpointer data)544 pause_playback_cb (GtkWidget * widget, gpointer data)
545 {
546 sw_view * view = (sw_view *)data;
547
548 pause_playback (view->sample);
549 }
550
551 void
stop_playback_cb(GtkWidget * widget,gpointer data)552 stop_playback_cb (GtkWidget * widget, gpointer data)
553 {
554 sw_view * view = (sw_view *)data;
555
556 stop_playback (view->sample);
557 }
558
559 void
preview_cut_cb(GtkWidget * widget,gpointer data)560 preview_cut_cb (GtkWidget * widget, gpointer data)
561 {
562 sw_view * view = (sw_view *) data;
563
564 sample_refresh_playmode (view->sample);
565
566 if (view->sample->sounddata->sels != NULL) {
567 play_preview_cut (view);
568 } else {
569 play_preroll (view);
570 }
571 }
572
573 void
preroll_cb(GtkWidget * widget,gpointer data)574 preroll_cb (GtkWidget * widget, gpointer data)
575 {
576 sw_view * view = (sw_view *) data;
577
578 sample_refresh_playmode (view->sample);
579
580 play_preroll (view);
581 }
582
583 /* Record */
584
585 void
show_rec_dialog_cb(GtkWidget * widget,gpointer data)586 show_rec_dialog_cb (GtkWidget * widget, gpointer data)
587 {
588 sw_view * view = (sw_view *)data;
589
590 rec_dialog_create (view->sample);
591 }
592
593 /* Transport */
594
595 static gboolean
rewind_step(gpointer data)596 rewind_step (gpointer data)
597 {
598 sw_sample * sample = (sw_sample *)data;
599 gint step;
600
601 step = sample->sounddata->format->rate; /* 1 second */
602 sample_set_playmarker (sample, sample->user_offset - step, TRUE);
603
604 return TRUE;
605 }
606
607 static gboolean
ffwd_step(gpointer data)608 ffwd_step (gpointer data)
609 {
610 sw_sample * sample = (sw_sample *)data;
611 gint step;
612
613 step = sample->sounddata->format->rate; /* 1 second */
614 sample_set_playmarker (sample, sample->user_offset + step, TRUE);
615
616 return TRUE;
617 }
618
619 void
page_back_cb(GtkWidget * widget,gpointer data)620 page_back_cb (GtkWidget * widget, gpointer data)
621 {
622 sw_view * view = (sw_view *)data;
623 sw_sample * sample = view->sample;
624 gint step;
625
626 step = MIN(sample->sounddata->format->rate, (view->end - view->start));
627 sample_set_playmarker (sample, sample->user_offset - step, TRUE);
628 }
629
630 void
page_fwd_cb(GtkWidget * widget,gpointer data)631 page_fwd_cb (GtkWidget * widget, gpointer data)
632 {
633 sw_view * view = (sw_view *)data;
634 sw_sample * sample = view->sample;
635 gint step;
636
637 step = MIN(sample->sounddata->format->rate, (view->end - view->start));
638 sample_set_playmarker (sample, sample->user_offset + step, TRUE);
639 }
640
641 void
rewind_pressed_cb(GtkWidget * widget,gpointer data)642 rewind_pressed_cb (GtkWidget * widget, gpointer data)
643 {
644 sw_view * view = (sw_view *)data;
645 sw_sample * sample = view->sample;
646
647 view_init_repeater (view, (GtkFunction)rewind_step, sample);
648 }
649
650 void
ffwd_pressed_cb(GtkWidget * widget,gpointer data)651 ffwd_pressed_cb (GtkWidget * widget, gpointer data)
652 {
653 sw_view * view = (sw_view *)data;
654 sw_sample * sample = view->sample;
655
656 view_init_repeater (view, (GtkFunction)ffwd_step, sample);
657 }
658
659 void
goto_start_cb(GtkWidget * widget,gpointer data)660 goto_start_cb (GtkWidget * widget, gpointer data)
661 {
662 sw_view * view = (sw_view *)data;
663 sw_sample * sample = view->sample;
664
665 sample_set_scrubbing (sample, FALSE);
666 sample_set_playmarker (sample, 0, TRUE);
667 }
668
669 void
goto_start_of_view_cb(GtkWidget * widget,gpointer data)670 goto_start_of_view_cb (GtkWidget * widget, gpointer data)
671 {
672 sw_view * view = (sw_view *)data;
673 sw_sample * sample = view->sample;
674
675 sample_set_scrubbing (sample, FALSE);
676 sample_set_playmarker (sample, view->start, TRUE);
677 }
678
679 void
goto_end_of_view_cb(GtkWidget * widget,gpointer data)680 goto_end_of_view_cb (GtkWidget * widget, gpointer data)
681 {
682 sw_view * view = (sw_view *)data;
683 sw_sample * sample = view->sample;
684
685 sample_set_scrubbing (sample, FALSE);
686 sample_set_playmarker (sample, view->end, TRUE);
687 }
688
689 void
goto_end_cb(GtkWidget * widget,gpointer data)690 goto_end_cb (GtkWidget * widget, gpointer data)
691 {
692 sw_view * view = (sw_view *)data;
693 sw_sample * sample = view->sample;
694
695 sample_set_scrubbing (sample, FALSE);
696 sample_set_playmarker (sample, sample->sounddata->nr_frames, TRUE);
697 }
698
699 /* Interface elements: sample display, scrollbars etc. */
700
701 void
sd_sel_changed_cb(GtkWidget * widget)702 sd_sel_changed_cb (GtkWidget * widget)
703 {
704 SampleDisplay * sd = SAMPLE_DISPLAY(widget);
705
706 sample_refresh_views (sd->view->sample);
707 }
708
709 void
sd_win_changed_cb(GtkWidget * widget)710 sd_win_changed_cb (GtkWidget * widget)
711 {
712 SampleDisplay * sd = SAMPLE_DISPLAY(widget);
713 sw_view * v = sd->view;
714
715 g_signal_handlers_block_matched (GTK_OBJECT(v->adj), G_SIGNAL_MATCH_DATA, 0,
716 0, 0, 0, v);
717 view_fix_adjustment (sd->view);
718
719 g_signal_handlers_unblock_matched (GTK_OBJECT(v->adj), G_SIGNAL_MATCH_DATA, 0,
720 0, 0, 0, v);
721 view_refresh_hruler (v);
722 }
723
724 void
adj_changed_cb(GtkWidget * widget,gpointer data)725 adj_changed_cb (GtkWidget * widget, gpointer data)
726 {
727 sw_view * v = (sw_view *)data;
728 SampleDisplay * sd = SAMPLE_DISPLAY(v->display);
729 GtkAdjustment * adj = GTK_ADJUSTMENT(v->adj);
730
731 g_signal_handlers_block_matched (GTK_OBJECT(GTK_OBJECT(sd)), G_SIGNAL_MATCH_DATA, 0,
732 0, 0, 0, v);
733 sample_display_set_window(sd,
734 (gint)adj->value,
735 (gint)(adj->value + adj->page_size));
736
737 g_signal_handlers_unblock_matched (GTK_OBJECT(GTK_OBJECT(sd)), G_SIGNAL_MATCH_DATA, 0,
738 0, 0, 0, v);
739 view_refresh_hruler (v);
740 }
741
742 void
adj_value_changed_cb(GtkWidget * widget,gpointer data)743 adj_value_changed_cb (GtkWidget * widget, gpointer data)
744 {
745 sw_view * v = (sw_view *)data;
746 SampleDisplay * sd = SAMPLE_DISPLAY(v->display);
747 GtkAdjustment * adj = GTK_ADJUSTMENT(v->adj);
748
749 if (!v->sample->play_head->going || !v->following) {
750
751 g_signal_handlers_block_matched (GTK_OBJECT(GTK_OBJECT(sd)), G_SIGNAL_MATCH_DATA, 0,
752 0, 0, 0, v);
753 sample_display_set_window(sd,
754 (gint)adj->value,
755 (gint)(adj->value + adj->page_size));
756 g_signal_handlers_unblock_matched (GTK_OBJECT(GTK_OBJECT(sd)), G_SIGNAL_MATCH_DATA, 0,
757 0, 0, 0, v);
758 }
759
760 if (v->following) {
761 if (v->sample->user_offset < adj->value ||
762 v->sample->user_offset > adj->value + adj->page_size)
763 sample_set_playmarker (v->sample, adj->value + adj->page_size/2, TRUE);
764 }
765
766 view_refresh_hruler (v);
767 }
768
769 /* Selection */
770
771 void
select_invert_cb(GtkWidget * widget,gpointer data)772 select_invert_cb (GtkWidget * widget, gpointer data)
773 {
774 SampleDisplay * sd = SAMPLE_DISPLAY(data);
775
776 sample_selection_invert (sd->view->sample);
777 }
778
779 void
select_all_cb(GtkWidget * widget,gpointer data)780 select_all_cb (GtkWidget * widget, gpointer data)
781 {
782 SampleDisplay * sd = SAMPLE_DISPLAY(data);
783
784 sample_selection_select_all (sd->view->sample);
785 }
786
787 void
select_none_cb(GtkWidget * widget,gpointer data)788 select_none_cb (GtkWidget * widget, gpointer data)
789 {
790 SampleDisplay * sd = SAMPLE_DISPLAY(data);
791
792 sample_selection_select_none (sd->view->sample);
793 }
794
795 void
selection_halve_cb(GtkWidget * widget,gpointer data)796 selection_halve_cb (GtkWidget * widget, gpointer data)
797 {
798 SampleDisplay * sd = SAMPLE_DISPLAY(data);
799
800 sample_selection_halve (sd->view->sample);
801 }
802
803 void
selection_double_cb(GtkWidget * widget,gpointer data)804 selection_double_cb (GtkWidget * widget, gpointer data)
805 {
806 SampleDisplay * sd = SAMPLE_DISPLAY(data);
807
808 sample_selection_double (sd->view->sample);
809 }
810
811 void
select_shift_left_cb(GtkWidget * widget,gpointer data)812 select_shift_left_cb (GtkWidget * widget, gpointer data)
813 {
814 SampleDisplay * sd = SAMPLE_DISPLAY(data);
815
816 sample_selection_shift_left (sd->view->sample);
817 }
818
819 void
select_shift_right_cb(GtkWidget * widget,gpointer data)820 select_shift_right_cb (GtkWidget * widget, gpointer data)
821 {
822 SampleDisplay * sd = SAMPLE_DISPLAY(data);
823
824 sample_selection_shift_right (sd->view->sample);
825 }
826
827 /* Undo / Redo */
828
829 void
show_undo_dialog_cb(GtkWidget * widget,gpointer data)830 show_undo_dialog_cb (GtkWidget * widget, gpointer data)
831 {
832 sw_view * view = (sw_view *)data;
833
834 undo_dialog_create (view->sample);
835 }
836
837 void
undo_cb(GtkWidget * widget,gpointer data)838 undo_cb (GtkWidget * widget, gpointer data)
839 {
840 sw_view * view = (sw_view *)data;
841
842 undo_current (view->sample);
843 }
844
845 void
redo_cb(GtkWidget * widget,gpointer data)846 redo_cb (GtkWidget * widget, gpointer data)
847 {
848 sw_view * view = (sw_view *)data;
849
850 redo_current (view->sample);
851 }
852
853 void
cancel_cb(GtkWidget * widget,gpointer data)854 cancel_cb (GtkWidget * widget, gpointer data)
855 {
856 sw_view * view = (sw_view *)data;
857
858 cancel_active_op (view->sample);
859 }
860
861 /* Edit */
862
863 void
copy_cb(GtkWidget * widget,gpointer data)864 copy_cb (GtkWidget * widget, gpointer data)
865 {
866 sw_view * view = (sw_view *)data;
867 sw_sample * s = view->sample;
868
869 do_copy (s);
870 }
871
872 void
cut_cb(GtkWidget * widget,gpointer data)873 cut_cb (GtkWidget * widget, gpointer data)
874 {
875 sw_view * view = (sw_view *)data;
876 sw_sample * s = view->sample;
877
878 do_cut (s);
879 }
880
881 void
clear_cb(GtkWidget * widget,gpointer data)882 clear_cb (GtkWidget * widget, gpointer data)
883 {
884 sw_view * view = (sw_view *)data;
885 sw_sample * s = view->sample;
886
887 do_clear (s);
888 }
889
890 void
delete_cb(GtkWidget * widget,gpointer data)891 delete_cb (GtkWidget * widget, gpointer data)
892 {
893 sw_view * view = (sw_view *)data;
894 sw_sample * s = view->sample;
895
896 do_delete (s);
897 }
898
899 void
crop_cb(GtkWidget * widget,gpointer data)900 crop_cb (GtkWidget * widget, gpointer data)
901 {
902 sw_view * view = (sw_view *)data;
903 sw_sample * s = view->sample;
904
905 do_crop (s);
906 }
907
908 void
paste_cb(GtkWidget * widget,gpointer data)909 paste_cb (GtkWidget * widget, gpointer data)
910 {
911 sw_view * view = (sw_view *)data;
912 sw_sample * s = view->sample;
913
914 do_paste_insert (s);
915 }
916
917 void
paste_mix_cb(GtkWidget * widget,gpointer data)918 paste_mix_cb (GtkWidget * widget, gpointer data)
919 {
920 sw_view * view = (sw_view *)data;
921 sw_sample * s = view->sample;
922
923 if (clipboard_width() > 0) {
924 create_paste_mix_dialog (s);
925 } else {
926 sample_set_tmp_message (s, _("Clipboard empty"));
927 }
928 }
929
930 void
paste_xfade_cb(GtkWidget * widget,gpointer data)931 paste_xfade_cb (GtkWidget * widget, gpointer data)
932 {
933 sw_view * view = (sw_view *)data;
934 sw_sample * s = view->sample;
935
936 if (clipboard_width() > 0) {
937 create_paste_xfade_dialog (s);
938 } else {
939 sample_set_tmp_message (s, _("Clipboard empty"));
940 }
941 }
942
943 void
paste_as_new_cb(GtkWidget * widget,gpointer data)944 paste_as_new_cb (GtkWidget * widget, gpointer data)
945 {
946 sw_sample * s;
947 sw_view * v;
948
949 s = do_paste_as_new ();
950
951 if (s) {
952 v = view_new_all (s, 1.0);
953 sample_add_view (s, v);
954 sample_bank_add (s);
955 }
956 }
957
958 void
show_info_dialog_cb(GtkWidget * widget,gpointer data)959 show_info_dialog_cb (GtkWidget * widget, gpointer data)
960 {
961 sw_view * view = (sw_view *)data;
962
963 sample_show_info_dialog (view->sample);
964 }
965
966 void
hide_window_cb(GtkAccelGroup * accel_group,GObject * acceleratable,guint keyval,GdkModifierType modifier)967 hide_window_cb (GtkAccelGroup *accel_group,
968 GObject *acceleratable,
969 guint keyval,
970 GdkModifierType modifier)
971 {
972 if (GTK_IS_WINDOW(acceleratable))
973 g_signal_emit_by_name(G_OBJECT(acceleratable), "hide");
974 }
975
976 void
close_window_cb(GtkAccelGroup * accel_group,GObject * acceleratable,guint keyval,GdkModifierType modifier)977 close_window_cb (GtkAccelGroup *accel_group,
978 GObject *acceleratable,
979 guint keyval,
980 GdkModifierType modifier)
981 {
982 if (GTK_IS_WINDOW(acceleratable))
983 g_signal_emit_by_name(G_OBJECT(acceleratable), "destroy");
984 }
985
986 /*
987 * Prime the label with the largest string then fetch the width.
988 * now we can lock the width via gtk_widget_set_usize() to prevent
989 * the wobble wobble caused by using a variable width font.
990 * Just a hackish replacement for the belated gtk_label_set_width_chars()
991 * don't try this at home kids, karma will get you. (oh well.. it works.)
992 */
993 void
hack_max_label_width_cb(GtkWidget * widget,GtkStyle * previous_style,gpointer user_data)994 hack_max_label_width_cb (GtkWidget *widget,
995 GtkStyle *previous_style,
996 gpointer user_data)
997 {
998 PangoRectangle logical_rect, ink_rect;
999 const gchar *saved;
1000
1001 if (!GTK_IS_LABEL(widget))
1002 return;
1003 saved = strdup(gtk_label_get_text(GTK_LABEL(widget)));
1004 gtk_label_set_text(GTK_LABEL(widget), "00:00:00.0000");
1005 pango_layout_get_extents (gtk_label_get_layout (GTK_LABEL(widget)), &ink_rect, &logical_rect);
1006 gtk_label_set_text(GTK_LABEL(widget), saved);
1007
1008 if(saved != NULL)
1009 g_free((gpointer)saved);
1010 gtk_widget_set_usize(GTK_WIDGET(widget), PANGO_PIXELS (ink_rect.width), -1);
1011 }
1012
1013 void
hack_max_combo_width_cb(GtkWidget * widget,GtkStyle * previous_style,gpointer user_data)1014 hack_max_combo_width_cb (GtkWidget *widget,
1015 GtkStyle *previous_style,
1016 gpointer user_data)
1017 {
1018 PangoRectangle logical_rect, ink_rect;
1019 GtkWidget *tmp_entry;
1020
1021 if (!GTK_IS_ENTRY(widget))
1022 return;
1023 tmp_entry = gtk_entry_new();
1024 gtk_widget_set_style(tmp_entry, gtk_style_copy(widget->style));
1025 gtk_entry_set_text(GTK_ENTRY(tmp_entry), "00:00:00.0000.");
1026
1027 pango_layout_get_extents (gtk_entry_get_layout (GTK_ENTRY(tmp_entry)), &ink_rect, &logical_rect);
1028 gtk_widget_destroy(tmp_entry);
1029
1030 gtk_widget_set_usize(GTK_WIDGET(GTK_ENTRY(widget)), PANGO_PIXELS (ink_rect.width), -1);
1031 }
1032
1033 #if GTK_CHECK_VERSION (2, 10, 0)
1034
1035 void
recent_chooser_menu_activated_cb(GtkRecentChooser * chooser,gpointer user_data)1036 recent_chooser_menu_activated_cb(GtkRecentChooser *chooser,
1037 gpointer user_data)
1038 {
1039 gchar *uri = NULL;
1040 gchar *path = NULL;
1041
1042 uri = gtk_recent_chooser_get_current_uri(chooser);
1043 path = g_filename_from_uri(uri, NULL, NULL);
1044 sample_load(path);
1045
1046 g_free (path);
1047 }
1048
1049 #endif
1050