add_image(VFrame *frm, int ww, int hh, int vcmdl)
{
VIFrame *vifrm = new VIFrame(ww, hh, vcmdl);
- VFrame *img = *vifrm;
- img->transfer_from(frm);
+ vifrm->vfrm->transfer_from(frm);
images.append(vifrm);
}
void VIconThread::remove_vicon(int i)
{
+ if( t_heap[i] == solo ) solo = 0;
int sz = t_heap.size();
for( int k; (k=2*(i+1)) < sz; i=k ) {
if( t_heap[k]->age > t_heap[k-1]->age ) --k;
vt->wdw->set_active_subwindow(0);
}
-ViewPopup *VIconThread::new_view_window()
+ViewPopup *VIconThread::new_view_window(ViewPopup *vpopup)
{
BC_WindowBase *parent = wdw->get_parent();
XineramaScreenInfo *info = parent->get_xinerama_info(-1);
wdw->get_root_coordinates(vx, vy, &rx, &ry);
rx += (rx >= cx ? -view_w+viewing->w/4 : viewing->w-viewing->w/4);
ry += (ry >= cy ? -view_h+viewing->h/4 : viewing->h-viewing->h/4);
- ViewPopup *vwin = new ViewPopup(this, rx, ry, view_w, view_h);
- wdw->set_active_subwindow(vwin);
- return vwin;
+ if( vpopup )
+ vpopup->reposition_window(rx, ry, view_w, view_h);
+ else
+ vpopup = new ViewPopup(this, rx, ry, view_w, view_h);
+ wdw->set_active_subwindow(vpopup);
+ return vpopup;
}
{
if( viewing == vicon && !this->vicon ) return;
this->vicon = vicon;
- if( interrupted )
- update_view(0);
+ if( interrupted ) update_view(vicon ? 1 : 0);
}
{
if( viewing ) viewing->stop_audio();
delete view_win; view_win = 0;
- if( (viewing=vicon) != 0 ) {
- view_win = new_view_window();
- view_win->draw_vframe(viewing->frame());
+ VFrame *vfrm;
+ if( (viewing=vicon) != 0 && (vfrm=viewing->frame()) != 0 ) {
+ view_win = new_view_window(0);
+ view_win->draw_vframe(vfrm);
view_win->flash(0);
view_win->show_window();
if( do_audio ) vicon->start_audio();
int VIconThread::zoom_scale(int dir)
{
+ VFrame *vfrm;
+ if( !viewing || !view_win || !(vfrm=viewing->frame()) ) return 0;
int view_h = this->view_h;
view_h += dir*view_h/10 + dir;
bclamp(view_h, 16,512);
this->view_h = view_h;
this->view_w = view_h * vw/vh;
- stop_viewing();
+ new_view_window(view_win);
+ view_win->draw_vframe(vfrm);
+ view_win->flash(1);
return 1;
}
int draw_img = visible(vicon, x, y);
int draw_win = view_win && viewing == vicon ? 1 : 0;
if( !draw_img && !draw_win ) return 0;
- if( !vicon->frame() ) return 0;
+ VFrame *vfrm = vicon->frame();
+ if( !vfrm ) return 0;
if( draw_img ) {
vicon->draw_vframe(this, wdw, x, y);
img_dirty = 1;
}
if( draw_win ) {
- view_win->draw_vframe(vicon->frame());
+ view_win->draw_vframe(vfrm);
win_dirty = 1;
}
return 1;
seq_no = 0; now = 0;
while( !interrupted ) {
if( viewing != vicon )
- update_view();
+ update_view(1);
if( !solo ) {
VIcon *next = low_vicon();
- while( next && next->age < draw_flash ) {
+ while( !interrupted && next && next->age < draw_flash ) {
if( show_vicon(next) ) break;
add_vicon(next);
next = low_vicon();
draw_flash = seq_no * 1000. / refresh_rate;
}
if( viewing != vicon )
- update_view();
+ update_view(1);
drawing_stopped();
interrupted = -1;
wdw->unlock_window();
{
mkdir(dir,0777);
for( int i=0; i<images.size(); ++i ) {
+ VFrame *vfrm = images[i]->vfrm;
+ if( !vfrm ) continue;
char fn[1024]; sprintf(fn,"%s/img%05d.png",dir,i);
printf("\r%s",fn);
- VFrame *img = *images[i];
- img->write_png(fn);
+ vfrm->write_png(fn);
}
printf("\n");
}