summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjstebbins <[email protected]>2015-07-29 22:30:58 +0000
committerjstebbins <[email protected]>2015-07-29 22:30:58 +0000
commit74a6af7510b51516a34fd8fa18d909c6e4f90ce6 (patch)
treed890b195dd9ffdc3dd8953b399502a80c8862560
parent5f632706de566f8576787e234ca3bb3772de87ee (diff)
LinGui: simplify preview overlay
Don't use gdk_display_supports_composite or gdk_window_set_composited. They have been deprecated. Unfortunately, this means I lose some functionality. I can give the HUD round corners or I can make it translucent. It appears there is no way to do both in the latest gtk+-3 :( git-svn-id: svn://svn.handbrake.fr/HandBrake/trunk@7384 b64f7644-9d1e-0410-96f1-a4d463321fa5
-rw-r--r--gtk/src/Makefile.am2
-rw-r--r--gtk/src/composite_example.c78
-rw-r--r--gtk/src/ghb-3.12.ui436
-rw-r--r--gtk/src/ghb-3.14.ui438
-rw-r--r--gtk/src/ghb.ui436
-rw-r--r--gtk/src/ghbcompositor.c713
-rw-r--r--gtk/src/ghbcompositor.h74
-rw-r--r--gtk/src/main.c48
-rw-r--r--gtk/src/preview.c257
9 files changed, 817 insertions, 1665 deletions
diff --git a/gtk/src/Makefile.am b/gtk/src/Makefile.am
index e72ba59af..21801977d 100644
--- a/gtk/src/Makefile.am
+++ b/gtk/src/Makefile.am
@@ -73,8 +73,6 @@ ghb_SOURCES = \
renderer_button.c \
ghbcellrenderertext.c \
ghbcellrenderertext.h \
- ghbcompositor.c \
- ghbcompositor.h \
ghb-dvd.c \
ghb-dvd.h \
marshalers.c \
diff --git a/gtk/src/composite_example.c b/gtk/src/composite_example.c
deleted file mode 100644
index 7918b3083..000000000
--- a/gtk/src/composite_example.c
+++ /dev/null
@@ -1,78 +0,0 @@
-#include <gtk/gtk.h>
-#include "ghbcompositor.h"
-
-// GhbCompositor example
-int
-main(gint argc, gchar *argv[])
-{
- GtkWidget *window;
- GtkWidget *blender;
- GtkWidget *eb_bottom;
- GtkWidget *eb_top1;
- GtkWidget *eb_top2;
- GtkWidget *eb_top3;
- GtkWidget *bottom;
- GtkWidget *top1;
- GtkWidget *top2;
- GtkWidget *top3;
- GtkWidget *table;
- GtkWidget *image;
-
- gtk_init(&argc, &argv);
-
- // Make the top level window
- window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
-
- // Only widgets that have a GdkDrawing area can be composited
- // These would be GtkEventBox or GtkDrawingArea
- // Create the widgets that will be composited
- eb_bottom = gtk_event_box_new();
- eb_top1 = gtk_event_box_new();
- eb_top2 = gtk_event_box_new();
- eb_top3 = gtk_event_box_new();
-
- // Create the compositor
- blender = ghb_compositor_new();
-
- // Create an button to put on the bottom layer
- bottom = gtk_button_new_with_label("Bottom");
- image = gtk_image_new_from_stock("gtk-help", 6);
- gtk_button_set_image(GTK_BUTTON(bottom), image);
-
- // The button must be placed inside an event box since
- // buttons do not have their own window.
- gtk_container_add(GTK_CONTAINER(eb_bottom), bottom);
-
- // Create the buttons that will be visible on the top layer
- top1 = gtk_button_new_with_label("Top 1");
- top2 = gtk_button_new_with_label("Top 2");
- top3 = gtk_button_new_with_label("Top 3");
-
- // The buttons must be placed inside an event box since
- // buttons do not have their own window.
- gtk_container_add(GTK_CONTAINER(eb_top1), top1);
- gtk_container_add(GTK_CONTAINER(eb_top2), top2);
- gtk_container_add(GTK_CONTAINER(eb_top3), top3);
-
- // Create the table that will be the top layer
- // Using a layout widget gives flexibility in the layout of the layer
- table = gtk_table_new(3, 3, TRUE);
- gtk_table_attach(GTK_TABLE(table), eb_top1, 0, 1, 0, 1, 0, 0, 0, 0);
- gtk_table_attach(GTK_TABLE(table), eb_top2, 1, 2, 1, 2, 0, 0, 0, 0);
- gtk_table_attach(GTK_TABLE(table), eb_top3, 2, 3, 2, 3, 0, 0, 0, 0);
-
- // Add the blender to the main window.
- gtk_container_add(GTK_CONTAINER(window), blender);
-
- // Set the blenders zlist, with opacity values
- // Bottom layer is opaque, top layer 60%
- ghb_compositor_zlist_insert(GHB_COMPOSITOR(blender), eb_bottom, 1, 1);
- ghb_compositor_zlist_insert(GHB_COMPOSITOR(blender), table, 2, 0.6);
-
- // Start the show
- gtk_widget_show_all(window);
-
- gtk_main();
- return 0;
-}
-
diff --git a/gtk/src/ghb-3.12.ui b/gtk/src/ghb-3.12.ui
index 6b886d6c1..5163cb986 100644
--- a/gtk/src/ghb-3.12.ui
+++ b/gtk/src/ghb-3.12.ui
@@ -8131,243 +8131,259 @@ Setting this to 0 means there is no maximum height.</property>
<action-widget response="-5">preset_ok</action-widget>
</action-widgets>
</object>
- <object class="GtkDrawingArea" id="preview_image">
- <property name="visible">True</property>
- <property name="app_paintable">True</property>
- <property name="can_focus">False</property>
- <property name="halign">center</property>
- <property name="valign">center</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_LEAVE_NOTIFY_MASK</property>
- <signal name="leave-notify-event" handler="preview_leave_cb" swapped="no"/>
- <signal name="motion-notify-event" handler="preview_motion_cb" swapped="no"/>
- </object>
<object class="GtkAdjustment" id="preview_progress_adj">
<property name="upper">100</property>
<property name="step_increment">1</property>
<property name="page_increment">10</property>
</object>
- <object class="GtkEventBox" id="preview_hud">
- <property name="visible">True</property>
- <property name="app_paintable">True</property>
+ <object class="GtkWindow" id="preview_window">
<property name="can_focus">False</property>
- <property name="halign">center</property>
- <property name="valign">end</property>
- <property name="margin-bottom">30</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK</property>
- <signal name="enter-notify-event" handler="hud_enter_cb" swapped="no"/>
- <signal name="size-allocate" handler="preview_hud_size_alloc_cb" swapped="no"/>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_STRUCTURE_MASK</property>
+ <property name="title" translatable="yes">Preview</property>
+ <property name="resizable">False</property>
+ <property name="window_position">center</property>
+ <property name="type_hint">utility</property>
+ <property name="skip_taskbar_hint">True</property>
+ <property name="skip_pager_hint">True</property>
+ <property name="transient_for">hb_window</property>
+ <signal name="configure-event" handler="preview_configure_cb" swapped="no"/>
+ <signal name="delete-event" handler="preview_window_delete_cb" swapped="no"/>
<child>
- <object class="GtkBox" id="vbox35">
- <property name="orientation">vertical</property>
+ <object class="GtkBox" id="preview_window_box">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="margin-top">5</property>
- <property name="margin-bottom">5</property>
- <property name="margin-left">10</property>
- <property name="margin-right">10</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<child>
- <object class="GtkScale" id="preview_frame">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="tooltip_text" translatable="yes">Select preview frames.</property>
- <property name="adjustment">adjustment19</property>
- <property name="digits">0</property>
- <property name="value_pos">bottom</property>
- <signal name="value-changed" handler="preview_frame_value_changed_cb" swapped="no"/>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkBox" id="live_preview_box">
- <property name="orientation">horizontal</property>
+ <object class="GtkLayout" id="preview_image">
<property name="visible">True</property>
+ <property name="app_paintable">True</property>
<property name="can_focus">False</property>
- <property name="spacing">5</property>
+ <property name="halign">center</property>
+ <property name="valign">center</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_LEAVE_NOTIFY_MASK</property>
+ <signal name="leave-notify-event" handler="preview_leave_cb" swapped="no"/>
+ <signal name="motion-notify-event" handler="preview_motion_cb" swapped="no"/>
+ <signal name="draw" handler="preview_draw_cb" swapped="no"/>
<child>
- <object class="GtkButton" id="live_preview_play">
- <property name="height_request">30</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">True</property>
- <property name="tooltip_text" translatable="yes">Encode and play a short sequence of video starting from the current preview position.</property>
- <property name="relief">none</property>
- <signal name="clicked" handler="live_preview_start_cb" swapped="no"/>
- <child>
- <object class="GtkImage" id="live_preview_play_image">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="icon_name">gtk-media-play</property>
- </object>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkScale" id="live_preview_progress">
- <property name="can_focus">True</property>
- <property name="adjustment">preview_progress_adj</property>
- <property name="draw_value">False</property>
- <property name="value_pos">right</property>
- <signal name="value-changed" handler="live_preview_seek_cb" swapped="no"/>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkBox" id="live_progress_box">
+ <object class="GtkBox" id="preview_hud_box">
<property name="orientation">vertical</property>
<property name="visible">True</property>
- <property name="can_focus">False</property>
- <child>
- <object class="GtkProgressBar" id="live_encode_progress">
- <property name="height_request">20</property>
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">0</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="position">2</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkBox" id="hbox26">
- <property name="orientation">horizontal</property>
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="spacing">10</property>
- <child>
- <object class="GtkBox" id="live_preview_duration_box">
- <property name="orientation">horizontal</property>
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="spacing">2</property>
<child>
- <object class="GtkLabel" id="label37">
+ <object class="GtkEventBox" id="preview_hud">
<property name="visible">True</property>
+ <property name="app_paintable">True</property>
<property name="can_focus">False</property>
- <property name="label" translatable="yes">&lt;b&gt;Duration:&lt;/b&gt;</property>
- <property name="use_markup">True</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkSpinButton" id="live_duration">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="tooltip_text" translatable="yes">Set the duration of the live preview in seconds.</property>
- <property name="primary_icon_activatable">False</property>
- <property name="secondary_icon_activatable">False</property>
- <property name="adjustment">adjustment21</property>
- <property name="numeric">True</property>
- <signal name="value-changed" handler="preview_duration_changed_cb" swapped="no"/>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="hexpand-set">True</property>
+ <property name="vexpand-set">True</property>
+ <property name="halign">center</property>
+ <property name="valign">end</property>
+ <property name="margin-bottom">30</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK</property>
+ <signal name="enter-notify-event" handler="hud_enter_cb" swapped="no"/>
+ <signal name="leave-notify-event" handler="hud_leave_cb" swapped="no"/>
+ <signal name="size-allocate" handler="hud_size_alloc_cb" swapped="no"/>
+ <child>
+ <object class="GtkBox" id="vbox35">
+ <property name="orientation">vertical</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ <property name="margin-left">10</property>
+ <property name="margin-right">10</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ <child>
+ <object class="GtkScale" id="preview_frame">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="tooltip_text" translatable="yes">Select preview frames.</property>
+ <property name="adjustment">adjustment19</property>
+ <property name="digits">0</property>
+ <property name="value_pos">bottom</property>
+ <signal name="value-changed" handler="preview_frame_value_changed_cb" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="live_preview_box">
+ <property name="orientation">horizontal</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkButton" id="live_preview_play">
+ <property name="height_request">30</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_text" translatable="yes">Encode and play a short sequence of video starting from the current preview position.</property>
+ <property name="relief">none</property>
+ <signal name="clicked" handler="live_preview_start_cb" swapped="no"/>
+ <child>
+ <object class="GtkImage" id="live_preview_play_image">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">gtk-media-play</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkScale" id="live_preview_progress">
+ <property name="can_focus">True</property>
+ <property name="adjustment">preview_progress_adj</property>
+ <property name="draw_value">False</property>
+ <property name="value_pos">right</property>
+ <signal name="value-changed" handler="live_preview_seek_cb" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="live_progress_box">
+ <property name="orientation">vertical</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkProgressBar" id="live_encode_progress">
+ <property name="height_request">20</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="hbox26">
+ <property name="orientation">horizontal</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">10</property>
+ <child>
+ <object class="GtkBox" id="live_preview_duration_box">
+ <property name="orientation">horizontal</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">2</property>
+ <child>
+ <object class="GtkLabel" id="label37">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">&lt;b&gt;Duration:&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="live_duration">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="tooltip_text" translatable="yes">Set the duration of the live preview in seconds.</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="adjustment">adjustment21</property>
+ <property name="numeric">True</property>
+ <signal name="value-changed" handler="preview_duration_changed_cb" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="preview_show_crop">
+ <property name="label" translatable="yes">Show Crop</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="tooltip_text" translatable="yes">Show Cropped area of the preview</property>
+ <property name="halign">start</property>
+ <property name="draw_indicator">True</property>
+ <signal name="toggled" handler="show_crop_changed_cb" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToggleButton" id="preview_fullscreen">
+ <property name="label" translatable="yes">Fullscreen</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="tooltip_text" translatable="yes">View Fullscreen Preview</property>
+ <property name="relief">none</property>
+ <signal name="toggled" handler="fullscreen_clicked_cb" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ </child>
</object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">1</property>
- </packing>
</child>
</object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkCheckButton" id="preview_show_crop">
- <property name="label" translatable="yes">Show Crop</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">False</property>
- <property name="tooltip_text" translatable="yes">Show Cropped area of the preview</property>
- <property name="halign">start</property>
- <property name="draw_indicator">True</property>
- <signal name="toggled" handler="show_crop_changed_cb" swapped="no"/>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkToggleButton" id="preview_fullscreen">
- <property name="label" translatable="yes">Fullscreen</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">False</property>
- <property name="tooltip_text" translatable="yes">View Fullscreen Preview</property>
- <property name="relief">none</property>
- <signal name="toggled" handler="fullscreen_clicked_cb" swapped="no"/>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">2</property>
- </packing>
</child>
</object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">2</property>
- </packing>
</child>
</object>
</child>
</object>
- <object class="GtkWindow" id="preview_window">
- <property name="can_focus">False</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_STRUCTURE_MASK</property>
- <property name="title" translatable="yes">Preview</property>
- <property name="resizable">False</property>
- <property name="window_position">center</property>
- <property name="type_hint">utility</property>
- <property name="skip_taskbar_hint">True</property>
- <property name="skip_pager_hint">True</property>
- <property name="transient_for">hb_window</property>
- <signal name="configure-event" handler="preview_configure_cb" swapped="no"/>
- <signal name="delete-event" handler="preview_window_delete_cb" swapped="no"/>
- <child>
- <object class="GtkBox" id="preview_window_box">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- </object>
- </child>
- </object>
<object class="GtkFileChooserDialog" id="source_dialog">
<property name="can_focus">False</property>
<property name="border_width">5</property>
diff --git a/gtk/src/ghb-3.14.ui b/gtk/src/ghb-3.14.ui
index 000ad6867..e5c3d5f35 100644
--- a/gtk/src/ghb-3.14.ui
+++ b/gtk/src/ghb-3.14.ui
@@ -8139,243 +8139,263 @@ Setting this to 0 means there is no maximum height.</property>
<action-widget response="-5">preset_ok</action-widget>
</action-widgets>
</object>
- <object class="GtkDrawingArea" id="preview_image">
- <property name="visible">True</property>
- <property name="app_paintable">True</property>
- <property name="can_focus">False</property>
- <property name="halign">center</property>
- <property name="valign">center</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_LEAVE_NOTIFY_MASK</property>
- <signal name="leave-notify-event" handler="preview_leave_cb" swapped="no"/>
- <signal name="motion-notify-event" handler="preview_motion_cb" swapped="no"/>
- </object>
<object class="GtkAdjustment" id="preview_progress_adj">
<property name="upper">100</property>
<property name="step_increment">1</property>
<property name="page_increment">10</property>
</object>
- <object class="GtkEventBox" id="preview_hud">
- <property name="visible">True</property>
- <property name="app_paintable">True</property>
+ <object class="GtkWindow" id="preview_window">
<property name="can_focus">False</property>
- <property name="halign">center</property>
- <property name="valign">end</property>
- <property name="margin-bottom">30</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK</property>
- <signal name="enter-notify-event" handler="hud_enter_cb" swapped="no"/>
- <signal name="size-allocate" handler="preview_hud_size_alloc_cb" swapped="no"/>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_STRUCTURE_MASK</property>
+ <property name="title" translatable="yes">Preview</property>
+ <property name="resizable">False</property>
+ <property name="window_position">center</property>
+ <property name="type_hint">utility</property>
+ <property name="skip_taskbar_hint">True</property>
+ <property name="skip_pager_hint">True</property>
+ <property name="transient_for">hb_window</property>
+ <signal name="configure-event" handler="preview_configure_cb" swapped="no"/>
+ <signal name="delete-event" handler="preview_window_delete_cb" swapped="no"/>
<child>
- <object class="GtkBox" id="vbox35">
- <property name="orientation">vertical</property>
+ <object class="GtkBox" id="preview_window_box">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="margin-top">5</property>
- <property name="margin-bottom">5</property>
- <property name="margin-start">10</property>
- <property name="margin-end">10</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<child>
- <object class="GtkScale" id="preview_frame">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="tooltip_text" translatable="yes">Select preview frames.</property>
- <property name="adjustment">adjustment19</property>
- <property name="digits">0</property>
- <property name="value_pos">bottom</property>
- <signal name="value-changed" handler="preview_frame_value_changed_cb" swapped="no"/>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkBox" id="live_preview_box">
- <property name="orientation">horizontal</property>
+ <object class="GtkLayout" id="preview_image">
<property name="visible">True</property>
+ <property name="app_paintable">True</property>
<property name="can_focus">False</property>
- <property name="spacing">5</property>
+ <property name="halign">center</property>
+ <property name="valign">center</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK</property>
+ <signal name="leave-notify-event" handler="preview_leave_cb" swapped="no"/>
+ <signal name="motion-notify-event" handler="preview_motion_cb" swapped="no"/>
+ <signal name="draw" handler="preview_draw_cb" swapped="no"/>
<child>
- <object class="GtkButton" id="live_preview_play">
- <property name="height_request">30</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">True</property>
- <property name="tooltip_text" translatable="yes">Encode and play a short sequence of video starting from the current preview position.</property>
- <property name="relief">none</property>
- <signal name="clicked" handler="live_preview_start_cb" swapped="no"/>
- <child>
- <object class="GtkImage" id="live_preview_play_image">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="icon_name">gtk-media-play</property>
- </object>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkScale" id="live_preview_progress">
- <property name="can_focus">True</property>
- <property name="adjustment">preview_progress_adj</property>
- <property name="draw_value">False</property>
- <property name="value_pos">right</property>
- <signal name="value-changed" handler="live_preview_seek_cb" swapped="no"/>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkBox" id="live_progress_box">
+ <object class="GtkBox" id="preview_hud_box">
<property name="orientation">vertical</property>
<property name="visible">True</property>
- <property name="can_focus">False</property>
<child>
- <object class="GtkProgressBar" id="live_encode_progress">
- <property name="height_request">20</property>
- <property name="visible">True</property>
+ <object class="GtkEventBox" id="preview_hud">
+ <property name="visible">False</property>
+ <property name="app_paintable">True</property>
<property name="can_focus">False</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">0</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="position">2</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkBox" id="hbox26">
- <property name="orientation">horizontal</property>
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="spacing">10</property>
- <child>
- <object class="GtkBox" id="live_preview_duration_box">
- <property name="orientation">horizontal</property>
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="spacing">2</property>
- <child>
- <object class="GtkLabel" id="label37">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="label" translatable="yes">&lt;b&gt;Duration:&lt;/b&gt;</property>
- <property name="use_markup">True</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkSpinButton" id="live_duration">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="tooltip_text" translatable="yes">Set the duration of the live preview in seconds.</property>
- <property name="primary_icon_activatable">False</property>
- <property name="secondary_icon_activatable">False</property>
- <property name="adjustment">adjustment21</property>
- <property name="numeric">True</property>
- <signal name="value-changed" handler="preview_duration_changed_cb" swapped="no"/>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="hexpand-set">True</property>
+ <property name="vexpand-set">True</property>
+ <property name="halign">center</property>
+ <property name="valign">end</property>
+ <property name="margin-bottom">30</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK</property>
+ <signal name="enter-notify-event" handler="hud_enter_cb" swapped="no"/>
+ <signal name="leave-notify-event" handler="hud_leave_cb" swapped="no"/>
+ <signal name="size-allocate" handler="hud_size_alloc_cb" swapped="no"/>
+ <child>
+ <object class="GtkBox" id="vbox35">
+ <property name="orientation">vertical</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ <property name="margin-start">10</property>
+ <property name="margin-end">10</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ <child>
+ <object class="GtkScale" id="preview_frame">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="tooltip_text" translatable="yes">Select preview frames.</property>
+ <property name="adjustment">adjustment19</property>
+ <property name="digits">0</property>
+ <property name="value_pos">bottom</property>
+ <signal name="value-changed" handler="preview_frame_value_changed_cb" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="live_preview_box">
+ <property name="orientation">horizontal</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkButton" id="live_preview_play">
+ <property name="height_request">30</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_text" translatable="yes">Encode and play a short sequence of video starting from the current preview position.</property>
+ <property name="relief">none</property>
+ <signal name="clicked" handler="live_preview_start_cb" swapped="no"/>
+ <child>
+ <object class="GtkImage" id="live_preview_play_image">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">gtk-media-play</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkScale" id="live_preview_progress">
+ <property name="can_focus">True</property>
+ <property name="adjustment">preview_progress_adj</property>
+ <property name="draw_value">False</property>
+ <property name="value_pos">right</property>
+ <signal name="value-changed" handler="live_preview_seek_cb" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="live_progress_box">
+ <property name="orientation">vertical</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkProgressBar" id="live_encode_progress">
+ <property name="height_request">20</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="hbox26">
+ <property name="orientation">horizontal</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">10</property>
+ <child>
+ <object class="GtkBox" id="live_preview_duration_box">
+ <property name="orientation">horizontal</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">2</property>
+ <child>
+ <object class="GtkLabel" id="label37">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">&lt;b&gt;Duration:&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="live_duration">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="tooltip_text" translatable="yes">Set the duration of the live preview in seconds.</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="adjustment">adjustment21</property>
+ <property name="numeric">True</property>
+ <signal name="value-changed" handler="preview_duration_changed_cb" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="preview_show_crop">
+ <property name="label" translatable="yes">Show Crop</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="tooltip_text" translatable="yes">Show Cropped area of the preview</property>
+ <property name="halign">start</property>
+ <property name="draw_indicator">True</property>
+ <signal name="toggled" handler="show_crop_changed_cb" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToggleButton" id="preview_fullscreen">
+ <property name="label" translatable="yes">Fullscreen</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="tooltip_text" translatable="yes">View Fullscreen Preview</property>
+ <property name="relief">none</property>
+ <signal name="toggled" handler="fullscreen_clicked_cb" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ </child>
</object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">1</property>
- </packing>
</child>
</object>
<packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkCheckButton" id="preview_show_crop">
- <property name="label" translatable="yes">Show Crop</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">False</property>
- <property name="tooltip_text" translatable="yes">Show Cropped area of the preview</property>
- <property name="halign">start</property>
- <property name="draw_indicator">True</property>
- <signal name="toggled" handler="show_crop_changed_cb" swapped="no"/>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkToggleButton" id="preview_fullscreen">
- <property name="label" translatable="yes">Fullscreen</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">False</property>
- <property name="tooltip_text" translatable="yes">View Fullscreen Preview</property>
- <property name="relief">none</property>
- <signal name="toggled" handler="fullscreen_clicked_cb" swapped="no"/>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">2</property>
+ <property name="x">0</property>
+ <property name="y">0</property>
</packing>
</child>
</object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">2</property>
- </packing>
</child>
</object>
</child>
</object>
- <object class="GtkWindow" id="preview_window">
- <property name="can_focus">False</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_STRUCTURE_MASK</property>
- <property name="title" translatable="yes">Preview</property>
- <property name="resizable">False</property>
- <property name="window_position">center</property>
- <property name="type_hint">utility</property>
- <property name="skip_taskbar_hint">True</property>
- <property name="skip_pager_hint">True</property>
- <property name="transient_for">hb_window</property>
- <signal name="configure-event" handler="preview_configure_cb" swapped="no"/>
- <signal name="delete-event" handler="preview_window_delete_cb" swapped="no"/>
- <child>
- <object class="GtkBox" id="preview_window_box">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- </object>
- </child>
- </object>
<object class="GtkFileChooserDialog" id="source_dialog">
<property name="can_focus">False</property>
<property name="border_width">5</property>
diff --git a/gtk/src/ghb.ui b/gtk/src/ghb.ui
index 03524f78e..27c6b5ccf 100644
--- a/gtk/src/ghb.ui
+++ b/gtk/src/ghb.ui
@@ -8131,243 +8131,259 @@ Setting this to 0 means there is no maximum height.</property>
<action-widget response="-5">preset_ok</action-widget>
</action-widgets>
</object>
- <object class="GtkDrawingArea" id="preview_image">
- <property name="visible">True</property>
- <property name="app_paintable">True</property>
- <property name="can_focus">False</property>
- <property name="halign">center</property>
- <property name="valign">center</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_LEAVE_NOTIFY_MASK</property>
- <signal name="leave-notify-event" handler="preview_leave_cb" swapped="no"/>
- <signal name="motion-notify-event" handler="preview_motion_cb" swapped="no"/>
- </object>
<object class="GtkAdjustment" id="preview_progress_adj">
<property name="upper">100</property>
<property name="step_increment">1</property>
<property name="page_increment">10</property>
</object>
- <object class="GtkEventBox" id="preview_hud">
- <property name="visible">True</property>
- <property name="app_paintable">True</property>
+ <object class="GtkWindow" id="preview_window">
<property name="can_focus">False</property>
- <property name="halign">center</property>
- <property name="valign">end</property>
- <property name="margin-bottom">30</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK</property>
- <signal name="enter-notify-event" handler="hud_enter_cb" swapped="no"/>
- <signal name="size-allocate" handler="preview_hud_size_alloc_cb" swapped="no"/>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_STRUCTURE_MASK</property>
+ <property name="title" translatable="yes">Preview</property>
+ <property name="resizable">False</property>
+ <property name="window_position">center</property>
+ <property name="type_hint">utility</property>
+ <property name="skip_taskbar_hint">True</property>
+ <property name="skip_pager_hint">True</property>
+ <property name="transient_for">hb_window</property>
+ <signal name="configure-event" handler="preview_configure_cb" swapped="no"/>
+ <signal name="delete-event" handler="preview_window_delete_cb" swapped="no"/>
<child>
- <object class="GtkBox" id="vbox35">
- <property name="orientation">vertical</property>
+ <object class="GtkBox" id="preview_window_box">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="margin-top">5</property>
- <property name="margin-bottom">5</property>
- <property name="margin-left">10</property>
- <property name="margin-right">10</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<child>
- <object class="GtkScale" id="preview_frame">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="tooltip_text" translatable="yes">Select preview frames.</property>
- <property name="adjustment">adjustment19</property>
- <property name="digits">0</property>
- <property name="value_pos">bottom</property>
- <signal name="value-changed" handler="preview_frame_value_changed_cb" swapped="no"/>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkBox" id="live_preview_box">
- <property name="orientation">horizontal</property>
+ <object class="GtkLayout" id="preview_image">
<property name="visible">True</property>
+ <property name="app_paintable">True</property>
<property name="can_focus">False</property>
- <property name="spacing">5</property>
+ <property name="halign">center</property>
+ <property name="valign">center</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_LEAVE_NOTIFY_MASK</property>
+ <signal name="leave-notify-event" handler="preview_leave_cb" swapped="no"/>
+ <signal name="motion-notify-event" handler="preview_motion_cb" swapped="no"/>
+ <signal name="draw" handler="preview_draw_cb" swapped="no"/>
<child>
- <object class="GtkButton" id="live_preview_play">
- <property name="height_request">30</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">True</property>
- <property name="tooltip_text" translatable="yes">Encode and play a short sequence of video starting from the current preview position.</property>
- <property name="relief">none</property>
- <signal name="clicked" handler="live_preview_start_cb" swapped="no"/>
- <child>
- <object class="GtkImage" id="live_preview_play_image">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="icon_name">gtk-media-play</property>
- </object>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkScale" id="live_preview_progress">
- <property name="can_focus">True</property>
- <property name="adjustment">preview_progress_adj</property>
- <property name="draw_value">False</property>
- <property name="value_pos">right</property>
- <signal name="value-changed" handler="live_preview_seek_cb" swapped="no"/>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkBox" id="live_progress_box">
+ <object class="GtkBox" id="preview_hud_box">
<property name="orientation">vertical</property>
<property name="visible">True</property>
- <property name="can_focus">False</property>
- <child>
- <object class="GtkProgressBar" id="live_encode_progress">
- <property name="height_request">20</property>
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">0</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="position">2</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkBox" id="hbox26">
- <property name="orientation">horizontal</property>
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="spacing">10</property>
- <child>
- <object class="GtkBox" id="live_preview_duration_box">
- <property name="orientation">horizontal</property>
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="spacing">2</property>
<child>
- <object class="GtkLabel" id="label37">
+ <object class="GtkEventBox" id="preview_hud">
<property name="visible">True</property>
+ <property name="app_paintable">True</property>
<property name="can_focus">False</property>
- <property name="label" translatable="yes">&lt;b&gt;Duration:&lt;/b&gt;</property>
- <property name="use_markup">True</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkSpinButton" id="live_duration">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="tooltip_text" translatable="yes">Set the duration of the live preview in seconds.</property>
- <property name="primary_icon_activatable">False</property>
- <property name="secondary_icon_activatable">False</property>
- <property name="adjustment">adjustment21</property>
- <property name="numeric">True</property>
- <signal name="value-changed" handler="preview_duration_changed_cb" swapped="no"/>
+ <property name="hexpand">True</property>
+ <property name="vexpand">True</property>
+ <property name="hexpand-set">True</property>
+ <property name="vexpand-set">True</property>
+ <property name="halign">center</property>
+ <property name="valign">end</property>
+ <property name="margin-bottom">30</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK</property>
+ <signal name="enter-notify-event" handler="hud_enter_cb" swapped="no"/>
+ <signal name="leave-notify-event" handler="hud_leave_cb" swapped="no"/>
+ <signal name="size-allocate" handler="hud_size_alloc_cb" swapped="no"/>
+ <child>
+ <object class="GtkBox" id="vbox35">
+ <property name="orientation">vertical</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ <property name="margin-left">10</property>
+ <property name="margin-right">10</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ <child>
+ <object class="GtkScale" id="preview_frame">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="tooltip_text" translatable="yes">Select preview frames.</property>
+ <property name="adjustment">adjustment19</property>
+ <property name="digits">0</property>
+ <property name="value_pos">bottom</property>
+ <signal name="value-changed" handler="preview_frame_value_changed_cb" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="live_preview_box">
+ <property name="orientation">horizontal</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkButton" id="live_preview_play">
+ <property name="height_request">30</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="tooltip_text" translatable="yes">Encode and play a short sequence of video starting from the current preview position.</property>
+ <property name="relief">none</property>
+ <signal name="clicked" handler="live_preview_start_cb" swapped="no"/>
+ <child>
+ <object class="GtkImage" id="live_preview_play_image">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="icon_name">gtk-media-play</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkScale" id="live_preview_progress">
+ <property name="can_focus">True</property>
+ <property name="adjustment">preview_progress_adj</property>
+ <property name="draw_value">False</property>
+ <property name="value_pos">right</property>
+ <signal name="value-changed" handler="live_preview_seek_cb" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="live_progress_box">
+ <property name="orientation">vertical</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkProgressBar" id="live_encode_progress">
+ <property name="height_request">20</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="hbox26">
+ <property name="orientation">horizontal</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">10</property>
+ <child>
+ <object class="GtkBox" id="live_preview_duration_box">
+ <property name="orientation">horizontal</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">2</property>
+ <child>
+ <object class="GtkLabel" id="label37">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">&lt;b&gt;Duration:&lt;/b&gt;</property>
+ <property name="use_markup">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="live_duration">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="tooltip_text" translatable="yes">Set the duration of the live preview in seconds.</property>
+ <property name="primary_icon_activatable">False</property>
+ <property name="secondary_icon_activatable">False</property>
+ <property name="adjustment">adjustment21</property>
+ <property name="numeric">True</property>
+ <signal name="value-changed" handler="preview_duration_changed_cb" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkCheckButton" id="preview_show_crop">
+ <property name="label" translatable="yes">Show Crop</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="tooltip_text" translatable="yes">Show Cropped area of the preview</property>
+ <property name="halign">start</property>
+ <property name="draw_indicator">True</property>
+ <signal name="toggled" handler="show_crop_changed_cb" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkToggleButton" id="preview_fullscreen">
+ <property name="label" translatable="yes">Fullscreen</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="tooltip_text" translatable="yes">View Fullscreen Preview</property>
+ <property name="relief">none</property>
+ <signal name="toggled" handler="fullscreen_clicked_cb" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ </child>
</object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">1</property>
- </packing>
</child>
</object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkCheckButton" id="preview_show_crop">
- <property name="label" translatable="yes">Show Crop</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">False</property>
- <property name="tooltip_text" translatable="yes">Show Cropped area of the preview</property>
- <property name="halign">start</property>
- <property name="draw_indicator">True</property>
- <signal name="toggled" handler="show_crop_changed_cb" swapped="no"/>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkToggleButton" id="preview_fullscreen">
- <property name="label" translatable="yes">Fullscreen</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">False</property>
- <property name="tooltip_text" translatable="yes">View Fullscreen Preview</property>
- <property name="relief">none</property>
- <signal name="toggled" handler="fullscreen_clicked_cb" swapped="no"/>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">2</property>
- </packing>
</child>
</object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">2</property>
- </packing>
</child>
</object>
</child>
</object>
- <object class="GtkWindow" id="preview_window">
- <property name="can_focus">False</property>
- <property name="events">GDK_POINTER_MOTION_MASK | GDK_STRUCTURE_MASK</property>
- <property name="title" translatable="yes">Preview</property>
- <property name="resizable">False</property>
- <property name="window_position">center</property>
- <property name="type_hint">utility</property>
- <property name="skip_taskbar_hint">True</property>
- <property name="skip_pager_hint">True</property>
- <property name="transient_for">hb_window</property>
- <signal name="configure-event" handler="preview_configure_cb" swapped="no"/>
- <signal name="delete-event" handler="preview_window_delete_cb" swapped="no"/>
- <child>
- <object class="GtkBox" id="preview_window_box">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- </object>
- </child>
- </object>
<object class="GtkFileChooserDialog" id="source_dialog">
<property name="can_focus">False</property>
<property name="border_width">5</property>
diff --git a/gtk/src/ghbcompositor.c b/gtk/src/ghbcompositor.c
deleted file mode 100644
index 4e7353da3..000000000
--- a/gtk/src/ghbcompositor.c
+++ /dev/null
@@ -1,713 +0,0 @@
-/* "Borrowed" from: */
-/* GTK - The GIMP Toolkit
- * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-/*
- * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS
- * file for a list of people on the GTK+ Team. See the ChangeLog
- * files for a list of changes. These files are distributed with
- * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
- */
-
-#include <config.h>
-#include <stdlib.h>
-#include "ghbcompat.h"
-#include "ghbcompositor.h"
-
-enum {
- PROP_0,
-};
-
-enum {
- CHILD_PROP_0,
- CHILD_PROP_Z_POS,
- CHILD_PROP_OPACITY
-};
-
-#define GHB_COMPOSITOR_GET_PRIVATE(obj) G_TYPE_INSTANCE_GET_PRIVATE((obj), GHB_TYPE_COMPOSITOR, GhbCompositorPrivate)
-
-static void ghb_compositor_finalize (GObject *object);
-static void ghb_compositor_realize (GtkWidget *widget);
-static void ghb_compositor_unrealize (GtkWidget *widget);
-static void ghb_compositor_size_allocate (GtkWidget *widget,
- GtkAllocation *allocation);
-static gboolean ghb_compositor_draw (GtkWidget *widget,
- cairo_t *cr);
-static void ghb_compositor_get_preferred_width(GtkWidget *widget,
- gint *minimum_size,
- gint *natural_size);
-static void ghb_compositor_get_preferred_height(GtkWidget *widget,
- gint *minimum_size,
- gint *natural_size);
-static void ghb_compositor_set_property (GObject *object,
- guint prop_id,
- const GValue *value,
- GParamSpec *pspec);
-static void ghb_compositor_get_property (GObject *object,
- guint prop_id,
- GValue *value,
- GParamSpec *pspec);
-static void ghb_compositor_add (GtkContainer *container,
- GtkWidget *widget);
-static void ghb_compositor_remove (GtkContainer *container,
- GtkWidget *widget);
-static void ghb_compositor_forall (GtkContainer *container,
- gboolean include_internals,
- GtkCallback callback,
- gpointer data);
-static GType ghb_compositor_child_type (GtkContainer *container);
-static void ghb_compositor_set_child_property (GtkContainer *container,
- GtkWidget *child,
- guint prop_id,
- const GValue *value,
- GParamSpec *pspec);
-static void ghb_compositor_get_child_property (GtkContainer *container,
- GtkWidget *child,
- guint prop_id,
- GValue *value,
- GParamSpec *pspec);
-
-G_DEFINE_TYPE (GhbCompositor, ghb_compositor, GTK_TYPE_BIN)
-
-static void
-ghb_compositor_class_init (GhbCompositorClass *class)
-{
- GObjectClass *gobject_class = G_OBJECT_CLASS (class);
- GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class);
- GtkContainerClass *container_class = GTK_CONTAINER_CLASS (class);
-
- gobject_class->finalize = ghb_compositor_finalize;
-
- gobject_class->set_property = ghb_compositor_set_property;
- gobject_class->get_property = ghb_compositor_get_property;
-
- widget_class->draw = ghb_compositor_draw;
- widget_class->get_preferred_width = ghb_compositor_get_preferred_width;
- widget_class->get_preferred_height = ghb_compositor_get_preferred_height;
- widget_class->size_allocate = ghb_compositor_size_allocate;
-
- widget_class->realize = ghb_compositor_realize;
- widget_class->unrealize = ghb_compositor_unrealize;
-
- container_class->add = ghb_compositor_add;
- container_class->remove = ghb_compositor_remove;
- container_class->forall = ghb_compositor_forall;
- container_class->child_type = ghb_compositor_child_type;
- container_class->set_child_property = ghb_compositor_set_child_property;
- container_class->get_child_property = ghb_compositor_get_child_property;
-
- gtk_container_class_install_child_property (container_class,
- CHILD_PROP_Z_POS,
- g_param_spec_uint ("z-pos",
- "Position in Z-List",
- "Sets the blending order of the child.",
- 0, 65535, 0,
- G_PARAM_READWRITE));
-
- gtk_container_class_install_child_property (container_class,
- CHILD_PROP_OPACITY,
- g_param_spec_double ("opacity",
- "Opacity",
- "Sets the opacity of the child.",
- 0.0, 1.0, 1.0,
- G_PARAM_READWRITE));
-
-}
-
-static GType
-ghb_compositor_child_type(GtkContainer *container)
-{
- return GTK_TYPE_WIDGET;
-}
-
-static void
-ghb_compositor_get_property (
- GObject *object,
- guint prop_id,
- GValue *value,
- GParamSpec *pspec)
-{
- switch (prop_id)
- {
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
-
-static void
-ghb_compositor_set_property (
- GObject *object,
- guint prop_id,
- const GValue *value,
- GParamSpec *pspec)
-{
- switch (prop_id)
- {
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
-
-static gint
-zsort(gconstpointer a, gconstpointer b)
-{
- GhbCompositorChild *cca, *ccb;
-
- cca = (GhbCompositorChild*)a;
- ccb = (GhbCompositorChild*)b;
-
- return (cca->z_pos - ccb->z_pos);
-}
-
-static void
-ghb_compositor_set_child_property(
- GtkContainer *container,
- GtkWidget *child,
- guint prop_id,
- const GValue *value,
- GParamSpec *pspec)
-{
- GhbCompositor *compositor;
- GhbCompositorChild *cc;
- GList *link;
-
- compositor = GHB_COMPOSITOR(container);
-
- for (link = compositor->children; link != NULL; link = link->next)
- {
- cc = (GhbCompositorChild*)link->data;
- if (cc->widget == child)
- break;
- }
- if (link == NULL)
- {
- GTK_CONTAINER_WARN_INVALID_CHILD_PROPERTY_ID(container, prop_id, pspec);
- return;
- }
-
- switch (prop_id)
- {
- case CHILD_PROP_Z_POS:
- {
- cc->z_pos = g_value_get_uint(value);
- compositor->children = g_list_sort(compositor->children, zsort);
- } break;
- case CHILD_PROP_OPACITY:
- {
- cc->opacity = g_value_get_double(value);
- } break;
- default:
- GTK_CONTAINER_WARN_INVALID_CHILD_PROPERTY_ID(container, prop_id, pspec);
- break;
- }
-
- if (gtk_widget_get_visible (child) &&
- gtk_widget_get_visible (GTK_WIDGET(compositor)))
- {
- gtk_widget_queue_resize (child);
- }
-
-}
-
-static void
-ghb_compositor_get_child_property(
- GtkContainer *container,
- GtkWidget *child,
- guint prop_id,
- GValue *value,
- GParamSpec *pspec)
-{
- GhbCompositor *compositor;
- GhbCompositorChild *cc;
- GList *link;
-
- compositor = GHB_COMPOSITOR(container);
-
- for (link = compositor->children; link != NULL; link = link->next)
- {
- cc = (GhbCompositorChild*)link->data;
- if (cc->widget == child)
- break;
- }
- if (link == NULL)
- {
- GTK_CONTAINER_WARN_INVALID_CHILD_PROPERTY_ID(container, prop_id, pspec);
- return;
- }
-
- switch (prop_id)
- {
- case CHILD_PROP_Z_POS:
- {
- g_value_set_uint(value, cc->z_pos);
- } break;
- case CHILD_PROP_OPACITY:
- {
- g_value_set_double(value, cc->opacity);
- } break;
- default:
- GTK_CONTAINER_WARN_INVALID_CHILD_PROPERTY_ID(container, prop_id, pspec);
- break;
- }
-}
-
-static void
-ghb_compositor_init (GhbCompositor *compositor)
-{
- gtk_widget_set_has_window(GTK_WIDGET(compositor), TRUE);
-}
-
-GtkWidget*
-ghb_compositor_new (void)
-{
- return GTK_WIDGET(g_object_new (GHB_TYPE_COMPOSITOR, NULL));
-}
-
-#if 0
-static void
-showtype(const gchar *msg, GtkWidget *widget)
-{
- GType type;
- gchar *str;
-
- type = G_OBJECT_TYPE(widget);
- if (type == GTK_TYPE_DRAWING_AREA)
- str = "drawing area";
- else if (type == GTK_TYPE_ALIGNMENT)
- str = "alignment";
- else if (type == GTK_TYPE_EVENT_BOX)
- str = "event box";
- else if (type == GTK_TYPE_EVENT_BOX)
- str = "event box";
- else
- str = "unknown";
- g_message("%s: %s", msg, str);
-}
-#endif
-
-static void
-find_drawables(GtkWidget *widget, gpointer data)
-{
- GList *drawables, **pdrawables;
- pdrawables = (GList**)data;
- drawables = *pdrawables;
-
- if (gtk_widget_get_has_window(widget))
- {
- drawables = g_list_append(drawables, widget);
- *pdrawables = drawables;
- return;
- }
- if (GTK_IS_CONTAINER(widget))
- {
- gtk_container_forall(GTK_CONTAINER(widget), find_drawables, data);
- }
-}
-
-
-/**
- * ghb_compositor_zlist_insert:
- * @compositor: a #GhbCompositor
- * @child: widgets to insert
- * @z_pos: position
- * @opacity: global opacity for this widget
- *
- * Insert in the given position of the zlist in the compositor.
- * All children in the zlist must have associated GdkDrawable's
- * This means they must be GtkDrawingArea or GtkEventBox
- *
- **/
-void
-ghb_compositor_zlist_insert (
- GhbCompositor *compositor,
- GtkWidget *child,
- gint z_pos,
- gdouble opacity)
-{
- GhbCompositorChild *cc;
- GdkDisplay *display;
-
- g_return_if_fail (GHB_IS_COMPOSITOR (compositor));
- g_return_if_fail (GTK_IS_WIDGET (child));
- g_return_if_fail (gtk_widget_get_parent(child) == NULL);
-
- gtk_widget_set_parent(child, GTK_WIDGET(compositor));
-
- display = gtk_widget_get_display (GTK_WIDGET(compositor));
-
- cc = g_new(GhbCompositorChild, 1);
- cc->widget = child;
- cc->z_pos = z_pos;
- cc->opacity = opacity;
- cc->drawables = NULL;
- compositor->children = g_list_insert_sorted(
- compositor->children, cc, zsort);
-
- if (gdk_display_supports_composite(display))
- {
- GList *link;
-
- cc->drawables = NULL;
- find_drawables(cc->widget, &cc->drawables);
-
- for (link = cc->drawables; link != NULL; link = link->next)
- {
- gtk_widget_realize(GTK_WIDGET(link->data));
- gdk_window_set_composited(gtk_widget_get_window(GTK_WIDGET(link->data)), TRUE);
- }
- }
-}
-
-static void
-ghb_compositor_add(GtkContainer *container, GtkWidget *child)
-{
- GhbCompositor *compositor = GHB_COMPOSITOR(container);
- GhbCompositorChild *cc;
- gint z_pos = 0;
- GList *last = g_list_last(compositor->children);
-
- if (last != NULL)
- {
- cc = (GhbCompositorChild*)last->data;
- z_pos = cc->z_pos + 1;
- }
- ghb_compositor_zlist_insert(compositor, child, z_pos, 1.0);
-}
-
-static void
-ghb_compositor_remove(GtkContainer *container, GtkWidget *child)
-{
- GhbCompositor *compositor = GHB_COMPOSITOR(container);
- GhbCompositorChild *cc;
- GList *link;
-
- for (link = compositor->children; link != NULL; link = link->next)
- {
- cc = (GhbCompositorChild*)link->data;
- if (cc->widget == child)
- {
- gboolean was_visible = gtk_widget_get_visible( child );
- gtk_widget_unparent(child);
- compositor->children = g_list_remove_link(
- compositor->children, link);
- g_list_free(link);
- g_free(cc);
-
- if (was_visible && gtk_widget_get_visible (GTK_WIDGET(container)))
- gtk_widget_queue_resize(GTK_WIDGET(container));
- break;
- }
- }
-}
-
-static void
-ghb_compositor_forall(
- GtkContainer *container,
- gboolean include_internals,
- GtkCallback callback,
- gpointer data)
-{
- GhbCompositor *compositor = GHB_COMPOSITOR (container);
- GhbCompositorChild *cc;
- GList *link, *next;
-
- for (link = compositor->children; link != NULL; )
- {
- // The callback may cause the link to be removed from the list.
- // So find next before calling callback
- next = link->next;
- cc = (GhbCompositorChild*)link->data;
- (*callback)(cc->widget, data);
- link = next;
- }
-}
-
-static void
-ghb_compositor_finalize (GObject *object)
-{
- GhbCompositor *compositor = GHB_COMPOSITOR (object);
- GhbCompositorChild *cc;
- GList *link;
-
- for (link = compositor->children; link != NULL; link = link->next)
- {
- cc = (GhbCompositorChild*)link->data;
- g_list_free(cc->drawables);
- g_free(cc);
- }
- g_list_free(compositor->children);
- G_OBJECT_CLASS (ghb_compositor_parent_class)->finalize (object);
-}
-
-
-static void
-ghb_compositor_realize (GtkWidget *widget)
-{
- GdkWindowAttr attributes;
- gint attributes_mask;
- gint border_width;
- gboolean visible_window;
-
- gtk_widget_set_realized(widget, TRUE);
-
- border_width = gtk_container_get_border_width(GTK_CONTAINER (widget));
-
- GtkAllocation allocation;
- gtk_widget_get_allocation(widget, &allocation);
-
- attributes.x = allocation.x + border_width;
- attributes.y = allocation.y + border_width;
- attributes.width = allocation.width - 2*border_width;
- attributes.height = allocation.height - 2*border_width;
- attributes.window_type = GDK_WINDOW_CHILD;
- attributes.event_mask = gtk_widget_get_events (widget)
- | GDK_BUTTON_MOTION_MASK
- | GDK_BUTTON_PRESS_MASK
- | GDK_BUTTON_RELEASE_MASK
- | GDK_EXPOSURE_MASK
- | GDK_ENTER_NOTIFY_MASK
- | GDK_LEAVE_NOTIFY_MASK;
-
- visible_window = gtk_widget_get_has_window(widget);
-
- GdkWindow *window;
- if (visible_window)
- {
- attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL;
- attributes.visual = gtk_widget_get_visual (widget);
- attributes.wclass = GDK_INPUT_OUTPUT;
-
-
- window = gdk_window_new(gtk_widget_get_parent_window (widget),
- &attributes, attributes_mask);
- gtk_widget_set_window(widget, window);
- gdk_window_set_user_data(window, widget);
- }
- else
- {
- window = gtk_widget_get_parent_window (widget);
- gtk_widget_set_window(widget, window);
- g_object_ref (window);
- }
-}
-
-static void
-ghb_compositor_unrealize (GtkWidget *widget)
-{
- GTK_WIDGET_CLASS (ghb_compositor_parent_class)->unrealize (widget);
-}
-
-static void
-ghb_compositor_get_preferred_width(
- GtkWidget *widget,
- gint *minimum_size,
- gint *natural_size)
-{
- GhbCompositor *compositor = GHB_COMPOSITOR (widget);
- GList *link;
- GhbCompositorChild *cc;
- gint width = 0;
- GtkRequisition min_size, size;
-
- for (link = compositor->children; link != NULL; link = link->next)
- {
- cc = (GhbCompositorChild*)link->data;
- if (gtk_widget_get_visible(cc->widget))
- {
- gtk_widget_get_preferred_size(cc->widget, &min_size, &size);
- width = MAX(MAX(min_size.width, size.width), width);
- }
- }
-
- *minimum_size = width + gtk_container_get_border_width(GTK_CONTAINER (widget)) * 2;
- *natural_size = width + gtk_container_get_border_width(GTK_CONTAINER (widget)) * 2;
-}
-
-static void
-ghb_compositor_get_preferred_height(
- GtkWidget *widget,
- gint *minimum_size,
- gint *natural_size)
-{
- GhbCompositor *compositor = GHB_COMPOSITOR (widget);
- GList *link;
- GhbCompositorChild *cc;
- gint height = 0;
- GtkRequisition min_size, size;
-
- for (link = compositor->children; link != NULL; link = link->next)
- {
- cc = (GhbCompositorChild*)link->data;
- if (gtk_widget_get_visible(cc->widget))
- {
- gtk_widget_get_preferred_size(cc->widget, &min_size, &size);
- height = MAX(MAX(min_size.height, size.height), height);
- }
- }
-
- *minimum_size = height + gtk_container_get_border_width(GTK_CONTAINER (widget)) * 2;
- *natural_size = height + gtk_container_get_border_width(GTK_CONTAINER (widget)) * 2;
-}
-
-static void
-ghb_compositor_size_allocate (GtkWidget *widget, GtkAllocation *allocation)
-{
- GhbCompositor *compositor;
- GtkAllocation child_allocation;
- GhbCompositorChild *cc;
- GList *link;
-
- gtk_widget_set_allocation(widget, allocation);
- compositor = GHB_COMPOSITOR (widget);
-
- if (!gtk_widget_get_has_window(widget))
- {
- child_allocation.x = allocation->x +
- gtk_container_get_border_width(GTK_CONTAINER(widget));
- child_allocation.y = allocation->y +
- gtk_container_get_border_width(GTK_CONTAINER(widget));
- }
- else
- {
- child_allocation.x = 0;
- child_allocation.y = 0;
- }
-
- child_allocation.width = MAX (allocation->width -
- gtk_container_get_border_width(GTK_CONTAINER (widget)) * 2, 0);
- child_allocation.height = MAX (allocation->height -
- gtk_container_get_border_width(GTK_CONTAINER (widget)) * 2, 0);
-
- if (gtk_widget_get_realized(widget))
- {
- if (gtk_widget_get_has_window(widget))
- {
- gdk_window_move_resize (gtk_widget_get_window(widget),
- allocation->x + gtk_container_get_border_width(GTK_CONTAINER (widget)),
- allocation->y + gtk_container_get_border_width(GTK_CONTAINER (widget)),
- child_allocation.width,
- child_allocation.height);
- }
- }
- for (link = compositor->children; link != NULL; link = link->next)
- {
- cc = (GhbCompositorChild*)link->data;
- if (gtk_widget_get_realized (cc->widget))
- gtk_widget_size_allocate (cc->widget, &child_allocation);
- }
-}
-
-#if 0
-static void showrects(cairo_region_t *region)
-{
- cairo_rectangle_int_t rect;
- int ii;
- int count = cairo_region_num_rectangles(region);
-
- printf("rect count %d\n", count);
- for (ii = 0; ii < count; ii++)
- {
- cairo_region_get_rectangle(region, ii, &rect);
- printf("rect %d: %d,%d %dx%d\n",
- ii, rect.x, rect.y, rect.width, rect.height);
- }
-}
-#endif
-
-static void
-ghb_compositor_blend (GtkWidget *widget, cairo_t *cr)
-{
- GhbCompositor *compositor = GHB_COMPOSITOR (widget);
- GList *link, *draw;
- cairo_region_t *region;
- GtkWidget *child;
- GhbCompositorChild *cc;
-
- if (compositor->children == NULL) return;
- /* create a cairo context to draw to the window */
-
- for (link = compositor->children; link != NULL; link = link->next)
- {
- cc = (GhbCompositorChild*)link->data;
- for (draw = cc->drawables; draw != NULL; draw = draw->next)
- {
- GtkAllocation child_alloc;
-
- /* get our child */
- child = GTK_WIDGET(draw->data);
-
- if (
-//!gtk_cairo_should_draw_window(cr, gtk_widget_get_window(child)) ||
- !gtk_widget_get_visible(cc->widget) ||
- !gtk_widget_get_visible(child))
- continue;
-
- gtk_widget_get_allocation(child, &child_alloc);
- cairo_save(cr);
-
- /* the source data is the (composited) event box */
- gdk_cairo_set_source_window(cr, gtk_widget_get_window(child),
- child_alloc.x,
- child_alloc.y);
-
- cairo_rectangle_int_t rect;
-
- rect.x = child_alloc.x;
- rect.y = child_alloc.y;
- rect.width = child_alloc.width;
- rect.height = child_alloc.height;
-
- /* draw no more than our expose event intersects our child */
- region = cairo_region_create_rectangle(&rect);
-
- cairo_region_t *dregion = gdk_window_get_visible_region(
- gtk_widget_get_window(child));
- cairo_region_translate(dregion, child_alloc.x, child_alloc.y);
- cairo_region_intersect(region, dregion);
- cairo_region_destroy(dregion);
-
- gdk_cairo_region(cr, region);
- cairo_region_destroy(region);
- cairo_clip(cr);
-
- /* composite, with an opacity */
- cairo_set_operator(cr, CAIRO_OPERATOR_OVER);
- cairo_paint_with_alpha(cr, cc->opacity);
-
- cairo_restore(cr);
- }
- }
- /* we're done */
-}
-
-static gboolean
-ghb_compositor_draw(GtkWidget *widget, cairo_t *cr)
-{
- if (gtk_widget_is_drawable(widget))
- {
- if (gtk_widget_get_has_window(widget))
- ghb_compositor_blend (widget, cr);
-
- }
- GTK_WIDGET_CLASS(ghb_compositor_parent_class)->draw(widget, cr);
-
- return FALSE;
-}
diff --git a/gtk/src/ghbcompositor.h b/gtk/src/ghbcompositor.h
deleted file mode 100644
index 7f6914e93..000000000
--- a/gtk/src/ghbcompositor.h
+++ /dev/null
@@ -1,74 +0,0 @@
-/* "Borrowed" from: */
-/* GTK - The GIMP Toolkit
- * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-/*
- * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS
- * file for a list of people on the GTK+ Team. See the ChangeLog
- * files for a list of changes. These files are distributed with
- * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
- */
-#ifndef __GHB_COMPOSITOR_H__
-#define __GHB_COMPOSITOR_H__
-
-
-#include <gtk/gtk.h>
-
-
-G_BEGIN_DECLS
-
-#define GHB_TYPE_COMPOSITOR (ghb_compositor_get_type ())
-#define GHB_COMPOSITOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GHB_TYPE_COMPOSITOR, GhbCompositor))
-#define GHB_COMPOSITOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GHB_TYPE_COMPOSITOR, GhbCompositorClass))
-#define GHB_IS_COMPOSITOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GHB_TYPE_COMPOSITOR))
-#define GHB_IS_COMPOSITOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GHB_TYPE_COMPOSITOR))
-#define GHB_COMPOSITOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GHB_TYPE_COMPOSITOR, GhbCompositorClass))
-
-typedef struct _GhbCompositor GhbCompositor;
-typedef struct _GhbCompositorClass GhbCompositorClass;
-typedef struct _GhbCompositorChild GhbCompositorChild;
-
-struct _GhbCompositor
-{
- GtkBin bin;
- GList *children;
-};
-
-struct _GhbCompositorClass
-{
- GtkBinClass parent_class;
-};
-
-struct _GhbCompositorChild
-{
- GtkWidget *widget;
- GList *drawables;
- guint z_pos;
- gdouble opacity;
-};
-
-GType ghb_compositor_get_type (void) G_GNUC_CONST;
-GtkWidget* ghb_compositor_new (void);
-void ghb_compositor_zlist_insert (GhbCompositor *compositor,
- GtkWidget *child,
- gint z_pos, gdouble opacity);
-
-G_END_DECLS
-
-#endif /* __GHB_COMPOSITOR_H__ */
diff --git a/gtk/src/main.c b/gtk/src/main.c
index 2ccee63c3..255bcae9a 100644
--- a/gtk/src/main.c
+++ b/gtk/src/main.c
@@ -66,7 +66,6 @@
#include "resources.h"
#include "presets.h"
#include "preview.h"
-#include "ghbcompositor.h"
#include "ui_res.h"
@@ -912,8 +911,8 @@ main(int argc, char *argv[])
// Since GtkBuilder no longer assigns object ids to widget names
// Assign a few that are necessary for style overrides to work
- GtkWidget *widget;
#if defined(_NO_UPDATE_CHECK)
+ GtkWidget *widget;
widget = GHB_WIDGET(ud->builder, "check_updates_box");
gtk_widget_hide(widget);
#endif
@@ -929,51 +928,6 @@ main(int argc, char *argv[])
gtk_widget_set_name(GHB_WIDGET(ud->builder, "preview_show_crop"), "preview_show_crop");
gtk_widget_set_name(GHB_WIDGET(ud->builder, "preview_fullscreen"), "preview_fullscreen");
gtk_widget_set_name(GHB_WIDGET(ud->builder, "activity_view"), "activity_view");
- widget = GHB_WIDGET(ud->builder, "preview_hud");
- gtk_widget_set_name(widget, "preview_hud");
- widget = GHB_WIDGET(ud->builder, "preview_window");
- gtk_widget_set_name(widget, "preview_window");
-
- // Set up the "hud" control overlay for the preview window
- GtkWidget *preview_box, *draw, *hud, *blender;
-
- preview_box = GHB_WIDGET(ud->builder, "preview_window_box");
- draw = GHB_WIDGET(ud->builder, "preview_image");
- hud = GHB_WIDGET(ud->builder, "preview_hud");
-
-#if 0 // GTK_CHECK_VERSION(3, 0, 0)
- // This uses the new GtkOverlay widget.
- //
- // Unfortunately, GtkOverlay is broken in a couple of ways.
- //
- // First, it doesn't respect gtk_widget_shape_combine_region()
- // on it's child overlays. It appears to just ignore the clip
- // mask of the child.
- //
- // Second, it doesn't respect window opacity.
- //
- // So for now, I'll just continue using my home-grown overlay
- // widget (GhbCompositor).
- blender = gtk_overlay_new();
- gtk_container_add(GTK_CONTAINER(preview_box), blender);
- gtk_container_add(GTK_CONTAINER(blender), draw);
- gtk_widget_set_valign (hud, GTK_ALIGN_END);
- gtk_widget_set_halign (hud, GTK_ALIGN_CENTER);
- gtk_overlay_add_overlay(GTK_OVERLAY(blender), hud);
-
- g_signal_connect(G_OBJECT(blender), "get-child-position",
- G_CALLBACK(position_overlay_cb), ud);
-
- gtk_widget_show(blender);
-#else
- // Set up compositing for hud
- blender = ghb_compositor_new();
-
- gtk_container_add(GTK_CONTAINER(preview_box), blender);
- ghb_compositor_zlist_insert(GHB_COMPOSITOR(blender), draw, 1, 1);
- ghb_compositor_zlist_insert(GHB_COMPOSITOR(blender), hud, 2, .85);
- gtk_widget_show(blender);
-#endif
// Redirect stderr to the activity window
ghb_preview_init(ud);
diff --git a/gtk/src/preview.c b/gtk/src/preview.c
index b4bcc4fe2..656bd18a5 100644
--- a/gtk/src/preview.c
+++ b/gtk/src/preview.c
@@ -77,9 +77,6 @@ static GstBusSyncReply create_window(GstBus *bus, GstMessage *msg,
gpointer data);
#endif
-G_MODULE_EXPORT gboolean preview_expose_cb(GtkWidget *widget, GdkEventExpose *event,
- signal_user_data_t *ud);
-
void
ghb_screen_par(signal_user_data_t *ud, gint *par_n, gint *par_d)
{
@@ -152,6 +149,27 @@ ghb_par_scale(signal_user_data_t *ud, gint *width, gint *height, gint par_n, gin
*height = *height * den / num;
}
+static GdkWindow*
+preview_window(GtkWidget *widget)
+{
+ return gtk_layout_get_bin_window(GTK_LAYOUT(widget));
+}
+
+void
+preview_set_size(signal_user_data_t *ud, int width, int height)
+{
+ GtkWidget *widget;
+
+ widget = GHB_WIDGET (ud->builder, "preview_image");
+ gtk_widget_set_size_request(widget, width, height);
+ gtk_layout_set_size(GTK_LAYOUT(widget), width, height);
+ widget = GHB_WIDGET (ud->builder, "preview_hud_box");
+ gtk_widget_set_size_request(widget, width, height);
+
+ ud->preview->width = width;
+ ud->preview->height = height;
+}
+
void
ghb_preview_init(signal_user_data_t *ud)
{
@@ -160,20 +178,18 @@ ghb_preview_init(signal_user_data_t *ud)
ud->preview = g_malloc0(sizeof(preview_t));
ud->preview->view = GHB_WIDGET(ud->builder, "preview_image");
gtk_widget_realize(ud->preview->view);
- g_signal_connect(G_OBJECT(ud->preview->view), "draw",
- G_CALLBACK(preview_expose_cb), ud);
ud->preview->pause = TRUE;
ud->preview->encode_frame = -1;
ud->preview->live_id = -1;
- widget = GHB_WIDGET (ud->builder, "preview_button_image");
+ widget = GHB_WIDGET(ud->builder, "preview_button_image");
gtk_widget_get_size_request(widget, &ud->preview->button_width, &ud->preview->button_height);
#if defined(_ENABLE_GST)
GstBus *bus;
GstElement *xover;
- if (!gdk_window_ensure_native(gtk_widget_get_window(ud->preview->view)))
+ if (!gdk_window_ensure_native(preview_window(ud->preview->view)))
{
g_message("Couldn't create native window for GstXOverlay. Disabling live preview.");
GtkWidget *widget = GHB_WIDGET(ud->builder, "live_preview_box");
@@ -182,11 +198,19 @@ ghb_preview_init(signal_user_data_t *ud)
gtk_widget_hide (widget);
return;
}
+ widget = GHB_WIDGET(ud->builder, "preview_hud");
+ gtk_widget_realize(widget);
+ // Use a native window for the HUD. Client side windows don't get
+ // updated properly as video changes benieth them.
+ if (!gdk_window_ensure_native(gtk_widget_get_window(widget)))
+ {
+ g_message("Couldn't create native window for HUD.");
+ }
#if !defined(_WIN32)
- ud->preview->xid = GDK_WINDOW_XID(gtk_widget_get_window(ud->preview->view));
+ ud->preview->xid = GDK_WINDOW_XID(preview_window(ud->preview->view));
#else
- ud->preview->xid = GDK_WINDOW_HWND(gtk_widget_get_window(ud->preview->view));
+ ud->preview->xid = GDK_WINDOW_HWND(preview_window(ud->preview->view));
#endif
ud->preview->play = gst_element_factory_make("playbin", "play");
xover = gst_element_factory_make("gconfvideosink", "xover");
@@ -331,9 +355,7 @@ caps_set(GstCaps *caps, signal_user_data_t *ud)
if (width != ud->preview->width || height != ud->preview->height)
{
- gtk_widget_set_size_request(ud->preview->view, width, height);
- ud->preview->width = width;
- ud->preview->height = height;
+ preview_set_size(ud, width, height);
}
}
}
@@ -909,14 +931,10 @@ live_preview_seek_cb(GtkWidget *widget, signal_user_data_t *ud)
#endif
}
-static void _draw_pixbuf(GdkWindow *window, GdkPixbuf *pixbuf)
+static void _draw_pixbuf(cairo_t *cr, GdkPixbuf *pixbuf)
{
- cairo_t *cr;
-
- cr = gdk_cairo_create(window);
gdk_cairo_set_source_pixbuf(cr, pixbuf, 0, 0);
cairo_paint(cr);
- cairo_destroy(cr);
}
void
@@ -965,11 +983,9 @@ ghb_set_preview_image(signal_user_data_t *ud)
if (preview_width != ud->preview->width ||
preview_height != ud->preview->height)
{
- gtk_widget_set_size_request(widget, preview_width, preview_height);
- ud->preview->width = preview_width;
- ud->preview->height = preview_height;
+ preview_set_size(ud, preview_width, preview_height);
}
- _draw_pixbuf(gtk_widget_get_window(widget), ud->preview->pix);
+ gtk_widget_queue_draw(widget);
gchar *text = g_strdup_printf("%d x %d", width, height);
widget = GHB_WIDGET (ud->builder, "preview_dims");
@@ -1000,6 +1016,75 @@ ghb_set_preview_image(signal_user_data_t *ud)
}
}
+static cairo_region_t*
+curved_rect_mask(GtkWidget *widget)
+{
+ GdkWindow *window;
+ cairo_region_t *shape;
+ cairo_surface_t *surface;
+ cairo_t *cr;
+ double w, h;
+ int radius;
+
+ if (!gtk_widget_get_realized(widget))
+ return NULL;
+
+ window = gtk_widget_get_window(widget);
+ w = gdk_window_get_width(window);
+ h = gdk_window_get_height(window);
+ if (w <= 50 || h <= 50)
+ return NULL;
+ radius = h / 4;
+ surface = gdk_window_create_similar_surface(window,
+ CAIRO_CONTENT_COLOR_ALPHA,
+ w, h);
+ cr = cairo_create (surface);
+
+ if (radius > w / 2)
+ radius = w / 2;
+ if (radius > h / 2)
+ radius = h / 2;
+
+ // fill shape with black
+ cairo_save(cr);
+ cairo_rectangle (cr, 0, 0, w, h);
+ cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR);
+ cairo_fill (cr);
+ cairo_restore (cr);
+
+ cairo_move_to (cr, 0, radius);
+ cairo_curve_to (cr, 0 , 0, 0 , 0, radius, 0);
+ cairo_line_to (cr, w - radius, 0);
+ cairo_curve_to (cr, w, 0, w, 0, w, radius);
+ cairo_line_to (cr, w , h - radius);
+ cairo_curve_to (cr, w, h, w, h, w - radius, h);
+ cairo_line_to (cr, 0 + radius, h);
+ cairo_curve_to (cr, 0, h, 0, h, 0, h - radius);
+
+ cairo_close_path(cr);
+
+ cairo_set_source_rgb(cr, 1, 1, 1);
+ cairo_fill(cr);
+
+ cairo_destroy(cr);
+ shape = gdk_cairo_region_create_from_surface(surface);
+ cairo_surface_destroy(surface);
+
+ return shape;
+}
+
+static void
+hud_update_shape(GtkWidget *widget)
+{
+ cairo_region_t *shape;
+ shape = curved_rect_mask(widget);
+ if (shape != NULL)
+ {
+ gtk_widget_shape_combine_region(widget, shape);
+ cairo_region_destroy(shape);
+ }
+}
+
#if defined(_ENABLE_GST)
#if GST_CHECK_VERSION(1, 0, 0)
G_MODULE_EXPORT gboolean
@@ -1052,33 +1137,10 @@ delayed_expose_cb(signal_user_data_t *ud)
#endif
#endif
-#if 0 // GTK_CHECK_VERSION(3, 0, 0)
-//
-// Only needed if the problems with GtkOverlay are ever resolved
-//
G_MODULE_EXPORT gboolean
-position_overlay_cb(
- GtkWidget *overlay,
+preview_draw_cb(
GtkWidget *widget,
- GdkRectangle *rect,
- signal_user_data_t *ud)
-{
- GtkRequisition min_size, size;
- gtk_widget_get_preferred_size(widget, &min_size, &size);
-
- rect->width = MAX(min_size.width, size.width);
- rect->height = MAX(min_size.height, size.height);
- rect->x = MAX(0, ud->preview->width / 2 - rect->width / 2);
- rect->y = MAX(0, ud->preview->height - rect->height - 50);
-
- return TRUE;
-}
-#endif
-
-G_MODULE_EXPORT gboolean
-preview_expose_cb(
- GtkWidget *widget,
- GdkEventExpose *event,
+ cairo_t *cr,
signal_user_data_t *ud)
{
#if defined(_ENABLE_GST)
@@ -1101,9 +1163,8 @@ preview_expose_cb(
// cleaned up here. But a delayed gst_x_overlay_expose()
// takes care of it.
g_idle_add((GSourceFunc)delayed_expose_cb, ud);
- return FALSE;
}
- return TRUE;
+ return FALSE;
}
#else
if (ud->preview->live_enabled && ud->preview->state == PREVIEW_STATE_LIVE)
@@ -1124,19 +1185,17 @@ preview_expose_cb(
// cleaned up here. But a delayed gst_x_overlay_expose()
// takes care of it.
g_idle_add((GSourceFunc)delayed_expose_cb, ud);
- return FALSE;
}
- return TRUE;
+ return FALSE;
}
#endif
#endif
if (ud->preview->pix != NULL)
{
- _draw_pixbuf(gtk_widget_get_window(ud->preview->view), ud->preview->pix);
- //_draw_pixbuf(gtk_widget_get_window(widget), ud->preview->pix);
+ _draw_pixbuf(cr, ud->preview->pix);
}
- return TRUE;
+ return FALSE;
}
G_MODULE_EXPORT void
@@ -1293,13 +1352,14 @@ hud_timeout(signal_user_data_t *ud)
return FALSE;
}
+static gboolean in_hud = FALSE;
+
G_MODULE_EXPORT gboolean
hud_enter_cb(
GtkWidget *widget,
GdkEventCrossing *event,
signal_user_data_t *ud)
{
- g_debug("hud_enter_cb()");
if (hud_timeout_id != 0)
{
GMainContext *mc;
@@ -1311,8 +1371,22 @@ hud_enter_cb(
g_source_destroy(source);
}
widget = GHB_WIDGET(ud->builder, "preview_hud");
- gtk_widget_show(widget);
+ if (!gtk_widget_get_visible(widget))
+ {
+ gtk_widget_show(widget);
+ }
hud_timeout_id = 0;
+ in_hud = TRUE;
+ return FALSE;
+}
+
+G_MODULE_EXPORT gboolean
+hud_leave_cb(
+ GtkWidget *widget,
+ GdkEventCrossing *event,
+ signal_user_data_t *ud)
+{
+ in_hud = FALSE;
return FALSE;
}
@@ -1322,7 +1396,6 @@ preview_leave_cb(
GdkEventCrossing *event,
signal_user_data_t *ud)
{
- g_debug("hud_leave_cb()");
if (hud_timeout_id != 0)
{
GMainContext *mc;
@@ -1343,7 +1416,6 @@ preview_motion_cb(
GdkEventMotion *event,
signal_user_data_t *ud)
{
- //g_debug("hud_motion_cb %d", hud_timeout_id);
if (hud_timeout_id != 0)
{
GMainContext *mc;
@@ -1359,78 +1431,20 @@ preview_motion_cb(
{
gtk_widget_show(widget);
}
- hud_timeout_id = g_timeout_add_seconds(4, (GSourceFunc)hud_timeout, ud);
+ if (!in_hud)
+ {
+ hud_timeout_id = g_timeout_add_seconds(4, (GSourceFunc)hud_timeout, ud);
+ }
return FALSE;
}
-cairo_region_t*
-ghb_curved_rect_mask(gint width, gint height, gint radius)
-{
- cairo_region_t *shape;
- cairo_surface_t *surface;
- cairo_t *cr;
- double w, h;
-
- if (!width || !height)
- return NULL;
-
- surface = cairo_image_surface_create(CAIRO_FORMAT_A8, width, height);
- cr = cairo_create (surface);
-
- w = width;
- h = height;
- if (radius > width / 2)
- radius = width / 2;
- if (radius > height / 2)
- radius = height / 2;
-
- // fill shape with black
- cairo_save(cr);
- cairo_rectangle (cr, 0, 0, width, height);
- cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR);
- cairo_fill (cr);
- cairo_restore (cr);
-
- cairo_move_to (cr, 0, radius);
- cairo_curve_to (cr, 0 , 0, 0 , 0, radius, 0);
- cairo_line_to (cr, w - radius, 0);
- cairo_curve_to (cr, w, 0, w, 0, w, radius);
- cairo_line_to (cr, w , h - radius);
- cairo_curve_to (cr, w, h, w, h, w - radius, h);
- cairo_line_to (cr, 0 + radius, h);
- cairo_curve_to (cr, 0, h, 0, h, 0, h - radius);
-
- cairo_close_path(cr);
-
- cairo_set_source_rgb(cr, 1, 1, 1);
- cairo_fill(cr);
-
- cairo_destroy(cr);
- shape = gdk_cairo_region_create_from_surface(surface);
- cairo_surface_destroy(surface);
-
- return shape;
-}
-
G_MODULE_EXPORT void
-preview_hud_size_alloc_cb(
+hud_size_alloc_cb(
GtkWidget *widget,
GtkAllocation *allocation,
signal_user_data_t *ud)
{
- cairo_region_t *shape;
-
- //g_message("preview_hud_size_alloc_cb()");
- if (gtk_widget_get_visible(widget) && allocation->height > 50)
- {
- shape = ghb_curved_rect_mask(allocation->width,
- allocation->height, allocation->height/4);
- if (shape != NULL)
- {
- gtk_widget_shape_combine_region(widget, shape);
- cairo_region_destroy(shape);
- }
- }
+ hud_update_shape(widget);
}
G_MODULE_EXPORT gboolean
@@ -1441,7 +1455,6 @@ preview_configure_cb(
{
gint x, y;
- //g_message("preview_configure_cb()");
if (gtk_widget_get_visible(widget))
{
gtk_window_get_position(GTK_WINDOW(widget), &x, &y);