#include "edlsession.h"
#include "keys.h"
#include "language.h"
+#include "mainerror.h"
#include "mwindow.h"
+#include "mwindowgui.h"
#include "plugin.h"
#include "pluginserver.h"
#include "theme.h"
background = 0;
background_path = 0;
loop_playback = 0;
+ pending_config = 0;
}
void TitleWindow::done_event(int result)
int w1 = italic->get_w();
add_tool(bold = new TitleBold(client, this, x, y + 50));
if( bold->get_w() > w1 ) w1 = bold->get_w();
+
add_tool(drag = new TitleDrag(client, this, x, y + 80));
if( drag->get_w() > w1 ) w1 = drag->get_w();
- if( client->config.drag )
- grab(client->server->mwindow->cwindow->gui);
+ if( client->config.drag ) {
+ if( !grab(client->server->mwindow->cwindow->gui) )
+ eprintf("drag enabled, but compositor already grabbed\n");
+ }
x += w1 + margin;
add_tool(justify_title = new BC_Title(x, y, _("Justify:")));
x1 += motion_title->get_w()+margin;
motion = new TitleMotion(client, this, x1, y);
motion->create_objects();
- add_tool(loop = new TitleLoop(client, x, y1));
+ add_tool(loop = new TitleLoop(client, this, x, y1));
x = margin; y = y1 + loop->get_h()+20;
add_tool(dropshadow_title = new BC_Title(x, y, _("Drop shadow:")));
x += stroker->get_w() + margin;
#endif
y += outline_title->get_h() + margin;
- add_tool(timecode = new TitleTimecode(client, x1=x, y));
+ add_tool(timecode = new TitleTimecode(client, this, x1=x, y));
x += timecode->get_w() + margin;
- add_tool(timecode_format = new TitleTimecodeFormat(client, x, y,
+ add_tool(timecode_format = new TitleTimecodeFormat(client, this, x, y,
Units::print_time_format(client->config.timecode_format, string)));
timecode_format->create_objects();
y += timecode_format->get_h() + margin;
client->server->mwindow->theme, this, background_path,
x, y, "", _("background media"), _("Select background media path")));
x += background_browse->get_w() + 3*margin;
- add_tool(loop_playback = new TitleLoopPlayback(client, x, y));
+ add_tool(loop_playback = new TitleLoopPlayback(client, this, x, y));
y += loop_playback->get_h() + 10;
x = 10;
return 1;
}
+void TitleWindow::send_configure_change()
+{
+ pending_config = 0;
+ client->send_configure_change();
+}
+int TitleWindow::check_configure_change(int ret)
+{
+ if( pending_config && !grab_event_count() )
+ send_configure_change();
+ return ret;
+}
+
int TitleWindow::grab_event(XEvent *event)
{
+ switch( event->type ) {
+ case ButtonPress: break;
+ case ButtonRelease: break;
+ case MotionNotify: break;
+ default:
+ return check_configure_change(0);
+ }
+
MWindow *mwindow = client->server->mwindow;
CWindowGUI *cwindow_gui = mwindow->cwindow->gui;
CWindowCanvas *canvas = cwindow_gui->canvas;
- int cx, cy; canvas->get_canvas()->get_relative_cursor_xy(cx, cy);
- if( cx < mwindow->theme->ccanvas_x ) return 0;
- if( cx >= mwindow->theme->ccanvas_x+mwindow->theme->ccanvas_w ) return 0;
- if( cy < mwindow->theme->ccanvas_y ) return 0;
- if( cy >= mwindow->theme->ccanvas_y+mwindow->theme->ccanvas_h ) return 0;
+ int cx, cy; cwindow_gui->get_relative_cursor(cx, cy);
+ cx -= mwindow->theme->ccanvas_x;
+ cy -= mwindow->theme->ccanvas_y;
+
+ if( !dragging ) {
+ if( cx < 0 || cx >= mwindow->theme->ccanvas_w ||
+ cy < 0 || cy >= mwindow->theme->ccanvas_h )
+ return check_configure_change(0);
+ }
switch( event->type ) {
case ButtonPress:
if( !dragging ) break;
return 1;
case ButtonRelease:
- if( !dragging ) return 0;
+ if( !dragging ) return check_configure_change(0);
dragging = 0;
return 1;
case MotionNotify:
- if( dragging ) break;
+ if( !dragging ) return check_configure_change(0);
+ break;
default:
- return 0;
+ return check_configure_change(0);
}
float cursor_x = cx, cursor_y = cy;
this->title_y->update((int64_t)(client->config.title_y += dy));
}
}
- client->send_configure_change();
+ if( !grab_event_count() )
+ send_configure_change();
+ else
+ pending_config = 1;
return 1;
}
font->update(fonts.values[current_font]->get_text());
strcpy(client->config.font, fonts.values[current_font]->get_text());
check_style(client->config.font,1);
- client->send_configure_change();
+ send_configure_change();
}
void TitleWindow::next_font()
font->update(fonts.values[current_font]->get_text());
strcpy(client->config.font, fonts.values[current_font]->get_text());
check_style(client->config.font,1);
- client->send_configure_change();
+ send_configure_change();
}
int TitleWindow::insert_ibeam(const char *txt, int ofs)
ibeam = client->config.wlen;
text->wset_selection(-1, -1, ibeam);
text->update(client->config.wtext);
- client->send_configure_change();
+ send_configure_change();
return 1;
}
client->config.size = atoi(window->sizes.get(current_index)->get_text());
window->size->update(client->config.size);
- client->send_configure_change();
+ window->send_configure_change();
return 1;
}
client->config.size = atoi(window->sizes.get(current_index)->get_text());
window->size->update(client->config.size);
- client->send_configure_change();
+ window->send_configure_change();
return 1;
}
client->config.style =
(client->config.style & ~BC_FONT_BOLD) |
(get_value() ? BC_FONT_BOLD : 0);
- client->send_configure_change();
+ window->send_configure_change();
return 1;
}
client->config.style =
(client->config.style & ~BC_FONT_ITALIC) |
(get_value() ? BC_FONT_ITALIC : 0);
- client->send_configure_change();
+ window->send_configure_change();
return 1;
}
{
client->config.size = atol(get_text());
//printf("TitleSize::handle_event 1 %s\n", get_text());
- client->send_configure_change();
+ window->send_configure_change();
return 1;
}
void TitleSize::update(int size)
int TitlePitch::handle_event()
{
*value = atol(get_text());
- client->send_configure_change();
+ window->send_configure_change();
return 1;
}
int TitleMotion::handle_event()
{
client->config.motion_strategy = client->text_to_motion(get_text());
- client->send_configure_change();
+ window->send_configure_change();
return 1;
}
-TitleLoop::TitleLoop(TitleMain *client, int x, int y)
+TitleLoop::TitleLoop(TitleMain *client, TitleWindow *window, int x, int y)
: BC_CheckBox(x, y, client->config.loop, _("Loop"))
{
this->client = client;
+ this->window = window;
}
int TitleLoop::handle_event()
{
client->config.loop = get_value();
- client->send_configure_change();
+ window->send_configure_change();
return 1;
}
-TitleTimecode::TitleTimecode(TitleMain *client, int x, int y)
+TitleTimecode::TitleTimecode(TitleMain *client, TitleWindow *window, int x, int y)
: BC_CheckBox(x, y, client->config.timecode, _("Stamp timecode"))
{
this->client = client;
+ this->window = window;
}
int TitleTimecode::handle_event()
{
return 1;
}
-TitleTimecodeFormat::TitleTimecodeFormat(TitleMain *client, int x, int y, const char *text)
+TitleTimecodeFormat::TitleTimecodeFormat(TitleMain *client, TitleWindow *window,
+ int x, int y, const char *text)
: BC_PopupMenu(x, y, 100, text, 1)
{
this->client = client;
+ this->window = window;
}
int TitleTimecodeFormat::handle_event()
{
client->config.timecode_format = Units::text_to_format(get_text());
- client->send_configure_change();
+ window->send_configure_change();
return 1;
}
int TitleFade::handle_event()
{
*value = atof(get_text());
- client->send_configure_change();
+ window->send_configure_change();
return 1;
}
{
strcpy(client->config.font, get_text());
window->check_style(client->config.font, 1);
- client->send_configure_change();
+ window->send_configure_change();
return 1;
}
if( text_len >= avail ) { // back off last utf8 char
char text[2*sizeof(client->config.wtext)];
strcpy(text, get_text());
- text_len = avail;
- while( text_len > 0 && (text[text_len-1] & 0xc0) == 0x80 )
- text[--text_len] = 0;
- if( text_len > 0 )
- text[--text_len] = 0;
+ text_len = avail;
+ while( text_len > 0 && (text[text_len-1] & 0xc0) == 0x80 )
+ text[--text_len] = 0;
+ if( text_len > 0 )
+ text[--text_len] = 0;
update(text);
}
int len = sizeof(client->config.wtext) / sizeof(wchar_t);
client->config.wtext[len-1] = 0;
client->config.wlen = wcslen(client->config.wtext);
window->update_stats();
- client->send_configure_change();
+ window->send_configure_change();
return 1;
}
TitleTextChars::TitleTextChars(int x, int y, int w)
TitleDropShadow::TitleDropShadow(TitleMain *client, TitleWindow *window, int x, int y)
- : BC_TumbleTextBox(window, (int64_t)client->config.dropshadow,
- (int64_t)-1000, (int64_t)1000, x, y, 70)
+ : BC_TumbleTextBox(window, client->config.dropshadow,
+ -1000, 1000, x, y, 70)
{
this->client = client;
this->window = window;
int TitleDropShadow::handle_event()
{
client->config.dropshadow = atol(get_text());
- client->send_configure_change();
+ window->send_configure_change();
return 1;
}
TitleOutline::TitleOutline(TitleMain *client, TitleWindow *window, int x, int y)
- : BC_TumbleTextBox(window, (int64_t)client->config.outline_size,
- (int64_t)0, (int64_t)1000, x, y, 70)
+ : BC_TumbleTextBox(window, client->config.outline_size,
+ 0.f, 1000.f, x, y, 70)
{
this->client = client;
this->window = window;
+ set_precision(1);
}
int TitleOutline::handle_event()
{
- client->config.outline_size = atol(get_text());
- client->send_configure_change();
+ client->config.outline_size = atof(get_text());
+ window->send_configure_change();
return 1;
}
TitleStroker::TitleStroker(TitleMain *client, TitleWindow *window, int x, int y)
- : BC_TumbleTextBox(window, (int64_t)client->config.stroke_width,
- (int64_t)0, (int64_t)1000, x, y, 70)
+ : BC_TumbleTextBox(window, client->config.stroke_width,
+ 0.f, 1000.f, x, y, 70)
{
this->client = client;
this->window = window;
+ set_precision(1);
}
int TitleStroker::handle_event()
{
client->config.style |= BC_FONT_OUTLINE;
else
client->config.style &= ~BC_FONT_OUTLINE;
- client->send_configure_change();
+ window->send_configure_change();
return 1;
}
TitleX::TitleX(TitleMain *client, TitleWindow *window, int x, int y)
- : BC_TumbleTextBox(window, (int64_t)client->config.title_x,
- (int64_t)-32767, (int64_t)32767, x, y, 50)
+ : BC_TumbleTextBox(window, client->config.title_x,
+ -32767.f, 32767.f, x, y, 50)
{
this->client = client;
this->window = window;
+ set_precision(1);
}
int TitleX::handle_event()
{
- client->config.title_x = atol(get_text());
- client->send_configure_change();
+ client->config.title_x = atof(get_text());
+ window->send_configure_change();
return 1;
}
TitleY::TitleY(TitleMain *client, TitleWindow *window, int x, int y)
- : BC_TumbleTextBox(window, (int64_t)client->config.title_y,
- (int64_t)-32767, (int64_t)32767, x, y, 50)
+ : BC_TumbleTextBox(window, client->config.title_y,
+ -32767.f, 32767.f, x, y, 50)
{
this->client = client;
this->window = window;
+ set_precision(1);
}
int TitleY::handle_event()
{
- client->config.title_y = atol(get_text());
- client->send_configure_change();
+ client->config.title_y = atof(get_text());
+ window->send_configure_change();
return 1;
}
TitleW::TitleW(TitleMain *client, TitleWindow *window, int x, int y)
- : BC_TumbleTextBox(window, (int64_t)client->config.title_w,
- (int64_t)0, (int64_t)32767, x, y, 50)
+ : BC_TumbleTextBox(window, client->config.title_w,
+ 0, 32767, x, y, 50)
{
this->client = client;
this->window = window;
int TitleW::handle_event()
{
client->config.title_w = atol(get_text());
- client->send_configure_change();
+ window->send_configure_change();
return 1;
}
TitleH::TitleH(TitleMain *client, TitleWindow *window, int x, int y)
- : BC_TumbleTextBox(window, (int64_t)client->config.title_h,
- (int64_t)0, (int64_t)32767, x, y, 50)
+ : BC_TumbleTextBox(window, client->config.title_h,
+ 0, 32767, x, y, 50)
{
this->client = client;
this->window = window;
int TitleH::handle_event()
{
client->config.title_h = atol(get_text());
- client->send_configure_change();
+ window->send_configure_change();
return 1;
}
TitleSpeed::TitleSpeed(TitleMain *client, TitleWindow *window, int x, int y)
- : BC_TumbleTextBox(window, (float)client->config.pixels_per_second,
- (float)0, (float)1000, x, y, 100)
+ : BC_TumbleTextBox(window, client->config.pixels_per_second,
+ 0.f, 1000.f, x, y, 100)
{
this->client = client;
+ this->window = window;
set_precision(2);
set_increment(10);
}
int TitleSpeed::handle_event()
{
client->config.pixels_per_second = atof(get_text());
- client->send_configure_change();
+ window->send_configure_change();
return 1;
}
{
client->config.hjustification = JUSTIFY_LEFT;
window->update_justification();
- client->send_configure_change();
+ window->send_configure_change();
return 1;
}
{
client->config.hjustification = JUSTIFY_CENTER;
window->update_justification();
- client->send_configure_change();
+ window->send_configure_change();
return 1;
}
{
client->config.hjustification = JUSTIFY_RIGHT;
window->update_justification();
- client->send_configure_change();
+ window->send_configure_change();
return 1;
}
{
client->config.vjustification = JUSTIFY_TOP;
window->update_justification();
- client->send_configure_change();
+ window->send_configure_change();
return 1;
}
{
client->config.vjustification = JUSTIFY_MID;
window->update_justification();
- client->send_configure_change();
+ window->send_configure_change();
return 1;
}
{
client->config.vjustification = JUSTIFY_BOTTOM;
window->update_justification();
- client->send_configure_change();
+ window->send_configure_change();
return 1;
}
window->flush();
window->unlock_window();
- client->send_configure_change();
+ window->send_configure_change();
return 1;
}
int TitleDrag::handle_event()
{
int value = get_value();
- client->config.drag = value;
- if( value )
- window->grab(client->server->mwindow->cwindow->gui);
+ CWindowGUI *cwindow_gui = client->server->mwindow->cwindow->gui;
+ if( value ) {
+ if( !window->grab(cwindow_gui) ) {
+ update(value = 0);
+ flicker(10,50);
+ }
+ }
else
- window->ungrab(client->server->mwindow->cwindow->gui);
- client->send_configure_change();
+ window->ungrab(cwindow_gui);
+ client->config.drag = value;
+ window->send_configure_change();
return 1;
}
int TitleBackground::handle_event()
{
client->config.background = get_value();
- client->send_configure_change();
+ window->send_configure_change();
return 1;
}
int TitleBackgroundPath::handle_event()
{
strncpy(client->config.background_path, get_text(), sizeof(client->config.background_path));
- client->send_configure_change();
+ window->send_configure_change();
return 1;
}
-TitleLoopPlayback::TitleLoopPlayback(TitleMain *client, int x, int y)
+TitleLoopPlayback::TitleLoopPlayback(TitleMain *client, TitleWindow *window, int x, int y)
: BC_CheckBox(x, y, client->config.loop_playback, _("Loop playback"))
{
this->client = client;
+ this->window = window;
}
int TitleLoopPlayback::handle_event()
{
client->config.loop_playback = get_value();
- client->send_configure_change();
+ window->send_configure_change();
return 1;
}
switch( popup_type ) {
case POPUP_FONT: {
int px, py;
- window->get_pop_cursor_xy(px ,py);
+ window->get_pop_cursor(px ,py);
window->fonts_popup->activate(px, py, 300,200);
return 1; }
case POPUP_COLOR: {
BC_Window *TitlePngPopup::new_gui()
{
- BC_DisplayInfo display_info;
- int x = display_info.get_abs_cursor_x();
- int y = display_info.get_abs_cursor_y();
+ MWindow *mwindow = client->server->mwindow;
+ int x, y; mwindow->gui->get_abs_cursor(x, y);
- BC_Window *gui = new BrowseButtonWindow(client->server->mwindow->theme,
+ BC_Window *gui = new BrowseButtonWindow(mwindow->theme,
x-25, y-100, window, "", _("Png file"), _("Png path"), 0);
- gui->create_objects();
+ gui->create_objects();
return gui;
}