#include <gtkhtml/gtkhtml.h>
#include <gdk/gdkkeysyms.h>
#include <glib/gstdio.h>
+#include <dbus/dbus-glib.h>
+#include <dbus/dbus-glib-lowlevel.h>
#include <gio/gio.h>
#include "hb.h"
}
static gboolean
-dep_check(signal_user_data_t *ud, const gchar *name)
+dep_check(signal_user_data_t *ud, const gchar *name, gboolean *out_hide)
{
GtkWidget *widget;
GObject *dep_object;
array = ghb_dict_lookup(rev_map, name);
count = ghb_array_len(array);
+ *out_hide = FALSE;
for (ii = 0; ii < count; ii++)
{
data = ghb_array_get_nth(array, ii);
widget = GHB_WIDGET(ud->builder, widget_name);
dep_object = gtk_builder_get_object(ud->builder, name);
g_free(widget_name);
+ if (!GTK_WIDGET_SENSITIVE(widget))
+ continue;
if (dep_object == NULL)
{
g_message("Failed to find widget");
gint jj = 0;
gchar **values;
gboolean sensitive = FALSE;
- gboolean die;
+ gboolean die, hide;
die = ghb_value_boolean(ghb_array_get_nth(data, 2));
+ hide = ghb_value_boolean(ghb_array_get_nth(data, 3));
value = ghb_value_string(ghb_array_get_nth(data, 1));
values = g_strsplit(value, "|", 10);
g_free(value);
jj++;
}
sensitive = die ^ sensitive;
- if (!sensitive) result = FALSE;
+ if (!sensitive)
+ {
+ result = FALSE;
+ *out_hide |= hide;
+ }
g_strfreev (values);
g_free(value);
}
for (ii = 0; ii < count; ii++)
{
gboolean sensitive;
+ gboolean hide;
data = ghb_array_get_nth(array, ii);
dep_name = ghb_value_string(data);
g_free(dep_name);
continue;
}
- sensitive = dep_check(ud, dep_name);
+ sensitive = dep_check(ud, dep_name, &hide);
g_free(dep_name);
if (GTK_IS_ACTION(dep_object))
+ {
gtk_action_set_sensitive(GTK_ACTION(dep_object), sensitive);
+ gtk_action_set_visible(GTK_ACTION(dep_object), sensitive || !hide);
+ }
else
+ {
gtk_widget_set_sensitive(GTK_WIDGET(dep_object), sensitive);
+ if (!sensitive && hide)
+ {
+ gtk_widget_hide(GTK_WIDGET(dep_object));
+ }
+ else
+ {
+ gtk_widget_show_now(GTK_WIDGET(dep_object));
+ }
+ }
}
}
&iter, (gpointer*)(void*)&dep_name, (gpointer*)(void*)&value))
{
gboolean sensitive;
+ gboolean hide;
+
dep_object = gtk_builder_get_object (ud->builder, dep_name);
if (dep_object == NULL)
{
g_message("Failed to find dependent widget %s", dep_name);
continue;
}
- sensitive = dep_check(ud, dep_name);
+ sensitive = dep_check(ud, dep_name, &hide);
if (GTK_IS_ACTION(dep_object))
+ {
gtk_action_set_sensitive(GTK_ACTION(dep_object), sensitive);
+ gtk_action_set_visible(GTK_ACTION(dep_object), sensitive || !hide);
+ }
else
+ {
gtk_widget_set_sensitive(GTK_WIDGET(dep_object), sensitive);
+ if (!sensitive && hide)
+ {
+ gtk_widget_hide(GTK_WIDGET(dep_object));
+ }
+ else
+ {
+ gtk_widget_show_now(GTK_WIDGET(dep_object));
+ }
+ }
}
}
g_debug("set_destination");
if (ghb_settings_get_boolean(ud->settings, "use_source_name"))
{
+ GString *str = g_string_new("");
gchar *vol_name, *filename, *extension;
gchar *new_name;
+ gint title;
filename = ghb_settings_get_string(ud->settings, "dest_file");
extension = ghb_settings_get_string(ud->settings, "FileFormat");
vol_name = ghb_settings_get_string(ud->settings, "volume_label");
- if (ghb_settings_get_boolean(ud->settings, "chapters_in_destination"))
+ g_string_append_printf(str, "%s", vol_name);
+ title = ghb_settings_combo_int(ud->settings, "title");
+ if (title >= 0)
{
- gint start, end;
-
- start = ghb_settings_get_int(ud->settings, "start_chapter");
- end = ghb_settings_get_int(ud->settings, "end_chapter");
- if (start == end)
+ if (ghb_settings_get_boolean(
+ ud->settings, "title_no_in_destination"))
{
- new_name = g_strdup_printf("%s-%d.%s",
- vol_name, start, extension);
+
+ title = ghb_settings_combo_int(ud->settings, "title");
+ g_string_append_printf(str, " - %d", title+1);
}
- else
+ if (ghb_settings_get_boolean(
+ ud->settings, "chapters_in_destination"))
{
- new_name = g_strdup_printf("%s-%d-%d.%s",
- vol_name, start, end, extension);
+ gint start, end;
+
+ if (!ghb_settings_get_boolean(
+ ud->settings, "title_no_in_destination"))
+ {
+ g_string_append_printf(str, " -");
+ }
+ start = ghb_settings_get_int(ud->settings, "start_chapter");
+ end = ghb_settings_get_int(ud->settings, "end_chapter");
+ if (start == end)
+ g_string_append_printf(str, " Ch %d", start);
+ else
+ g_string_append_printf(str, " Ch %d-%d", start, end);
}
}
- else
- {
- new_name = g_strdup_printf("%s.%s", vol_name, extension);
- }
+ g_string_append_printf(str, ".%s", extension);
+ new_name = g_string_free(str, FALSE);
ghb_ui_update(ud, "dest_file", ghb_string_value(new_name));
g_free(filename);
g_free(extension);
ghb_ui_update(ud, "preview_frame", ghb_int64_value(2));
ghb_set_preview_image (ud);
+ if (ghb_settings_get_boolean(ud->settings, "title_no_in_destination"))
+ {
+ set_destination(ud);
+ }
}
void
ghb_live_reset(ud);
}
-static void
-validate_filter_widget(signal_user_data_t *ud, const gchar *name)
-{
- GtkTreeModel *store;
- GtkTreeIter iter;
- const gchar *str;
- gboolean foundit = FALSE;
- GtkComboBox *combo = GTK_COMBO_BOX(GHB_WIDGET(ud->builder, name));
- if (gtk_combo_box_get_active(combo) < 0)
- { // Validate user input
- gchar *val = ghb_settings_get_string(ud->settings, name);
- store = gtk_combo_box_get_model(combo);
- // Check to see if user manually entered one of the combo options
- if (gtk_tree_model_get_iter_first(store, &iter))
- {
- do
- {
- gtk_tree_model_get(store, &iter, 0, &str, -1);
- if (strcasecmp(val, str) == 0)
- {
- gtk_combo_box_set_active_iter(combo, &iter);
- foundit = TRUE;
- break;
- }
- } while (gtk_tree_model_iter_next(store, &iter));
- }
- if (!foundit)
- { // validate format of filter string
- if (!ghb_validate_filter_string(val, -1))
- gtk_combo_box_set_active(combo, 0);
- }
- g_free(val);
- }
-}
-
-gboolean
-deint_tweak_focus_out_cb(GtkWidget *widget, GdkEventFocus *event,
- signal_user_data_t *ud)
-{
- g_debug("deint_tweak_focus_out_cb ()");
- validate_filter_widget(ud, "tweak_PictureDeinterlace");
- return FALSE;
-}
-
-gboolean
-denoise_tweak_focus_out_cb(GtkWidget *widget, GdkEventFocus *event,
- signal_user_data_t *ud)
-{
- g_debug("denoise_tweak_focus_out_cb ()");
- validate_filter_widget(ud, "tweak_PictureDenoise");
- return FALSE;
-}
-
void
http_opt_changed_cb(GtkWidget *widget, signal_user_data_t *ud)
{
if (status == GHB_QUEUE_PENDING)
{
current = ii;
+ ghb_inhibit_gpm();
queue_scan(ud, js);
return js;
}
}
// Nothing pending
+ ghb_uninhibit_gpm();
return NULL;
}
// Find the next pending item after the current running item
if (status == GHB_QUEUE_PENDING)
{
current = jj;
+ ghb_inhibit_gpm();
queue_scan(ud, js);
return js;
}
if (status == GHB_QUEUE_PENDING)
{
current = ii;
+ ghb_inhibit_gpm();
queue_scan(ud, js);
return js;
}
}
// Nothing found
+ ghb_uninhibit_gpm();
return NULL;
}
else if (status.queue.state & GHB_STATE_SCANDONE)
{
ghb_clear_queue_state(GHB_STATE_SCANDONE);
+ usleep(2000000);
submit_job(ud->current_job);
}
else if (status.queue.state & GHB_STATE_PAUSED)
g_io_channel_unref(ud->job_activity_log);
ud->job_activity_log = NULL;
if (!ud->cancel_encode)
+ {
ud->current_job = ghb_start_next_job(ud, FALSE);
+ }
else
+ {
+ ghb_uninhibit_gpm();
ud->current_job = NULL;
+ }
if (js)
ghb_settings_set_int(js, "job_status", qstatus);
ghb_save_queue(ud->queue);
return TRUE;
}
+static void
+set_visible(GtkWidget *widget, gboolean visible)
+{
+ if (visible)
+ {
+ gtk_widget_show_now(widget);
+ }
+ else
+ {
+ gtk_widget_hide(widget);
+ }
+}
+
void
show_activity_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud)
{
GtkWidget *widget = GHB_WIDGET (ud->builder, "activity_window");
- gtk_widget_show (widget);
+ set_visible(widget, gtk_toggle_tool_button_get_active(
+ GTK_TOGGLE_TOOL_BUTTON(xwidget)));
+}
+
+void
+show_activity_menu_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud)
+{
+ GtkWidget *widget = GHB_WIDGET (ud->builder, "activity_window");
+ set_visible(widget, TRUE);
+ widget = GHB_WIDGET (ud->builder, "show_activity");
+ gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(widget), TRUE);
+}
+
+gboolean
+activity_window_delete_cb(GtkWidget *xwidget, GdkEvent *event, signal_user_data_t *ud)
+{
+ set_visible(xwidget, FALSE);
+ GtkWidget *widget = GHB_WIDGET (ud->builder, "show_activity");
+ gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(widget), FALSE);
+ return TRUE;
}
void
show_queue_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud)
{
GtkWidget *widget = GHB_WIDGET (ud->builder, "queue_window");
- gtk_widget_show (widget);
+ set_visible(widget, gtk_toggle_tool_button_get_active(
+ GTK_TOGGLE_TOOL_BUTTON(xwidget)));
+}
+
+void
+show_queue_menu_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud)
+{
+ GtkWidget *widget = GHB_WIDGET (ud->builder, "queue_window");
+ set_visible(widget, TRUE);
+ widget = GHB_WIDGET (ud->builder, "show_queue");
+ gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(widget), TRUE);
+}
+
+gboolean
+queue_window_delete_cb(GtkWidget *xwidget, GdkEvent *event, signal_user_data_t *ud)
+{
+ set_visible(xwidget, FALSE);
+ GtkWidget *widget = GHB_WIDGET (ud->builder, "show_queue");
+ gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(widget), FALSE);
+ return TRUE;
}
void
}
}
-static void
-set_visible(GtkWidget *widget, gboolean visible)
-{
- if (visible)
- {
- gtk_widget_show_now(widget);
- }
- else
- {
- gtk_widget_hide(widget);
- }
-}
-
void
ghb_hbfd(signal_user_data_t *ud, gboolean hbfd)
{
set_visible(widget, !hbfd);
widget = GHB_WIDGET(ud->builder, "presets_remove");
set_visible(widget, !hbfd);
- widget = GHB_WIDGET(ud->builder, "presets_default");
- set_visible(widget, !hbfd);
widget = GHB_WIDGET (ud->builder, "hb_window");
gtk_window_resize(GTK_WINDOW(widget), 16, 16);
ghb_widget_to_setting (ud->settings, widget);
const gchar *name = gtk_widget_get_name(widget);
ghb_pref_save(ud->settings, name);
-
- gboolean tweaks = ghb_settings_get_boolean(ud->settings, "allow_tweaks");
- widget = GHB_WIDGET(ud->builder, "PictureDeinterlace");
- tweaks ? gtk_widget_hide(widget) : gtk_widget_show(widget);
- widget = GHB_WIDGET(ud->builder, "tweak_PictureDeinterlace");
- !tweaks ? gtk_widget_hide(widget) : gtk_widget_show(widget);
-
- widget = GHB_WIDGET(ud->builder, "PictureDenoise");
- tweaks ? gtk_widget_hide(widget) : gtk_widget_show(widget);
- widget = GHB_WIDGET(ud->builder, "tweak_PictureDenoise");
- !tweaks ? gtk_widget_hide(widget) : gtk_widget_show(widget);
- if (tweaks)
- {
- const GValue *value;
- value = ghb_settings_get_value(ud->settings, "PictureDeinterlace");
- ghb_ui_update(ud, "tweak_PictureDeinterlace", value);
- value = ghb_settings_get_value(ud->settings, "PictureDenoise");
- ghb_ui_update(ud, "tweak_PictureDenoise", value);
- }
- else
- {
- const GValue *value;
- value = ghb_settings_get_value(ud->settings, "tweak_PictureDeinterlace");
- ghb_ui_update(ud, "PictureDeinterlace", value);
- value = ghb_settings_get_value(ud->settings, "tweak_PictureDenoise");
- ghb_ui_update(ud, "PictureDenoise", value);
- }
}
void
return dvd_devices;
}
-
-static DBusConnection *dbus_connection = NULL;
static LibHalContext *hal_ctx;
gboolean
}
-static gboolean
+static void
dbus_init (void)
{
- DBusError error;
+ dbus_g_thread_init();
+}
- if (dbus_connection != NULL)
- return TRUE;
+#define GPM_DBUS_SERVICE "org.freedesktop.PowerManagement"
+#define GPM_DBUS_INHIBIT_PATH "/org/freedesktop/PowerManagement/Inhibit"
+#define GPM_DBUS_INHIBIT_INTERFACE "org.freedesktop.PowerManagement.Inhibit"
+static gboolean gpm_inhibited = FALSE;
+static guint gpm_cookie = -1;
- dbus_error_init (&error);
- if (!(dbus_connection = dbus_bus_get (DBUS_BUS_SYSTEM, &error))) {
- g_debug ("could not get system bus: %s", error.message);
- dbus_error_free (&error);
- return FALSE;
+void
+ghb_inhibit_gpm()
+{
+ DBusGConnection *conn;
+ DBusGProxy *proxy;
+ GError *error = NULL;
+ gboolean res;
+
+
+ if (gpm_inhibited)
+ {
+ // Already inhibited
+ return;
+ }
+ g_debug("ghb_inhibit_gpm()");
+ conn = dbus_g_bus_get(DBUS_BUS_SESSION, &error);
+ if (error != NULL)
+ {
+ g_debug("DBUS cannot connect: %s", error->message);
+ g_error_free(error);
+ return;
}
+ proxy = dbus_g_proxy_new_for_name(conn, GPM_DBUS_SERVICE,
+ GPM_DBUS_INHIBIT_PATH, GPM_DBUS_INHIBIT_INTERFACE);
+ if (proxy == NULL)
+ {
+ g_debug("Could not get DBUS proxy: %s", GPM_DBUS_SERVICE);
+ dbus_g_connection_unref(conn);
+ return;
+ }
+ res = dbus_g_proxy_call(proxy, "Inhibit", &error,
+ G_TYPE_STRING, "ghb",
+ G_TYPE_STRING, "Encoding",
+ G_TYPE_INVALID,
+ G_TYPE_UINT, &gpm_cookie,
+ G_TYPE_INVALID);
+ if (!res)
+ {
+ g_warning("Inhibit method failed");
+ gpm_cookie = -1;
+ }
+ if (error != NULL)
+ {
+ g_warning("Inhibit problem: %s", error->message);
+ g_error_free(error);
+ gpm_cookie = -1;
+ }
+ gpm_inhibited = TRUE;
+ g_object_unref(G_OBJECT(proxy));
+ dbus_g_connection_unref(conn);
+}
- //dbus_connection_setup_with_g_main (dbus_connection, NULL);
- //dbus_connection_set_exit_on_disconnect (dbus_connection, FALSE);
- //dbus_connection_add_filter (dbus_connection, gvm_dbus_filter_function, NULL, NULL);
+void
+ghb_uninhibit_gpm()
+{
+ DBusGConnection *conn;
+ DBusGProxy *proxy;
+ GError *error = NULL;
+ gboolean res;
+
+ g_debug("ghb_uninhibit_gpm() gpm_cookie %u", gpm_cookie);
- return TRUE;
+ if (!gpm_inhibited)
+ {
+ // Not inhibited
+ return;
+ }
+ conn = dbus_g_bus_get(DBUS_BUS_SESSION, &error);
+ if (error != NULL)
+ {
+ g_debug("DBUS cannot connect: %s", error->message);
+ g_error_free(error);
+ return;
+ }
+ proxy = dbus_g_proxy_new_for_name(conn, GPM_DBUS_SERVICE,
+ GPM_DBUS_INHIBIT_PATH, GPM_DBUS_INHIBIT_INTERFACE);
+ if (proxy == NULL)
+ {
+ g_debug("Could not get DBUS proxy: %s", GPM_DBUS_SERVICE);
+ dbus_g_connection_unref(conn);
+ return;
+ }
+ res = dbus_g_proxy_call(proxy, "UnInhibit", &error,
+ G_TYPE_UINT, gpm_cookie,
+ G_TYPE_INVALID,
+ G_TYPE_INVALID);
+ if (!res)
+ {
+ g_warning("UnInhibit method failed");
+ }
+ if (error != NULL)
+ {
+ g_warning("UnInhibit problem: %s", error->message);
+ g_error_free(error);
+ }
+ gpm_inhibited = FALSE;
+ dbus_g_connection_unref(conn);
+ g_object_unref(G_OBJECT(proxy));
}
void
ghb_hal_init()
{
+ DBusGConnection *gconn;
+ DBusConnection *conn;
+ GError *gerror = NULL;
DBusError error;
char **devices;
int nr;
- if (!dbus_init ())
- return;
+ dbus_init ();
if (!(hal_ctx = libhal_ctx_new ())) {
g_warning ("failed to create a HAL context!");
return;
}
- libhal_ctx_set_dbus_connection (hal_ctx, dbus_connection);
+ gconn = dbus_g_bus_get(DBUS_BUS_SYSTEM, &gerror);
+ if (gerror != NULL)
+ {
+ g_warning("DBUS cannot connect: %s", gerror->message);
+ g_error_free(gerror);
+ return;
+ }
+ conn = dbus_g_connection_get_connection(gconn);
+ libhal_ctx_set_dbus_connection (hal_ctx, conn);
dbus_error_init (&error);
if (!libhal_ctx_init (hal_ctx, &error)) {
g_warning ("libhal_ctx_init failed: %s", error.message ? error.message : "unknown");
dbus_error_free (&error);
libhal_ctx_free (hal_ctx);
+ dbus_g_connection_unref(gconn);
return;
}
libhal_ctx_shutdown (hal_ctx, NULL);
libhal_ctx_free (hal_ctx);
+ dbus_g_connection_unref(gconn);
return;
}
libhal_free_string_array (devices);
-
- //gvm_hal_claim_branch ("/org/freedesktop/Hal/devices/local");
+ dbus_g_connection_unref(gconn);
}
gboolean