From 5e3715ec449272335bab3419bf21ed4cd6d4bcbf Mon Sep 17 00:00:00 2001 From: Good Guy Date: Thu, 19 Oct 2017 17:12:15 -0600 Subject: [PATCH] font debug env var, drag fixes, cposer hide scrollbar, plugin tool tip --- cinelerra-5.1/Cinelerra_factory | 2 +- cinelerra-5.1/cinelerra/awindowgui.C | 2 +- cinelerra-5.1/cinelerra/cpanel.C | 4 +- cinelerra-5.1/cinelerra/cpanel.h | 4 + cinelerra-5.1/cinelerra/keyframegui.C | 97 ++++--------- cinelerra-5.1/cinelerra/plugintoggles.C | 9 +- cinelerra-5.1/cinelerra/trackcanvas.C | 31 ++-- cinelerra-5.1/cinelerra/vdevicex11.C | 19 ++- cinelerra-5.1/ffmpeg/plugin.opts | 2 +- cinelerra-5.1/guicast/bcdragwindow.C | 132 +++++------------- cinelerra-5.1/guicast/bcdragwindow.h | 5 +- cinelerra-5.1/guicast/bclistbox.C | 62 +++----- cinelerra-5.1/guicast/bcpopup.C | 70 ++-------- cinelerra-5.1/guicast/bcresources.C | 61 +++++--- cinelerra-5.1/guicast/bcresources.h | 3 +- cinelerra-5.1/guicast/bcwindow.C | 40 ++---- cinelerra-5.1/guicast/bcwindowbase.C | 20 +-- .../plugins/interpolate/picon_cinfinity.png | Bin 3546 -> 12810 bytes .../plugins/spherecam/picon_cinfinity.png | Bin 3035 -> 21388 bytes cinelerra-5.1/plugins/titler/titler.C | 16 ++- 20 files changed, 210 insertions(+), 369 deletions(-) diff --git a/cinelerra-5.1/Cinelerra_factory b/cinelerra-5.1/Cinelerra_factory index 97c2aa40..3cc787ad 100644 --- a/cinelerra-5.1/Cinelerra_factory +++ b/cinelerra-5.1/Cinelerra_factory @@ -37,7 +37,7 @@ - + diff --git a/cinelerra-5.1/cinelerra/awindowgui.C b/cinelerra-5.1/cinelerra/awindowgui.C index 1267c001..da146a61 100644 --- a/cinelerra-5.1/cinelerra/awindowgui.C +++ b/cinelerra-5.1/cinelerra/awindowgui.C @@ -1453,7 +1453,7 @@ AWindowAssets::AWindowAssets(MWindow *mwindow, AWindowGUI *gui, int x, int y, in 0, // If this listbox is a popup window LISTBOX_MULTIPLE, // Select one item or multiple items ICON_TOP, // Position of icon relative to text of each item - 1) // Allow drag + -1) // Allow drags, require shift for scrolling { this->mwindow = mwindow; this->gui = gui; diff --git a/cinelerra-5.1/cinelerra/cpanel.C b/cinelerra-5.1/cinelerra/cpanel.C index a62f0a7e..1e6ef8d3 100644 --- a/cinelerra-5.1/cinelerra/cpanel.C +++ b/cinelerra-5.1/cinelerra/cpanel.C @@ -415,11 +415,11 @@ int CPanelZoom::handle_event() int CPanelZoom::set_shown(int shown) { if( shown ) { - show_window(); + show(); update(gui->subwindow->canvas->get_zoom()); } else - hide_window(); + hide(); return 1; } diff --git a/cinelerra-5.1/cinelerra/cpanel.h b/cinelerra-5.1/cinelerra/cpanel.h index 7836d285..a3e19430 100644 --- a/cinelerra-5.1/cinelerra/cpanel.h +++ b/cinelerra-5.1/cinelerra/cpanel.h @@ -176,6 +176,10 @@ public: char *get_caption(); int handle_event(); int set_shown(int shown); + int show_window(int flush=1) { return 0; } + int hide_window(int flush=1) { return 0; } + int show(int flush=1) { return BC_SubWindow::show_window(flush); } + int hide(int flush=1) { return BC_SubWindow::hide_window(flush); } void update(float zoom); MWindow *mwindow; CPanel *gui; diff --git a/cinelerra-5.1/cinelerra/keyframegui.C b/cinelerra-5.1/cinelerra/keyframegui.C index 8e6019f0..d7d29741 100644 --- a/cinelerra-5.1/cinelerra/keyframegui.C +++ b/cinelerra-5.1/cinelerra/keyframegui.C @@ -53,8 +53,8 @@ KeyFrameThread::KeyFrameThread(MWindow *mwindow) is_factory = 0; preset_text[0] = 0; window_title[0] = 0; - column_titles[0] = (char*)"Parameter"; - column_titles[1] = (char*)"Value"; + column_titles[0] = (char*)_("Parameter"); + column_titles[1] = (char*)_("Value"); column_width[0] = 0; column_width[1] = 0; presets_data = new ArrayList; @@ -147,7 +147,7 @@ void KeyFrameThread::start_window(Plugin *plugin, KeyFrame *keyframe) this->keyframe = keyframe; this->plugin = plugin; plugin->calculate_title(plugin_title, 0); - sprintf(window_title, PROGRAM_NAME ": %s Keyframe", plugin_title); + sprintf(window_title, _("%s: %s Keyframe"), _(PROGRAM_NAME), plugin_title); // Load all the presets from disk char path[BCTEXTLEN]; @@ -479,11 +479,8 @@ void KeyFrameWindow::create_objects() add_subwindow(title1 = new BC_Title(theme->keyframe_list_x, - theme->keyframe_list_y - - BC_Title::calculate_h(this, (char*)"Py", LARGEFONT) - - theme->widget_border, - _("Keyframe parameters:"), - LARGEFONT)); + theme->keyframe_list_y - BC_Title::calculate_h(this, (char*)_("Py"), LARGEFONT) - + theme->widget_border, _("Keyframe parameters:"), LARGEFONT)); add_subwindow(keyframe_list = new KeyFrameList(thread, this, theme->keyframe_list_x, @@ -499,57 +496,31 @@ void KeyFrameWindow::create_objects() // theme->keyframe_text_y, // theme->keyframe_text_w)); add_subwindow(title3 = new BC_Title(theme->keyframe_value_x, - theme->keyframe_value_y - BC_Title::calculate_h(this, (char*)"P") - theme->widget_border, - _("Edit value:"))); - add_subwindow(value_text = new KeyFrameValue(thread, - this, - theme->keyframe_value_x, - theme->keyframe_value_y, - theme->keyframe_value_w)); - add_subwindow(all_toggle = new KeyFrameAll(thread, - this, - theme->keyframe_all_x, - theme->keyframe_all_y)); + theme->keyframe_value_y - BC_Title::calculate_h(this, (char*)"P") - + theme->widget_border, _("Edit value:"))); + add_subwindow(value_text = new KeyFrameValue(thread, this, + theme->keyframe_value_x, theme->keyframe_value_y, theme->keyframe_value_w)); + add_subwindow(all_toggle = new KeyFrameAll(thread, this, + theme->keyframe_all_x, theme->keyframe_all_y)); #endif - - - - add_subwindow(title4 = new BC_Title(theme->presets_list_x, - theme->presets_list_y - - BC_Title::calculate_h(this, (char*)"Py", LARGEFONT) - - theme->widget_border, - _("Presets:"), - LARGEFONT)); - add_subwindow(preset_list = new KeyFramePresetsList(thread, - this, - theme->presets_list_x, - theme->presets_list_y, - theme->presets_list_w, - theme->presets_list_h)); + add_subwindow(title4 = new BC_Title(theme->presets_list_x, theme->presets_list_y - + BC_Title::calculate_h(this, (char*)_("Py"), LARGEFONT) - + theme->widget_border, _("Presets:"), LARGEFONT)); + add_subwindow(preset_list = new KeyFramePresetsList(thread, this, + theme->presets_list_x, theme->presets_list_y, + theme->presets_list_w, theme->presets_list_h)); add_subwindow(title5 = new BC_Title(theme->presets_text_x, theme->presets_text_y - BC_Title::calculate_h(this, (char*)"P") - theme->widget_border, _("Preset title:"))); - add_subwindow(preset_text = new KeyFramePresetsText(thread, - this, - theme->presets_text_x, - theme->presets_text_y, - theme->presets_text_w)); - add_subwindow(delete_preset = new KeyFramePresetsDelete(thread, - this, - theme->presets_delete_x, - theme->presets_delete_y)); - add_subwindow(save_preset = new KeyFramePresetsSave(thread, - this, - theme->presets_save_x, - theme->presets_save_y)); - add_subwindow(apply_preset = new KeyFramePresetsApply(thread, - this, - theme->presets_apply_x, - theme->presets_apply_y)); - - - + add_subwindow(preset_text = new KeyFramePresetsText(thread, this, + theme->presets_text_x, theme->presets_text_y, theme->presets_text_w)); + add_subwindow(delete_preset = new KeyFramePresetsDelete(thread, this, + theme->presets_delete_x, theme->presets_delete_y)); + add_subwindow(save_preset = new KeyFramePresetsSave(thread, this, + theme->presets_save_x, theme->presets_save_y)); + add_subwindow(apply_preset = new KeyFramePresetsApply(thread, this, + theme->presets_apply_x, theme->presets_apply_y)); add_subwindow(new KeyFramePresetsOK(thread, this)); add_subwindow(new BC_CancelButton(this)); @@ -634,23 +605,13 @@ int KeyFrameWindow::resize_event(int w, int h) KeyFrameList::KeyFrameList(KeyFrameThread *thread, - KeyFrameWindow *window, - int x, - int y, - int w, - int h) - : BC_ListBox(x, - y, - w, - h, - LISTBOX_TEXT, - thread->keyframe_data, - thread->column_titles, - thread->column_width, - KEYFRAME_COLUMNS) + KeyFrameWindow *window, int x, int y, int w, int h) + : BC_ListBox(x, y, w, h, LISTBOX_TEXT, thread->keyframe_data, + thread->column_titles, thread->column_width, KEYFRAME_COLUMNS) { this->thread = thread; this->window = window; + set_master_column(1, 0); } int KeyFrameList::selection_changed() diff --git a/cinelerra-5.1/cinelerra/plugintoggles.C b/cinelerra-5.1/cinelerra/plugintoggles.C index f06cb94f..743620ca 100644 --- a/cinelerra-5.1/cinelerra/plugintoggles.C +++ b/cinelerra-5.1/cinelerra/plugintoggles.C @@ -28,15 +28,12 @@ PluginOn::PluginOn(MWindow *mwindow, int x, int y, Plugin *plugin) - : BC_Toggle(x, - y, - mwindow->theme->get_image_set("plugin_on"), - plugin->on) + : BC_Toggle(x, y, mwindow->theme->get_image_set("plugin_on"), plugin->on) { this->mwindow = mwindow; this->plugin = plugin; in_use = 1; - set_tooltip(_("On")); + set_tooltip(plugin->on ? _("Turn Off") : _("Turn On")); } int PluginOn::calculate_w(MWindow *mwindow) @@ -47,6 +44,7 @@ int PluginOn::calculate_w(MWindow *mwindow) void PluginOn::update(int x, int y, Plugin *plugin) { BC_Toggle::set_value(plugin->on, 0); + set_tooltip(plugin->on ? _("Turn Off") : _("Turn On")); reposition_window(x, y); this->plugin = plugin; in_use = 1; @@ -55,6 +53,7 @@ void PluginOn::update(int x, int y, Plugin *plugin) int PluginOn::handle_event() { plugin->on = get_value(); + set_tooltip(plugin->on ? _("Turn Off") : _("Turn On")); unlock_window(); mwindow->restart_brender(); mwindow->sync_parameters(CHANGE_EDL); diff --git a/cinelerra-5.1/cinelerra/trackcanvas.C b/cinelerra-5.1/cinelerra/trackcanvas.C index feff8a85..0e3ebc03 100644 --- a/cinelerra-5.1/cinelerra/trackcanvas.C +++ b/cinelerra-5.1/cinelerra/trackcanvas.C @@ -4507,10 +4507,12 @@ int TrackCanvas::do_edits(int cursor_x, int cursor_y, int button_press, int drag mwindow->edl->local_session->zoom_sample / mwindow->edl->session->sample_rate; + int cx, cy; + get_abs_cursor_xy(cx, cy); + cx -= mwindow->theme->get_image("clip_icon")->get_w() / 2, + cy -= mwindow->theme->get_image("clip_icon")->get_h() / 2; gui->drag_popup = new BC_DragWindow(gui, - mwindow->theme->get_image("clip_icon") /*, - get_abs_cursor_x(0) - mwindow->theme->get_image("clip_icon")->get_w() / 2, - get_abs_cursor_y(0) - mwindow->theme->get_image("clip_icon")->get_h() / 2 */); + mwindow->theme->get_image("clip_icon"), cx, cy); result = 1; } @@ -4619,19 +4621,22 @@ int TrackCanvas::do_plugins(int cursor_x, int cursor_y, int drag_start, frame = mwindow->theme->get_image("veffect_icon"); } } - - gui->drag_popup = new BC_DragWindow(gui, frame /*, - get_abs_cursor_x(0) - frame->get_w() / 2, - get_abs_cursor_y(0) - frame->get_h() / 2 */); + int cx, cy; + get_abs_cursor_xy(cx, cy); + cx -= frame->get_w() / 2; + cy -= frame->get_h() / 2; + gui->drag_popup = new BC_DragWindow(gui, frame, cx, cy); break; } case PLUGIN_SHAREDPLUGIN: - case PLUGIN_SHAREDMODULE: - gui->drag_popup = new BC_DragWindow(gui, - mwindow->theme->get_image("clip_icon") /*, - get_abs_cursor_x(0) - mwindow->theme->get_image("clip_icon")->get_w() / 2, - get_abs_cursor_y(0) - mwindow->theme->get_image("clip_icon")->get_h() / 2 */); - break; + case PLUGIN_SHAREDMODULE: { + VFrame *frame = mwindow->theme->get_image("clip_icon"); + int cx, cy; + get_abs_cursor_xy(cx, cy); + cx -= frame->get_w() / 2; + cy -= frame->get_h() / 2; + gui->drag_popup = new BC_DragWindow(gui, frame, cx, cy); + break; } } result = 1; diff --git a/cinelerra-5.1/cinelerra/vdevicex11.C b/cinelerra-5.1/cinelerra/vdevicex11.C index 793047ac..c0ca4b08 100644 --- a/cinelerra-5.1/cinelerra/vdevicex11.C +++ b/cinelerra-5.1/cinelerra/vdevicex11.C @@ -95,31 +95,28 @@ int VDeviceX11::open_input() // create overlay device->mwindow->gui->lock_window("VDeviceX11::close_all"); - screencap_border[0] = new BC_Popup(device->mwindow->gui, + screencap_border[0] = new BC_Popup(device->mwindow->gui, device->input_x - SCREENCAP_PIXELS, device->input_y - SCREENCAP_PIXELS, device->in_config->w + SCREENCAP_PIXELS * 2, SCREENCAP_PIXELS, SCREENCAP_COLOR, 1); - screencap_border[1] = new BC_Popup(device->mwindow->gui, + screencap_border[1] = new BC_Popup(device->mwindow->gui, device->input_x - SCREENCAP_PIXELS, device->input_y, SCREENCAP_PIXELS, device->in_config->h, SCREENCAP_COLOR, 1); - screencap_border[2] = new BC_Popup(device->mwindow->gui, + screencap_border[2] = new BC_Popup(device->mwindow->gui, device->input_x - SCREENCAP_PIXELS, device->input_y + device->in_config->h, device->in_config->w + SCREENCAP_PIXELS * 2, SCREENCAP_PIXELS, SCREENCAP_COLOR, 1); - screencap_border[3] = new BC_Popup(device->mwindow->gui, + screencap_border[3] = new BC_Popup(device->mwindow->gui, device->input_x + device->in_config->w, device->input_y, SCREENCAP_PIXELS, device->in_config->h, SCREENCAP_COLOR, 1); +usleep(500000); // avoids a bug in gnome-shell 2017/10/19 - for( int i=0; iset_bg_color(SCREENCAP_COLOR); - box->clear_box(0, 0, box->get_w(), box->get_h()); - box->flash(0); - box->show_window(); - } + for( int i=0; ishow_window(0); + device->mwindow->gui->flush(); device->mwindow->gui->unlock_window(); return 0; diff --git a/cinelerra-5.1/ffmpeg/plugin.opts b/cinelerra-5.1/ffmpeg/plugin.opts index aea62b6a..173a5a9e 100644 --- a/cinelerra-5.1/ffmpeg/plugin.opts +++ b/cinelerra-5.1/ffmpeg/plugin.opts @@ -30,7 +30,7 @@ aloop #amix #amovie #anequalizer -anoisesrc +#anoisesrc #anull #anullsink #anullsrc diff --git a/cinelerra-5.1/guicast/bcdragwindow.C b/cinelerra-5.1/guicast/bcdragwindow.C index 2eab2e17..355315bc 100644 --- a/cinelerra-5.1/guicast/bcdragwindow.C +++ b/cinelerra-5.1/guicast/bcdragwindow.C @@ -25,32 +25,14 @@ #include "vframe.h" #include -// Icon has to be offset so the cursor isn't directly over it. -// The cursor has to be over the target window for X to detect the right window. -#define DRAG_OFFSET_X 16 -#define DRAG_OFFSET_Y 16 - BC_DragWindow::BC_DragWindow(BC_WindowBase *parent_window, - BC_Pixmap *pixmap /*, - int icon_x, - int icon_y */) - : BC_Popup(parent_window, -// icon_x, -// icon_y, - parent_window->get_abs_cursor_x(0) + DRAG_OFFSET_X, - parent_window->get_abs_cursor_y(0) + DRAG_OFFSET_Y, - pixmap->get_w(), - pixmap->get_h(), - -1, - 0, - pixmap) + BC_Pixmap *pixmap, int icon_x, int icon_y) + : BC_Popup(parent_window, icon_x, icon_y, pixmap->get_w(), pixmap->get_h(), + -1, 0, pixmap) { - temp_frame = 0; drag_pixmap = 0; -// init_x = icon_x; -// init_y = icon_y; - init_x = parent_window->get_abs_cursor_x(0) + DRAG_OFFSET_X; - init_y = parent_window->get_abs_cursor_y(0) + DRAG_OFFSET_Y; + init_x = icon_x; + init_y = icon_y; end_x = BC_INFINITY; end_y = BC_INFINITY; icon_offset_x = init_x - parent_window->get_abs_cursor_x(0); @@ -61,26 +43,12 @@ BC_DragWindow::BC_DragWindow(BC_WindowBase *parent_window, BC_DragWindow::BC_DragWindow(BC_WindowBase *parent_window, - VFrame *frame /*, - int icon_x, - int icon_y */) - : BC_Popup(parent_window, -// icon_x, -// icon_y, - parent_window->get_abs_cursor_x(0) + DRAG_OFFSET_X, - parent_window->get_abs_cursor_y(0) + DRAG_OFFSET_Y, - frame->get_w(), - frame->get_h(), - -1, - 0, - prepare_frame(frame, parent_window)) + VFrame *frame, int icon_x, int icon_y) + : BC_Popup(parent_window, icon_x, icon_y, frame->get_w(), frame->get_h(), + -1, 0, prepare_frame(frame, parent_window)) { - delete temp_frame; // created in prepare_frame inside constructor - temp_frame = 0; -// init_x = icon_x; -// init_y = icon_y; - init_x = parent_window->get_abs_cursor_x(0) + DRAG_OFFSET_X; - init_y = parent_window->get_abs_cursor_y(0) + DRAG_OFFSET_Y; + init_x = icon_x; + init_y = icon_y; end_x = BC_INFINITY; end_y = BC_INFINITY; icon_offset_x = init_x - parent_window->get_abs_cursor_x(0); @@ -99,13 +67,8 @@ int BC_DragWindow::get_init_x(BC_WindowBase *parent_window, int icon_x) int output_x, temp = 0; Window tempwin; XTranslateCoordinates(parent_window->top_level->display, - parent_window->win, - parent_window->top_level->rootwin, - icon_x, - temp, - &output_x, - &temp, - &tempwin); + parent_window->win, parent_window->top_level->rootwin, + icon_x, temp, &output_x, &temp, &tempwin); return output_x; } @@ -114,22 +77,16 @@ int BC_DragWindow::get_init_y(BC_WindowBase *parent_window, int icon_y) int output_y, temp = 0; Window tempwin; XTranslateCoordinates(parent_window->top_level->display, - parent_window->win, - parent_window->top_level->rootwin, - temp, - icon_y, - &temp, - &output_y, - &tempwin); + parent_window->win, parent_window->top_level->rootwin, + temp, icon_y, &temp, &output_y, &tempwin); return output_y; } int BC_DragWindow::cursor_motion_event() { - reposition_window(get_abs_cursor_x(0) + icon_offset_x, - get_abs_cursor_y(0) + icon_offset_y, - get_w(), - get_h()); + int cx, cy; + get_abs_cursor_xy(cx, cy); + reposition_window(cx + icon_offset_x, cy + icon_offset_y, get_w(), get_h()); flush(); return 1; } @@ -148,21 +105,16 @@ int BC_DragWindow::drag_failure_event() { if(!do_animation) return 0; - if(end_x == BC_INFINITY) - { + if(end_x == BC_INFINITY) { end_x = get_x(); end_y = get_y(); } - for(int i = 0; i < 10; i++) - { + for(int i = 0; i < 10; i++) { int new_x = end_x + (init_x - end_x) * i / 10; int new_y = end_y + (init_y - end_y) * i / 10; - reposition_window(new_x, - new_y, - get_w(), - get_h()); + reposition_window(new_x, new_y, get_w(), get_h()); flush(); usleep(1000); } @@ -176,38 +128,28 @@ void BC_DragWindow::set_animation(int value) BC_Pixmap *BC_DragWindow::prepare_frame(VFrame *frame, BC_WindowBase *parent_window) { - temp_frame = 0; + VFrame *temp_frame = 0; + int tw = frame->get_w(), th = frame->get_h(); - if(frame->get_color_model() == BC_RGBA8888) - { - temp_frame = new VFrame(*frame); + if( frame->get_color_model() != BC_RGBA8888 ) { + temp_frame = new VFrame(tw, th, BC_RGBA8888); + temp_frame->transfer_from(frame); } else - { - temp_frame = new VFrame; - temp_frame->set_use_shm(0); - temp_frame->reallocate(0, - -1, - 0, - 0, - 0, - frame->get_w(), - frame->get_h(), - BC_RGBA8888, - -1); - - BC_CModels::transfer(temp_frame->get_rows(), frame->get_rows(), - 0, 0, 0, 0, 0, 0, - 0, 0, frame->get_w(), frame->get_h(), - 0, 0, temp_frame->get_w(), temp_frame->get_h(), - frame->get_color_model(), temp_frame->get_color_model(), - 0, frame->get_w(), temp_frame->get_w()); + temp_frame = new VFrame(*frame); + + int tx = tw/2, ty = th/2, tx1 = tx-1, ty1 = ty-1, tx2 = tx+2, ty2 = ty+2; + int bpp = BC_CModels::calculate_pixelsize(temp_frame->get_color_model()); + unsigned char **rows = temp_frame->get_rows(); + for( int y=ty1; yget_rows()[(temp_frame->get_h() / 2)][(temp_frame->get_w() / 2) * 4 + 3] = 0; - drag_pixmap = new BC_Pixmap(parent_window, - temp_frame, - PIXMAP_ALPHA); + drag_pixmap = new BC_Pixmap(parent_window, temp_frame, PIXMAP_ALPHA); + delete temp_frame; return drag_pixmap; } diff --git a/cinelerra-5.1/guicast/bcdragwindow.h b/cinelerra-5.1/guicast/bcdragwindow.h index ea51834b..63c89767 100644 --- a/cinelerra-5.1/guicast/bcdragwindow.h +++ b/cinelerra-5.1/guicast/bcdragwindow.h @@ -28,8 +28,8 @@ class BC_DragWindow : public BC_Popup { public: - BC_DragWindow(BC_WindowBase *parent_window, BC_Pixmap *pixmap /*, int icon_x, int icon_y */); - BC_DragWindow(BC_WindowBase *parent_window, VFrame *frame /*, int icon_x, int icon_y */); + BC_DragWindow(BC_WindowBase *parent_window, BC_Pixmap *pixmap, int icon_x, int icon_y); + BC_DragWindow(BC_WindowBase *parent_window, VFrame *frame, int icon_x, int icon_y); ~BC_DragWindow(); int cursor_motion_event(); @@ -47,7 +47,6 @@ private: int end_x, end_y; int icon_offset_x, icon_offset_y; int do_animation; - VFrame *temp_frame; BC_Pixmap *drag_pixmap; }; diff --git a/cinelerra-5.1/guicast/bclistbox.C b/cinelerra-5.1/guicast/bclistbox.C index ac15f666..0c3057d1 100644 --- a/cinelerra-5.1/guicast/bclistbox.C +++ b/cinelerra-5.1/guicast/bclistbox.C @@ -3676,9 +3676,7 @@ int BC_ListBox::drag_start_event() switch(current_operation) { case SELECT: - if(gui && - gui->is_event_win() && - allow_drag) + if( gui && gui->is_event_win() && allow_drag ) { BC_ListBoxItem *item_return = 0; selection_number = get_cursor_item(data, @@ -3688,33 +3686,25 @@ int BC_ListBox::drag_start_event() if(selection_number >= 0) { - - if (item_return->icon_vframe) - { + int cx, cy; + get_abs_cursor_xy(cx, cy); + cx -= item_return->icon_vframe->get_w() / 2, + cy -= item_return->icon_vframe->get_h() / 2; + if( item_return->icon_vframe ) drag_popup = new BC_DragWindow(this, - item_return->icon_vframe /*, - get_abs_cursor_x(0) - item_return->icon_vframe->get_w() / 2, - get_abs_cursor_y(0) - item_return->icon_vframe->get_h() / 2 */); - } + item_return->icon_vframe, cx, cy); else // this probably works not! - if (item_return->icon) - { + if( item_return->icon ) drag_popup = new BC_DragWindow(this, - item_return->icon /*, - get_abs_cursor_x(0) - item_return->icon->get_w() / 2, - get_abs_cursor_y(0) - item_return->icon->get_h() / 2 */); - } + item_return->icon, cx, cy); else - { drag_popup = new BC_DragWindow(this, - drag_icon_vframe /*, - get_abs_cursor_x(0) - drag_icon_vframe->get_w() / 2, - get_abs_cursor_y(0) - drag_icon_vframe->get_h() / 2 */); - } - + drag_icon_vframe, cx, cy); current_operation = DRAG_ITEM; - set_repeat(get_resources()->scroll_repeat); +// require shift down for scrolling + if( allow_drag < 0 && shift_down() ) + set_repeat(get_resources()->scroll_repeat); return 1; } } @@ -3723,10 +3713,12 @@ int BC_ListBox::drag_start_event() case COLUMN_DN: if(gui && gui->is_event_win() && allow_drag_column) { + int cx, cy; + get_abs_cursor_xy(cx, cy); + cx -= drag_column_icon_vframe->get_w() / 2, + cy -= drag_column_icon_vframe->get_h() / 2; drag_popup = new BC_DragWindow(this, - drag_column_icon_vframe /*, - get_abs_cursor_x(0) - drag_column_icon_vframe->get_w() / 2, - get_abs_cursor_y(0) - drag_column_icon_vframe->get_h() / 2 */); + drag_column_icon_vframe, cx, cy); dragged_title = highlighted_title; current_operation = COLUMN_DRAG; draw_titles(1); @@ -3769,7 +3761,6 @@ int BC_ListBox::drag_motion_event() } return drag_popup->cursor_motion_event(); - break; } case COLUMN_DRAG: @@ -3781,7 +3772,6 @@ int BC_ListBox::drag_motion_event() draw_titles(1); } return drag_popup->cursor_motion_event(); - break; } } return 0; @@ -3806,16 +3796,10 @@ int BC_ListBox::drag_stop_event() { reposition_item(data, selection_number, - top_level->cursor_x + - drag_popup->get_offset_x() - - LISTBOX_MARGIN - - 2 + - xposition, - top_level->cursor_y + - drag_popup->get_offset_y() - - LISTBOX_MARGIN - - 2 + - yposition); + top_level->cursor_x + drag_popup->get_offset_x() - + LISTBOX_MARGIN - 2 + xposition, + top_level->cursor_y + drag_popup->get_offset_y() - + LISTBOX_MARGIN - 2 + yposition); } else // Move rows @@ -4386,7 +4370,7 @@ void BC_ListBox::draw_text_recursive(ArrayList *data, gui->set_color(BLACK); int xx = x + column_width-1; gui->draw_line(x, y, xx, y); - int hh = row_height; + int hh = h; if( display_format == LISTBOX_ICON_LIST ) { int ih = get_icon_h(item); if( ih > hh ) hh = ih; diff --git a/cinelerra-5.1/guicast/bcpopup.C b/cinelerra-5.1/guicast/bcpopup.C index 60d90fa5..7df9f84e 100644 --- a/cinelerra-5.1/guicast/bcpopup.C +++ b/cinelerra-5.1/guicast/bcpopup.C @@ -24,48 +24,21 @@ BC_FullScreen::BC_FullScreen(BC_WindowBase *parent_window, int w, int h, - int bg_color, - int vm_scale, - int hide, - BC_Pixmap *bg_pixmap) + int bg_color, int vm_scale, int hide, BC_Pixmap *bg_pixmap) : BC_WindowBase() { #ifdef HAVE_LIBXXF86VM if (vm_scale) - create_window(parent_window, - _("Fullscreen"), - parent_window->get_screen_x(0, -1), - parent_window->get_screen_y(0, -1), - w, - h, - w, - h, - 0, - parent_window->top_level->private_color, - hide, - bg_color, - NULL, - VIDMODE_SCALED_WINDOW, - bg_pixmap, - 0); + create_window(parent_window, _("Fullscreen"), + parent_window->get_screen_x(0, -1), parent_window->get_screen_y(0, -1), + w, h, w, h, 0, parent_window->top_level->private_color, hide, + bg_color, NULL, VIDMODE_SCALED_WINDOW, bg_pixmap, 0); else #endif - create_window(parent_window, - _("Fullscreen"), - parent_window->get_screen_x(0, -1), - parent_window->get_screen_y(0, -1), - w, - h, - w, - h, - 0, - parent_window->top_level->private_color, - hide, - bg_color, - NULL, - POPUP_WINDOW, - bg_pixmap, - 0); + create_window(parent_window, _("Fullscreen"), + parent_window->get_screen_x(0, -1), parent_window->get_screen_y(0, -1), + w, h, w, h, 0, parent_window->top_level->private_color, hide, + bg_color, NULL, POPUP_WINDOW, bg_pixmap, 0); } @@ -75,31 +48,12 @@ BC_FullScreen::~BC_FullScreen() BC_Popup::BC_Popup(BC_WindowBase *parent_window, - int x, - int y, - int w, - int h, - int bg_color, - int hide, - BC_Pixmap *bg_pixmap) + int x, int y, int w, int h, int bg_color, int hide, BC_Pixmap *bg_pixmap) : BC_WindowBase() { create_window(parent_window, - _("Popup"), - x, - y, - w, - h, - w, - h, - 0, - parent_window->top_level->private_color, - hide, - bg_color, - NULL, - POPUP_WINDOW, - bg_pixmap, - 0); + _("Popup"), x, y, w, h, w, h, 0, parent_window->top_level->private_color, + hide, bg_color, NULL, POPUP_WINDOW, bg_pixmap, 0); grabbed = 0; } diff --git a/cinelerra-5.1/guicast/bcresources.C b/cinelerra-5.1/guicast/bcresources.C index e932af59..2ab104e0 100644 --- a/cinelerra-5.1/guicast/bcresources.C +++ b/cinelerra-5.1/guicast/bcresources.C @@ -59,6 +59,7 @@ char BC_Resources::region[LEN_LANG] = {0}; char BC_Resources::encoding[LEN_ENCOD] = {0}; const char *BC_Resources::wide_encoding = 0; ArrayList *BC_Resources::fontlist = 0; +int BC_Resources::font_debug = 0; const char *BC_Resources::fc_properties[] = { FC_SLANT, FC_WEIGHT, FC_WIDTH }; #define LEN_FCPROP (sizeof(BC_Resources::fc_properties) / sizeof(const char*)) @@ -88,7 +89,7 @@ static const char *def_large_font_xft = "Sans:pixelsize=%.4f"; // 21.3 static const char *def_large_b_font_xft = "Sans:bold:pixelsize=%.4f"; // 21.3333 static const char *def_big_font_xft = "Sans:pixelsize=37.3333"; // 37.3333 static const char *def_big_b_font_xft = "Sans:bold:pixelsize=37.33333"; // 37.3333 -static const char *def_clock_font_xft = "Sans:pixelsize=16"; // 16 +static const char *def_clock_font_xft = "Sans:pixelsize=%.4f"; // 16 #define default_font_xft2 "-microsoft-verdana-*-*-*-*-*-*-*-*-*-*-*-*" @@ -136,8 +137,8 @@ void BC_Resources::init_font_defs(double scale) def_font(large_font2, iround(scale*20)); def_font(big_font, iround(scale*160), iround(scale*160)); def_font(big_font2, iround(scale*16), iround(scale*16)); - def_font(clock_font, iround(scale*16), iround(scale*16)); - def_font(clock_font2, iround(scale*16), iround(scale*16)); + def_font(clock_font, iround(scale*16)); + def_font(clock_font2, iround(scale*18)); def_font(small_fontset, iround(scale*10)); def_font(medium_fontset, iround(scale*14)); def_font(large_fontset, iround(scale*18)); @@ -151,7 +152,7 @@ void BC_Resources::init_font_defs(double scale) def_font(large_b_font_xft, (scale*21.3333)); def_font(big_font_xft, (scale*37.3333)); def_font(big_b_font_xft, (scale*37.3333)); - def_font(clock_font_xft, (scale*16)); + def_font(clock_font_xft, (scale*16.)); set_font(small_font_xft2, default_font_xft2); set_font(medium_font_xft2, default_font_xft2); @@ -344,7 +345,9 @@ BC_Resources::BC_Resources() synchronous = 0; vframe_shm = 0; double default_scale = 1.0; // display_size/1000.; - char *env = getenv("BC_FONT_SCALE"); + char *env = getenv("BC_FONT_DEBUG"); + font_debug = env ? atoi(env) : 0; + env = getenv("BC_FONT_SCALE"); font_scale = env ? atof(env) : default_scale; if( font_scale <= 0 ) font_scale = 1; init_font_defs(font_scale); @@ -966,17 +969,23 @@ int BC_Resources::init_fontconfig(const char *search_path) char find_command[BCTEXTLEN]; char *fp = find_command, *ep = fp+sizeof(find_command)-1; - fp += snprintf(fp, ep-fp, "find '%s'", search_path); + fp += snprintf(fp, ep-fp, "%s", "find"); const char *bc_font_path = getenv("BC_FONT_PATH"); +// if BC_FONT_PATH starts with ':', omit default path + if( !(bc_font_path && bc_font_path[0] == ':') ) + fp += snprintf(fp, ep-fp, " '%s'", search_path); if( bc_font_path ) { const char *path = bc_font_path; - for( int len=0; *path; path+=len ) { - const char *cp = strchr(path,':'); - len = !cp ? strlen(path) : cp-path; + while( *path ) { char font_path[BCTEXTLEN]; - memcpy(font_path, path, len); font_path[len] = 0; - if( cp ) ++len; - fp += snprintf(fp, ep-fp, " '%s'", font_path); + const char *cp = strchr(path,':'); + int len = !cp ? strlen(path) : cp-path; + if( len > 0 ) { + memcpy(font_path, path, len); + font_path[len] = 0; path += len; + fp += snprintf(fp, ep-fp, " '%s'", font_path); + } + if( cp ) ++path; } } fp += snprintf(fp, ep-fp, " -name 'fonts.scale' -print -exec cat {} \\;"); @@ -1123,11 +1132,16 @@ int BC_Resources::init_fontconfig(const char *search_path) entry->style |= FL_WIDTH_NORMAL; fontlist->append(entry); + if( font_debug ) + dump_font_entry(stdout, "font 0: ", entry); + // printf("TitleMain::build_fonts %s: success\n", entry->path); //printf("TitleMain::build_fonts 2\n"); } pclose(in); + if( bc_font_path && bc_font_path[0] == ':' ) + return 0; // Load all the fonts from fontconfig FcPattern *pat; @@ -1335,6 +1349,8 @@ int BC_Resources::init_fontconfig(const char *search_path) } fontlist->append(entry); + if( font_debug ) + dump_font_entry(stdout, "font 1: ", entry); } FcFontSetDestroy(fs); @@ -1544,6 +1560,8 @@ int BC_Resources::init_fontconfig(const char *search_path) strcpy(entry->displayname, entry->family); } fontlist->append(entry); + if( font_debug ) + dump_font_entry(stdout, "font 2: ", entry); } FcFontSetDestroy(fs); return 0; @@ -1753,13 +1771,16 @@ FcPattern* BC_Resources::find_similar_font(FT_ULong char_code, FcPattern *oldfon void BC_Resources::dump_fonts(FILE *fp) { - for( int i=0; itotal; ++i ) { - BC_FontEntry *ep = fontlist->values[i]; - fprintf(fp,"%s = %s\n",ep->displayname,ep->path); - fprintf(fp," %s:%s:%s:%s:%s:%s:%d:%d:%d:%d:%d:%s:%d:%s:%s:%d\n", - ep->foundry, ep->family, ep->weight, ep->slant, ep->swidth, ep->adstyle, - ep->pixelsize, ep->pointsize, ep->xres, ep->yres, ep->style, ep->spacing, - ep->avg_width, ep->registry, ep->encoding, ep->fixed_style); - } + for( int i=0; itotal; ++i ) + dump_font_entry(fp, "", fontlist->values[i]); +} + +void BC_Resources::dump_font_entry(FILE *fp, const char *cp, BC_FontEntry *ep) +{ + fprintf(fp,"%s%s = %s\n",cp,ep->displayname,ep->path); + fprintf(fp," %s:%s:%s:%s:%s:%s:%d:%d:%d:%d:%d:%s:%d:%s:%s:%d\n", + ep->foundry, ep->family, ep->weight, ep->slant, ep->swidth, ep->adstyle, + ep->pixelsize, ep->pointsize, ep->xres, ep->yres, ep->style, ep->spacing, + ep->avg_width, ep->registry, ep->encoding, ep->fixed_style); } diff --git a/cinelerra-5.1/guicast/bcresources.h b/cinelerra-5.1/guicast/bcresources.h index d5c9a069..1c73f713 100644 --- a/cinelerra-5.1/guicast/bcresources.h +++ b/cinelerra-5.1/guicast/bcresources.h @@ -304,7 +304,6 @@ public: int directory_color; int file_color; double font_scale, icon_scale; - // fonts static const char *small_font, *small_font2; static const char *medium_font, *medium_font2; @@ -360,7 +359,9 @@ public: static size_t encode(const char *from_enc, const char *to_enc, char *input, int input_length, char *output, int output_length); static int find_font_by_char(FT_ULong char_code, char *path_new, const FT_Face oldface); + static int font_debug; static void dump_fonts(FILE *fp = stdout); + static void dump_font_entry(FILE *fp, const char *cp, BC_FontEntry *ep); static void new_vframes(int n, VFrame *vframes[], ...); static void del_vframes(VFrame *vframes[], int n); diff --git a/cinelerra-5.1/guicast/bcwindow.C b/cinelerra-5.1/guicast/bcwindow.C index 23f7f71c..6992bc9b 100644 --- a/cinelerra-5.1/guicast/bcwindow.C +++ b/cinelerra-5.1/guicast/bcwindow.C @@ -28,39 +28,17 @@ char BC_Window::default_x11_host[BCTEXTLEN] = ""; BC_Window::BC_Window(const char *title, - int x, - int y, - int w, - int h, - int minw, - int minh, - int allow_resize, - int private_color, - int hide, - int bg_color, - const char *display_name, - int group_it, - int options) + int x, int y, int w, int h, int minw, int minh, int allow_resize, + int private_color, int hide, int bg_color, const char *display_name, + int group_it, int options) : BC_WindowBase(options) { - create_window(0, - title, - x, - y, - w, - h, - (minw < 0) ? w : minw, - (minh < 0) ? h : minh, - allow_resize, - private_color, - hide, - bg_color, - display_name ? display_name : - default_x11_host[0] ? default_x11_host : - 0, - MAIN_WINDOW, - 0, - group_it); + create_window(0, title, x, y, w, h, + (minw < 0) ? w : minw, (minh < 0) ? h : minh, + allow_resize, private_color, hide, bg_color, + display_name ? display_name : + default_x11_host[0] ? default_x11_host : 0, + MAIN_WINDOW, 0, group_it); } diff --git a/cinelerra-5.1/guicast/bcwindowbase.C b/cinelerra-5.1/guicast/bcwindowbase.C index 6599369e..12e6c34a 100644 --- a/cinelerra-5.1/guicast/bcwindowbase.C +++ b/cinelerra-5.1/guicast/bcwindowbase.C @@ -385,22 +385,10 @@ int BC_WindowBase::initialize() FocusChangeMask -int BC_WindowBase::create_window(BC_WindowBase *parent_window, - const char *title, - int x, - int y, - int w, - int h, - int minw, - int minh, - int allow_resize, - int private_color, - int hide, - int bg_color, - const char *display_name, - int window_type, - BC_Pixmap *bg_pixmap, - int group_it) +int BC_WindowBase::create_window(BC_WindowBase *parent_window, const char *title, + int x, int y, int w, int h, int minw, int minh, int allow_resize, + int private_color, int hide, int bg_color, const char *display_name, + int window_type, BC_Pixmap *bg_pixmap, int group_it) { XSetWindowAttributes attr; unsigned long mask; diff --git a/cinelerra-5.1/plugins/interpolate/picon_cinfinity.png b/cinelerra-5.1/plugins/interpolate/picon_cinfinity.png index f2a07fc6dfe9a5adf3e7018eb12dc0c0146c0f52..74bd13302186ed08ac1a7dc06c1c1ef87e5fd6f8 100644 GIT binary patch literal 12810 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 I5_;bM3nCk(SpWb4 delta 3486 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 delta 2993 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 + BC_Resources *resources = BC_WindowBase::get_resources(); + if( resources->font_debug ) + printf("GlyphUnit load glyph (%s) %04x, '%c'\n", glyph->font->displayname, + (unsigned)glyph->char_code, (unsigned)glyph->char_code); int result = 0; char new_path[BCTEXTLEN]; if( plugin->load_freetype_face(freetype_library, freetype_face, glyph->font->path) ) { @@ -311,7 +315,6 @@ void GlyphUnit::process_package(LoadPackage *package) if( gindex == 0 ) { printf("GlyphUnit::process_package 1 glyph not found (%s) %04x, '%c'\n", glyph->font->displayname, (unsigned)glyph->char_code, (unsigned)glyph->char_code); - BC_Resources *resources = BC_WindowBase::get_resources(); // Search replacement font if( resources->find_font_by_char(glyph->char_code, new_path, freetype_face) ) { plugin->load_freetype_face(freetype_library, @@ -1151,7 +1154,8 @@ NEW_WINDOW_MACRO(TitleMain, TitleWindow); void TitleMain::build_previews(TitleWindow *gui) { - ArrayList&fonts = *gui->get_resources()->fontlist; + BC_Resources *resources = BC_WindowBase::get_resources(); + ArrayList&fonts = *resources->fontlist; for( int font_number=0; font_numberget_text_height(LARGEFONT); int max_height = 3*text_height/2, max_width = 2 * max_height; - int text_color = BC_WindowBase::get_resources()->default_text_color; + int text_color = resources->default_text_color; int r = (text_color >> 16) & 0xff; int g = (text_color >> 8) & 0xff; int b = text_color & 0xff; @@ -1179,6 +1183,8 @@ void TitleMain::build_previews(TitleWindow *gui) int total_w = 0; int total_h = 0; for( int pass=0; pass<2; ++pass ) { + if( resources->font_debug ) + printf("Titler: build previews pass %d\n",pass); //printf("TitleMain::build_previews %d %d %d\n", //__LINE__, text_height, total_h); for( int font_number=0; font_numberfont_debug ) + printf("Titler: preview %s = %s\n",font->displayname, font->path); if( pass > 0 ) { font->image = new VFrame; font->image->set_use_shm(0); @@ -1353,7 +1361,7 @@ int TitleMain::load_freetype_face(FT_Library &freetype_library, int TitleMain::load_font(BC_FontEntry *font) { - if( load_freetype_face(freetype_library,freetype_face, font->path) ) return 1; + if( !font || load_freetype_face(freetype_library,freetype_face, font->path) ) return 1; strcpy(text_font, font->displayname); return 0; } -- 2.26.2