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