g_value_init(&disp_par, GST_TYPE_FRACTION);
gst_value_set_fraction(&disp_par, 1, 1);
g_object_get(ud->preview->play, "video-sink", &xover, NULL);
+ if (xover == NULL)
+ goto fail;
+
klass = G_OBJECT_GET_CLASS(xover);
+ if (klass == NULL)
+ goto fail;
+
pspec = g_object_class_find_property(klass, "pixel-aspect_ratio");
if (pspec)
{
*par_n = gst_value_get_fraction_numerator(&disp_par);
*par_d = gst_value_get_fraction_denominator(&disp_par);
g_value_unset(&disp_par);
+ return;
+
+fail:
+ *par_n = 1;
+ *par_d = 1;
#else
*par_n = 1;
*par_d = 1;
num = par_n * disp_par_d;
den = par_d * disp_par_n;
- *width = *width * num / den;
+ if (par_n > par_d)
+ *width = *width * num / den;
+ else
+ *height = *height * den / num;
}
void
GstBus *bus;
GstElement *xover;
+#if !defined(_WIN32)
ud->preview->xid = GDK_DRAWABLE_XID(ud->preview->view->window);
+#else
+ ud->preview->xid = GDK_WINDOW_HWND(ud->preview->view->window);
+#endif
ud->preview->play = gst_element_factory_make("playbin", "play");
//xover = gst_element_factory_make("xvimagesink", "xover");
//xover = gst_element_factory_make("ximagesink", "xover");
xover = gst_element_factory_make("gconfvideosink", "xover");
+ if (xover == NULL)
+ {
+ GtkWidget *widget = GHB_WIDGET(ud->builder, "live_preview_box");
+ gtk_widget_hide (widget);
+ widget = GHB_WIDGET(ud->builder, "live_preview_duration_box");
+ gtk_widget_hide (widget);
+ return;
+ }
+
g_object_set(G_OBJECT(ud->preview->play), "video-sink", xover, NULL);
+ g_object_set(ud->preview->play, "subtitle-font-desc",
+ "sans bold 20", NULL);
//g_object_set(G_OBJECT(xover), "force-aspect-ratio", TRUE, NULL);
bus = gst_pipeline_get_bus(GST_PIPELINE(ud->preview->play));
{
if (!gst_structure_has_name(msg->structure, "prepare-xwindow-id"))
return GST_BUS_PASS;
+#if !defined(_WIN32)
gst_x_overlay_set_xwindow_id(
GST_X_OVERLAY(GST_MESSAGE_SRC(msg)), preview->xid);
+#else
+ gst_directdraw_sink_set_window_id(
+ GST_X_OVERLAY(GST_MESSAGE_SRC(msg)), preview->xid);
+#endif
gst_message_unref(msg);
return GST_BUS_DROP;
} break;
ud->preview->pix =
ghb_get_preview_image(titleindex, ud->preview->frame,
- ud, TRUE, &width, &height);
+ ud, &width, &height);
if (ud->preview->pix == NULL) return;
preview_width = gdk_pixbuf_get_width(ud->preview->pix);
preview_height = gdk_pixbuf_get_height(ud->preview->pix);
g_free(text);
g_debug("preview %d x %d", preview_width, preview_height);
- target_height = MIN(ud->preview->button_height, 128);
+ target_height = MIN(ud->preview->button_height, 200);
height = target_height;
width = preview_width * height / preview_height;
+ if (width > 400)
+ {
+ width = 400;
+ height = preview_height * width / preview_width;
+ }
if ((height >= 16) && (width >= 16))
{
GstXOverlay *xover;
g_object_get(ud->preview->play, "video-sink", &vsink, NULL);
+ if (vsink == NULL)
+ return FALSE;
+
if (GST_IS_BIN(vsink))
xover = GST_X_OVERLAY(gst_bin_get_by_interface(
GST_BIN(vsink), GST_TYPE_X_OVERLAY));
}
}
-G_MODULE_EXPORT void
-preview_button_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud)
+void
+ghb_preview_set_visible(signal_user_data_t *ud)
{
gint titleindex;
+ GtkWidget *widget;
+ gboolean settings_active;
- g_debug("preview_button_clicked_cb()");
+ settings_active = ghb_settings_get_boolean(ud->settings, "show_picture");
+ widget = GHB_WIDGET (ud->builder, "preview_window");
titleindex = ghb_settings_combo_int(ud->settings, "title");
- if (titleindex >= 0)
+ if (settings_active && titleindex >= 0)
{
gint x, y;
- GtkWidget *widget = GHB_WIDGET (ud->builder, "preview_window");
x = ghb_settings_get_int(ud->settings, "preview_x");
y = ghb_settings_get_int(ud->settings, "preview_y");
if (x >= 0 && y >= 0)
gtk_window_move(GTK_WINDOW(widget), x, y);
- set_visible(widget, gtk_toggle_button_get_active(
- GTK_TOGGLE_BUTTON(xwidget)));
+ set_visible(widget,
+ ghb_settings_get_boolean(ud->settings, "show_preview"));
}
+ else
+ {
+ set_visible(widget, FALSE);
+ }
+}
+
+G_MODULE_EXPORT void
+preview_button_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud)
+{
+ g_debug("preview_button_clicked_cb()");
ghb_widget_to_setting (ud->settings, xwidget);
- ghb_check_dependency(ud, xwidget);
+ ghb_preview_set_visible(ud);
+ ghb_check_dependency(ud, xwidget, NULL);
const gchar *name = gtk_widget_get_name(xwidget);
ghb_pref_save(ud->settings, name);
}
picture_settings_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud)
{
GtkWidget *widget;
- gboolean active;
+ gboolean active, hide_settings;
gint x, y;
g_debug("picture_settings_clicked_cb()");
+ ghb_widget_to_setting (ud->settings, xwidget);
+
+ hide_settings = ghb_settings_get_boolean(ud->settings, "hide_settings");
+
+ active = ghb_settings_get_boolean(ud->settings, "show_picture");
widget = GHB_WIDGET (ud->builder, "settings_window");
- active = gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(xwidget));
x = ghb_settings_get_int(ud->settings, "settings_x");
y = ghb_settings_get_int(ud->settings, "settings_y");
if (x >= 0 && y >= 0)
gtk_window_move(GTK_WINDOW(widget), x, y);
- set_visible(widget, active);
- if (ghb_settings_get_boolean(ud->settings, "show_preview"))
- {
- widget = GHB_WIDGET (ud->builder, "preview_window");
- x = ghb_settings_get_int(ud->settings, "preview_x");
- y = ghb_settings_get_int(ud->settings, "preview_y");
- if (x >= 0 && y >= 0)
- gtk_window_move(GTK_WINDOW(widget), x, y);
- set_visible(widget, active);
- // The window may be hidden behind the main window, raise it
- if (active)
- gtk_window_present(GTK_WINDOW(widget));
- }
+ set_visible(widget, active && !hide_settings);
+ ghb_preview_set_visible(ud);
}
G_MODULE_EXPORT void
g_debug("fullscreen_clicked_cb()");
ghb_widget_to_setting (ud->settings, toggle);
- ghb_check_dependency(ud, toggle);
+ ghb_check_dependency(ud, toggle, NULL);
const gchar *name = gtk_widget_get_name(toggle);
ghb_pref_save(ud->settings, name);
{
GtkWidget *toggle;
gboolean active;
- gint signal_id;
- gint handler_id = 0;
+ GtkWidget *window;
g_debug("picture_settings_alt2_clicked_cb()");
- toggle = GHB_WIDGET (ud->builder, "show_picture");
- active = gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(toggle));
- if (active)
+ ghb_widget_to_setting (ud->settings, xwidget);
+ active = ghb_settings_get_boolean(ud->settings, "hide_settings");
+
+ toggle = GHB_WIDGET (ud->builder, "hide_settings");
+ window = GHB_WIDGET(ud->builder, "settings_window");
+ if (!active)
{
- // I don't want deleting the settings window to also remove the
- // preview window, but changing the toggle will do this, so temporarily
- // ignore the toggled signal
- signal_id = g_signal_lookup("toggled", GTK_TYPE_TOGGLE_TOOL_BUTTON);
- if (signal_id > 0)
- {
- // Valid signal id found. This should always succeed.
- handler_id = g_signal_handler_find((gpointer)toggle,
- G_SIGNAL_MATCH_ID,
- signal_id, 0, 0, 0, 0);
- if (handler_id > 0)
- {
- // This should also always succeed
- g_signal_handler_block ((gpointer)toggle, handler_id);
- }
- }
+ gtk_button_set_label(GTK_BUTTON(toggle), "Hide Settings");
+ gtk_widget_set_tooltip_text(toggle,
+ "Hide the picture settings window while "
+ "leaving the preview visible.");
+ gtk_widget_show(window);
}
-
- GtkWidget *widget = GHB_WIDGET (ud->builder, "settings_window");
- gint x, y;
-
- x = ghb_settings_get_int(ud->settings, "settings_x");
- y = ghb_settings_get_int(ud->settings, "settings_y");
- if (x >= 0 && y >= 0)
- gtk_window_move(GTK_WINDOW(widget), x, y);
- set_visible(widget, !active);
- gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(toggle), !active);
-
- if (handler_id > 0)
+ else
{
- g_signal_handler_unblock ((gpointer)toggle, handler_id);
+ gtk_button_set_label(GTK_BUTTON(toggle), "Show Settings");
+ gtk_widget_set_tooltip_text(toggle, "Show picture settings.");
+ gtk_widget_hide(window);
}
}
-void
+G_MODULE_EXPORT void
preview_frame_value_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
{
if (ud->preview->live_id >= 0)
signal_user_data_t *ud)
{
live_preview_stop(ud);
- gtk_widget_hide(widget);
+ widget = GHB_WIDGET (ud->builder, "show_picture");
+ gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(widget), FALSE);
return TRUE;
}
-gboolean
+G_MODULE_EXPORT gboolean
settings_window_delete_cb(
GtkWidget *widget,
GdkEvent *event,
signal_user_data_t *ud)
{
- gint signal_id;
- gint handler_id = 0;
-
- gtk_widget_hide(widget);
+ live_preview_stop(ud);
widget = GHB_WIDGET (ud->builder, "show_picture");
-
- // I don't want deleting the settings window to also remove the
- // preview window, but changing the toggle will do this, so temporarily
- // ignore the toggled signal
- signal_id = g_signal_lookup("toggled", GTK_TYPE_TOGGLE_TOOL_BUTTON);
- if (signal_id > 0)
- {
- // Valid signal id found. This should always succeed.
- handler_id = g_signal_handler_find((gpointer)widget, G_SIGNAL_MATCH_ID,
- signal_id, 0, 0, 0, 0);
- if (handler_id > 0)
- {
- // This should also always succeed
- g_signal_handler_block ((gpointer)widget, handler_id);
- }
- }
-
gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(widget), FALSE);
- if (handler_id > 0)
- {
- g_signal_handler_unblock ((gpointer)widget, handler_id);
- }
return TRUE;
}
g_debug("preview_duration_changed_cb ()");
ghb_live_reset(ud);
ghb_widget_to_setting (ud->settings, widget);
- ghb_check_dependency(ud, widget);
+ ghb_check_dependency(ud, widget, NULL);
const gchar *name = gtk_widget_get_name(widget);
ghb_pref_save(ud->settings, name);
}
double w, h;
if (!width || !height)
- return NULL;
+ return NULL;
shape = (GdkDrawable *)gdk_pixmap_new (NULL, width, height, 1);