diff options
Diffstat (limited to 'gtk/src')
-rw-r--r-- | gtk/src/Makefile.am | 88 | ||||
-rw-r--r-- | gtk/src/audiohandler.c | 18 | ||||
-rw-r--r-- | gtk/src/callbacks.c | 439 | ||||
-rw-r--r-- | gtk/src/callbacks.h | 7 | ||||
-rw-r--r-- | gtk/src/ghb-dvd.c | 18 | ||||
-rw-r--r-- | gtk/src/hb-backend.c | 4 | ||||
-rw-r--r-- | gtk/src/main.c | 96 | ||||
-rw-r--r-- | gtk/src/presets.c | 62 | ||||
-rw-r--r-- | gtk/src/preview.c | 81 | ||||
-rw-r--r-- | gtk/src/queuehandler.c | 22 | ||||
-rw-r--r-- | gtk/src/values.c | 3 | ||||
-rw-r--r-- | gtk/src/widgetdeps.c (renamed from gtk/src/makedeps.c) | 0 | ||||
-rw-r--r-- | gtk/src/x264handler.c | 8 |
13 files changed, 610 insertions, 236 deletions
diff --git a/gtk/src/Makefile.am b/gtk/src/Makefile.am index 8abcc6f97..b6e6f528b 100644 --- a/gtk/src/Makefile.am +++ b/gtk/src/Makefile.am @@ -1,30 +1,18 @@ ## Process this file with automake to produce Makefile.in -HB_LIBS=\ - -lhb \ - -la52 \ - -lmkv \ - -lavformat \ - -lavcodec \ - -lavutil \ - -ldca \ - -ldvdread \ - -lfaac \ - -lmp3lame \ - -lmpeg2 \ - -lvorbis \ - -lvorbisenc \ - -logg \ - -lsamplerate \ - -lx264 \ - -lxvidcore \ - -lmp4v2 \ - -lswscale \ - -ltheora \ - -lfaad \ - -lz \ - -lbz2 \ - -lpthread +if MINGW +HB_LIBS= \ + -lhb -la52 -lmkv -lavformat -lavcodec -lavutil -ldca -ldvdread \ + -lfaac -lmp3lame -lmpeg2 -lvorbis -lvorbisenc -logg -lsamplerate \ + -lx264 -lxvidcore -lmp4v2 -lswscale -ltheora -lfaad -lz \ + -lbz2 -liberty -lpthreadGC2 +else +HB_LIBS= \ + -lhb -la52 -lmkv -lavformat -lavcodec -lavutil -ldca -ldvdread \ + -lfaac -lmp3lame -lmpeg2 -lvorbis -lvorbisenc -logg -lsamplerate \ + -lx264 -lxvidcore -lmp4v2 -lswscale -ltheora -lfaad -lz \ + -lbz2 -liberty -lpthread +endif icons = \ hb-icon.128.png @@ -66,13 +54,9 @@ AM_CPPFLAGS = \ -DPACKAGE_DATA_DIR=\""$(datadir)"\" \ $(GHB_CFLAGS) -AM_CFLAGS =\ - -Wall\ - -g +AM_CFLAGS = -Wall -g bin_PROGRAMS = ghb -noinst_PROGRAMS = makewidgetdeps quotestring create_resources preset_xlat \ - resource_data.h resources.plist widget.deps widget_reverse.deps # Dummy file, not built. Forces g++ linking nodist_EXTRA_ghb_SOURCES = dummy.cpp @@ -117,54 +101,26 @@ ghb_SOURCES = \ marshalers.c \ marshalers.h +if MINGW +ghb_LDFLAGS = \ + -mwindows -Wl,--export-dynamic -Wl,--exclude-libs,ALL +else ghb_LDFLAGS = \ -Wl,--export-dynamic -Wl,--exclude-libs,ALL +endif ghb_LDADD = $(HB_LIBS) $(GHB_LIBS) ghb_DEPENDENCIES = $(HB_DIR)/libhb/libhb.a -makewidgetdeps_SOURCES = \ - plist.c \ - plist.h \ - values.c \ - values.h \ - makedeps.c - -makewidgetdeps_LDADD = $(GHBTOOLS_LIBS) - -create_resources_SOURCES = \ - create_resources.c \ - plist.c \ - plist.h \ - values.c \ - values.h \ - icon_tools.c \ - icon_tools.h - -create_resources_LDADD = $(GHBTOOLS_LIBS) - -preset_xlat_SOURCES = \ - preset_xlat.c \ - plist.c \ - plist.h \ - values.c \ - values.h - -preset_xlat_LDADD = $(GHBTOOLS_LIBS) - -quotestring_SOURCES = quotestring.c - -dumbell: preset_xlat - resources.o: resource_data.h resource_data.h: quotestring resources.plist ./quotestring resources.plist resource_data.h -widget_reverse.deps: makewidgetdeps -widget.deps: makewidgetdeps - ./makewidgetdeps +widget_reverse.deps: widgetdeps +widget.deps: widgetdeps + ./widgetdeps resources.plist: create_resources resources.list $(icons_dep) internal_defaults.xml standard_presets.xml ghb.ui widget.deps widget_reverse.deps ./create_resources -I$(srcdir) $(srcdir)/resources.list resources.plist diff --git a/gtk/src/audiohandler.c b/gtk/src/audiohandler.c index 1ffbf8df5..adfc79b07 100644 --- a/gtk/src/audiohandler.c +++ b/gtk/src/audiohandler.c @@ -281,7 +281,7 @@ audio_list_refresh_selected(signal_user_data_t *ud) } } -void +G_MODULE_EXPORT void audio_codec_changed_cb(GtkWidget *widget, signal_user_data_t *ud) { static gint prev_acodec = 0; @@ -337,7 +337,7 @@ audio_codec_changed_cb(GtkWidget *widget, signal_user_data_t *ud) ghb_live_reset(ud); } -void +G_MODULE_EXPORT void audio_track_changed_cb(GtkWidget *widget, signal_user_data_t *ud) { GValue *asettings; @@ -359,7 +359,7 @@ audio_track_changed_cb(GtkWidget *widget, signal_user_data_t *ud) ghb_live_reset(ud); } -void +G_MODULE_EXPORT void audio_mix_changed_cb(GtkWidget *widget, signal_user_data_t *ud) { GValue *asettings; @@ -376,7 +376,7 @@ audio_mix_changed_cb(GtkWidget *widget, signal_user_data_t *ud) ghb_live_reset(ud); } -void +G_MODULE_EXPORT void audio_widget_changed_cb(GtkWidget *widget, signal_user_data_t *ud) { GValue *asettings; @@ -392,7 +392,7 @@ audio_widget_changed_cb(GtkWidget *widget, signal_user_data_t *ud) ghb_live_reset(ud); } -void +G_MODULE_EXPORT void drc_widget_changed_cb(GtkWidget *widget, signal_user_data_t *ud) { GValue *asettings; @@ -418,7 +418,7 @@ drc_widget_changed_cb(GtkWidget *widget, signal_user_data_t *ud) // the selection is updated automaitcally when the title // changes. I don't want the preset selection changed as // would happen for regular settings. -void +G_MODULE_EXPORT void subtitle_changed_cb(GtkWidget *widget, signal_user_data_t *ud) { const gchar *name = gtk_widget_get_name(widget); @@ -508,7 +508,7 @@ add_to_audio_list(signal_user_data_t *ud, GValue *settings) g_free(s_mix); } -void +G_MODULE_EXPORT void audio_list_selection_changed_cb(GtkTreeSelection *selection, signal_user_data_t *ud) { GtkTreeModel *store; @@ -545,7 +545,7 @@ audio_list_selection_changed_cb(GtkTreeSelection *selection, signal_user_data_t } } -void +G_MODULE_EXPORT void audio_add_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud) { // Add the current audio settings to the list. @@ -588,7 +588,7 @@ audio_add_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud) } } -void +G_MODULE_EXPORT void audio_remove_clicked_cb(GtkWidget *widget, signal_user_data_t *ud) { GtkTreeView *treeview; diff --git a/gtk/src/callbacks.c b/gtk/src/callbacks.c index 166b8c684..42f7b6a09 100644 --- a/gtk/src/callbacks.c +++ b/gtk/src/callbacks.c @@ -16,20 +16,29 @@ #endif #include <string.h> -#include <poll.h> #include <fcntl.h> #include <sys/stat.h> + +#if !defined(_WIN32) +#include <poll.h> +#include <libhal-storage.h> +#include <dbus/dbus-glib.h> +#include <dbus/dbus-glib-lowlevel.h> + #include <netinet/in.h> #include <netdb.h> -#include <libhal-storage.h> -#include <gtk/gtk.h> #include <gtkhtml/gtkhtml.h> +#include <libnotify/notify.h> +#else +#define WINVER 0x0500 +#include <winsock2.h> +#include <dbt.h> +#endif + +#include <gtk/gtk.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 <libnotify/notify.h> #include "hb.h" #include "callbacks.h" @@ -260,7 +269,7 @@ ghb_check_all_depencencies(signal_user_data_t *ud) } } -void +G_MODULE_EXPORT void on_quit1_activate(GtkMenuItem *quit, signal_user_data_t *ud) { gint state = ghb_get_queue_state(); @@ -412,29 +421,110 @@ get_file_label(const gchar *filename) return base; } +static gchar* +get_drive_name(const gchar *drive) +{ + gchar *result; +#if defined(_WIN32) + gchar vname[51], fsname[51]; + if (GetVolumeInformation(drive, vname, 50, NULL, NULL, NULL, fsname, 51)) + { + result = g_strdup_printf("%s (%s)", vname, drive); + } + else + { + result = g_strdup_printf("%s", drive); + } +#else + result = g_strdup_printf("%s", drive); +#endif + return result; +} + +static gchar* +resolve_drive_name(gchar *filename) +{ +#if defined(_WIN32) + if (filename[1] == ':') + { + gchar drive[4]; + gchar *name; + gint dtype; + + g_strlcpy(drive, filename, 4); + dtype = GetDriveType(drive); + if (dtype == DRIVE_CDROM) + { + gchar vname[51], fsname[51]; + GetVolumeInformation(drive, vname, 50, NULL, + NULL, NULL, fsname, 50); + name = g_strdup(vname); + return name; + } + } + return NULL; +#else + return NULL; +#endif +} + static gboolean update_source_label(signal_user_data_t *ud, const gchar *source) { gchar *label = NULL; gint len; gchar **path; + gchar *start; gchar *filename = g_strdup(source); len = strlen(filename); - if (filename[len-1] == '/') filename[len-1] = 0; + if (filename[len-1] == G_DIR_SEPARATOR) filename[len-1] = 0; if (g_file_test(filename, G_FILE_TEST_IS_DIR)) { - path = g_strsplit(filename, "/", -1); - len = g_strv_length (path); - if ((len > 1) && (strcmp("VIDEO_TS", path[len-1]) == 0)) + // Skip dos drive letters + start = strchr(filename, ':'); + label = resolve_drive_name(filename); + if (label != NULL) { - label = g_strdup(path[len-2]); + if (uppers_and_unders(label)) + { + camel_convert(label); + } } else { - label = g_strdup(path[len-1]); + if (start != NULL) + start++; + else + start = filename; + + path = g_strsplit(start, G_DIR_SEPARATOR_S, -1); + len = g_strv_length (path); + if ((len > 1) && (strcmp("VIDEO_TS", path[len-1]) == 0)) + { + label = g_strdup(path[len-2]); + if (uppers_and_unders(label)) + { + camel_convert(label); + } + } + else if (len > 0) + { + if (path[len-1][0] != 0) + { + label = g_strdup(path[len-1]); + if (uppers_and_unders(label)) + { + camel_convert(label); + } + } + else + label = g_strdup("new_video"); + } + else + label = g_strdup("new_video"); + g_strfreev (path); } - g_strfreev (path); } else { @@ -472,7 +562,7 @@ update_source_label(signal_user_data_t *ud, const gchar *source) return TRUE; } -void +G_MODULE_EXPORT void chooser_file_selected_cb(GtkFileChooser *dialog, signal_user_data_t *ud) { const gchar *name = gtk_file_chooser_get_filename (dialog); @@ -503,7 +593,7 @@ chooser_file_selected_cb(GtkFileChooser *dialog, signal_user_data_t *ud) gtk_combo_box_set_active (combo, 0); } -void +G_MODULE_EXPORT void dvd_device_changed_cb(GtkComboBox *combo, signal_user_data_t *ud) { GtkWidget *dialog; @@ -522,7 +612,7 @@ dvd_device_changed_cb(GtkComboBox *combo, signal_user_data_t *ud) } } -void +G_MODULE_EXPORT void source_type_changed_cb(GtkToggleButton *toggle, signal_user_data_t *ud) { gchar *folder; @@ -715,19 +805,19 @@ do_source_dialog(GtkButton *button, gboolean single, signal_user_data_t *ud) g_free(sourcename); } -void +G_MODULE_EXPORT void source_button_clicked_cb(GtkButton *button, signal_user_data_t *ud) { do_source_dialog(button, FALSE, ud); } -void +G_MODULE_EXPORT void single_title_source_cb(GtkButton *button, signal_user_data_t *ud) { do_source_dialog(button, TRUE, ud); } -void +G_MODULE_EXPORT void dvd_source_activate_cb(GtkAction *action, signal_user_data_t *ud) { const gchar *filename; @@ -803,7 +893,7 @@ destination_select_title(GtkEntry *entry) } for (start = end; start >= 0; start--) { - if (dest[start] == '/') + if (dest[start] == G_DIR_SEPARATOR) { start++; break; @@ -816,7 +906,7 @@ destination_select_title(GtkEntry *entry) } } -gboolean +G_MODULE_EXPORT gboolean destination_grab_cb( GtkEntry *entry, signal_user_data_t *ud) @@ -827,7 +917,7 @@ destination_grab_cb( static gboolean update_default_destination = FALSE; -void +G_MODULE_EXPORT void dest_dir_set_cb(GtkFileChooserButton *dest_chooser, signal_user_data_t *ud) { gchar *dest_file, *dest_dir, *dest; @@ -836,7 +926,7 @@ dest_dir_set_cb(GtkFileChooserButton *dest_chooser, signal_user_data_t *ud) ghb_widget_to_setting(ud->settings, (GtkWidget*)dest_chooser); dest_file = ghb_settings_get_string(ud->settings, "dest_file"); dest_dir = ghb_settings_get_string(ud->settings, "dest_dir"); - dest = g_strdup_printf("%s/%s", dest_dir, dest_file); + dest = g_strdup_printf("%s" G_DIR_SEPARATOR_S "%s", dest_dir, dest_file); ghb_settings_set_string(ud->settings, "destination", dest); g_free(dest_file); g_free(dest_dir); @@ -844,7 +934,7 @@ dest_dir_set_cb(GtkFileChooserButton *dest_chooser, signal_user_data_t *ud) update_default_destination = TRUE; } -void +G_MODULE_EXPORT void dest_file_changed_cb(GtkEntry *entry, signal_user_data_t *ud) { gchar *dest_file, *dest_dir, *dest; @@ -856,7 +946,7 @@ dest_file_changed_cb(GtkEntry *entry, signal_user_data_t *ud) // update on the timer. dest_file = ghb_settings_get_string(ud->settings, "dest_file"); dest_dir = ghb_settings_get_string(ud->settings, "dest_dir"); - dest = g_strdup_printf("%s/%s", dest_dir, dest_file); + dest = g_strdup_printf("%s" G_DIR_SEPARATOR_S "%s", dest_dir, dest_file); ghb_settings_set_string(ud->settings, "destination", dest); g_free(dest_file); g_free(dest_dir); @@ -864,7 +954,7 @@ dest_file_changed_cb(GtkEntry *entry, signal_user_data_t *ud) update_default_destination = TRUE; } -void +G_MODULE_EXPORT void destination_browse_clicked_cb(GtkButton *button, signal_user_data_t *ud) { GtkWidget *dialog; @@ -904,7 +994,7 @@ destination_browse_clicked_cb(GtkButton *button, signal_user_data_t *ud) gtk_widget_destroy(dialog); } -gboolean +G_MODULE_EXPORT gboolean window_destroy_event_cb(GtkWidget *widget, GdkEvent *event, signal_user_data_t *ud) { g_debug("window_destroy_event_cb ()"); @@ -914,7 +1004,7 @@ window_destroy_event_cb(GtkWidget *widget, GdkEvent *event, signal_user_data_t * return FALSE; } -gboolean +G_MODULE_EXPORT gboolean window_delete_event_cb(GtkWidget *widget, GdkEvent *event, signal_user_data_t *ud) { gint state = ghb_get_queue_state(); @@ -942,7 +1032,7 @@ update_acodec_combo(signal_user_data_t *ud) ghb_grey_combo_options (ud->builder); } -void +G_MODULE_EXPORT void container_changed_cb(GtkWidget *widget, signal_user_data_t *ud) { const GValue *audio_list; @@ -1087,7 +1177,7 @@ show_title_info(signal_user_data_t *ud, ghb_title_info_t *tinfo) static gboolean update_preview = FALSE; -void +G_MODULE_EXPORT void title_changed_cb(GtkWidget *widget, signal_user_data_t *ud) { ghb_title_info_t tinfo; @@ -1133,7 +1223,7 @@ title_changed_cb(GtkWidget *widget, signal_user_data_t *ud) } } -void +G_MODULE_EXPORT void setting_widget_changed_cb(GtkWidget *widget, signal_user_data_t *ud) { ghb_widget_to_setting(ud->settings, widget); @@ -1142,7 +1232,7 @@ setting_widget_changed_cb(GtkWidget *widget, signal_user_data_t *ud) ghb_live_reset(ud); } -void +G_MODULE_EXPORT void vquality_changed_cb(GtkWidget *widget, signal_user_data_t *ud) { ghb_widget_to_setting(ud->settings, widget); @@ -1166,7 +1256,7 @@ vquality_changed_cb(GtkWidget *widget, signal_user_data_t *ud) gtk_range_set_value(GTK_RANGE(widget), val); } -void +G_MODULE_EXPORT void http_opt_changed_cb(GtkWidget *widget, signal_user_data_t *ud) { ghb_widget_to_setting(ud->settings, widget); @@ -1177,7 +1267,7 @@ http_opt_changed_cb(GtkWidget *widget, signal_user_data_t *ud) ghb_grey_combo_options (ud->builder); } -void +G_MODULE_EXPORT void vcodec_changed_cb(GtkWidget *widget, signal_user_data_t *ud) { gdouble vqmin, vqmax, step, page; @@ -1196,7 +1286,7 @@ vcodec_changed_cb(GtkWidget *widget, signal_user_data_t *ud) gtk_range_set_inverted (GTK_RANGE(qp), inverted); } -void +G_MODULE_EXPORT void target_size_changed_cb(GtkWidget *widget, signal_user_data_t *ud) { const gchar *name = gtk_widget_get_name(widget); @@ -1214,7 +1304,7 @@ target_size_changed_cb(GtkWidget *widget, signal_user_data_t *ud) } } -void +G_MODULE_EXPORT void start_chapter_changed_cb(GtkWidget *widget, signal_user_data_t *ud) { gint start, end; @@ -1233,7 +1323,7 @@ start_chapter_changed_cb(GtkWidget *widget, signal_user_data_t *ud) } } -void +G_MODULE_EXPORT void end_chapter_changed_cb(GtkWidget *widget, signal_user_data_t *ud) { gint start, end; @@ -1252,7 +1342,7 @@ end_chapter_changed_cb(GtkWidget *widget, signal_user_data_t *ud) } } -void +G_MODULE_EXPORT void scale_width_changed_cb(GtkWidget *widget, signal_user_data_t *ud) { g_debug("scale_width_changed_cb ()"); @@ -1272,7 +1362,7 @@ scale_width_changed_cb(GtkWidget *widget, signal_user_data_t *ud) ghb_live_reset(ud); } -void +G_MODULE_EXPORT void scale_height_changed_cb(GtkWidget *widget, signal_user_data_t *ud) { g_debug("scale_height_changed_cb ()"); @@ -1292,7 +1382,7 @@ scale_height_changed_cb(GtkWidget *widget, signal_user_data_t *ud) ghb_live_reset(ud); } -void +G_MODULE_EXPORT void crop_changed_cb(GtkWidget *widget, signal_user_data_t *ud) { gint titleindex, crop[4]; @@ -1331,7 +1421,7 @@ crop_changed_cb(GtkWidget *widget, signal_user_data_t *ud) ghb_live_reset(ud); } -void +G_MODULE_EXPORT void display_width_changed_cb(GtkWidget *widget, signal_user_data_t *ud) { g_debug("scale_changed_cb ()"); @@ -1425,7 +1515,7 @@ scale_changed_cb(GtkWidget *widget, signal_user_data_t *ud) gtk_label_set_text (GTK_LABEL(widget), text); } -void +G_MODULE_EXPORT void generic_entry_changed_cb(GtkEntry *entry, signal_user_data_t *ud) { // Normally (due to user input) I only want to process the entry @@ -1442,7 +1532,7 @@ generic_entry_changed_cb(GtkEntry *entry, signal_user_data_t *ud) } } -void +G_MODULE_EXPORT void prefs_dialog_cb(GtkWidget *xwidget, signal_user_data_t *ud) { GtkWidget *dialog; @@ -2007,7 +2097,7 @@ ghb_backend_events(signal_user_data_t *ud) } } -gboolean +G_MODULE_EXPORT gboolean ghb_timer_cb(gpointer data) { signal_user_data_t *ud = (signal_user_data_t*)data; @@ -2038,7 +2128,7 @@ ghb_timer_cb(gpointer data) return TRUE; } -gboolean +G_MODULE_EXPORT gboolean ghb_log_cb(GIOChannel *source, GIOCondition cond, gpointer data) { gchar *text = NULL; @@ -2092,13 +2182,25 @@ ghb_log_cb(GIOChannel *source, GIOCondition cond, gpointer data) gtk_text_view_scroll_mark_onscreen(textview, mark); gtk_text_buffer_delete_mark(buffer, mark); } +#if defined(_WIN32) + gsize one = 1; + text[length-1] = '\r'; +#endif g_io_channel_write_chars (ud->activity_log, text, length, &length, NULL); +#if defined(_WIN32) + g_io_channel_write_chars (ud->activity_log, "\n", + one, &one, NULL); +#endif g_io_channel_flush(ud->activity_log, NULL); if (ud->job_activity_log) { g_io_channel_write_chars (ud->job_activity_log, text, length, &length, NULL); +#if defined(_WIN32) + g_io_channel_write_chars (ud->activity_log, "\n", + one, &one, NULL); +#endif g_io_channel_flush(ud->job_activity_log, NULL); } g_free(text); @@ -2133,7 +2235,7 @@ set_visible(GtkWidget *widget, gboolean visible) } } -void +G_MODULE_EXPORT void show_activity_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud) { GtkWidget *widget = GHB_WIDGET (ud->builder, "activity_window"); @@ -2141,7 +2243,7 @@ show_activity_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud) GTK_TOGGLE_TOOL_BUTTON(xwidget))); } -void +G_MODULE_EXPORT void show_activity_menu_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud) { GtkWidget *widget = GHB_WIDGET (ud->builder, "activity_window"); @@ -2150,7 +2252,7 @@ show_activity_menu_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud) gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(widget), TRUE); } -gboolean +G_MODULE_EXPORT gboolean activity_window_delete_cb(GtkWidget *xwidget, GdkEvent *event, signal_user_data_t *ud) { set_visible(xwidget, FALSE); @@ -2212,7 +2314,7 @@ about_web_hook(GtkAboutDialog *about, const gchar *link, gpointer data) browse_url(link); } -void +G_MODULE_EXPORT void about_activate_cb(GtkWidget *xwidget, signal_user_data_t *ud) { GtkWidget *widget = GHB_WIDGET (ud->builder, "hb_about"); @@ -2229,19 +2331,19 @@ about_activate_cb(GtkWidget *xwidget, signal_user_data_t *ud) gtk_widget_show (widget); } -void +G_MODULE_EXPORT void guide_activate_cb(GtkWidget *xwidget, signal_user_data_t *ud) { browse_url("http://trac.handbrake.fr/wiki/HandBrakeGuide"); } -void +G_MODULE_EXPORT void hb_about_response_cb(GtkWidget *widget, gint response, signal_user_data_t *ud) { gtk_widget_hide (widget); } -void +G_MODULE_EXPORT void show_queue_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud) { GtkWidget *widget = GHB_WIDGET (ud->builder, "queue_window"); @@ -2249,7 +2351,7 @@ show_queue_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud) GTK_TOGGLE_TOOL_BUTTON(xwidget))); } -void +G_MODULE_EXPORT void show_queue_menu_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud) { GtkWidget *widget = GHB_WIDGET (ud->builder, "queue_window"); @@ -2258,7 +2360,7 @@ show_queue_menu_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud) gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(widget), TRUE); } -gboolean +G_MODULE_EXPORT gboolean queue_window_delete_cb(GtkWidget *xwidget, GdkEvent *event, signal_user_data_t *ud) { set_visible(xwidget, FALSE); @@ -2267,7 +2369,7 @@ queue_window_delete_cb(GtkWidget *xwidget, GdkEvent *event, signal_user_data_t * return TRUE; } -void +G_MODULE_EXPORT void show_presets_toggled_cb(GtkWidget *action, signal_user_data_t *ud) { GtkWidget *widget; @@ -2369,7 +2471,7 @@ update_chapter_list(signal_user_data_t *ud) static gint chapter_edit_key = 0; -gboolean +G_MODULE_EXPORT gboolean chapter_keypress_cb( GhbCellRendererText *cell, GdkEventKey *event, @@ -2379,7 +2481,7 @@ chapter_keypress_cb( return FALSE; } -void +G_MODULE_EXPORT void chapter_edited_cb( GhbCellRendererText *cell, gchar *path, @@ -2458,7 +2560,7 @@ chapter_edited_cb( gtk_tree_path_free (treepath); } -void +G_MODULE_EXPORT void chapter_list_selection_changed_cb(GtkTreeSelection *selection, signal_user_data_t *ud) { g_debug("chapter_list_selection_changed_cb ()"); @@ -2479,7 +2581,6 @@ debug_log_handler(const gchar *domain, GLogLevelFlags flags, const gchar *msg, g void warn_log_handler(const gchar *domain, GLogLevelFlags flags, const gchar *msg, gpointer data) { - printf("mywarning\n"); printf("%s: %s\n", domain, msg); } @@ -2512,7 +2613,7 @@ ghb_hbfd(signal_user_data_t *ud, gboolean hbfd) } -void +G_MODULE_EXPORT void hbfd_toggled_cb(GtkWidget *widget, signal_user_data_t *ud) { g_debug("hbfd_toggled_cb"); @@ -2522,7 +2623,7 @@ hbfd_toggled_cb(GtkWidget *widget, signal_user_data_t *ud) ghb_pref_save(ud->settings, "hbfd"); } -void +G_MODULE_EXPORT void pref_changed_cb(GtkWidget *widget, signal_user_data_t *ud) { g_debug("pref_changed_cb"); @@ -2532,7 +2633,7 @@ pref_changed_cb(GtkWidget *widget, signal_user_data_t *ud) ghb_pref_save(ud->settings, name); } -void +G_MODULE_EXPORT void vqual_granularity_changed_cb(GtkWidget *widget, signal_user_data_t *ud) { g_debug("vqual_granularity_changed_cb"); @@ -2551,7 +2652,7 @@ vqual_granularity_changed_cb(GtkWidget *widget, signal_user_data_t *ud) gtk_range_set_increments (GTK_RANGE(qp), step, page); } -void +G_MODULE_EXPORT void tweaks_changed_cb(GtkWidget *widget, signal_user_data_t *ud) { g_debug("tweaks_changed_cb"); @@ -2560,7 +2661,7 @@ tweaks_changed_cb(GtkWidget *widget, signal_user_data_t *ud) ghb_pref_save(ud->settings, name); } -void +G_MODULE_EXPORT void hbfd_feature_changed_cb(GtkWidget *widget, signal_user_data_t *ud) { g_debug("hbfd_feature_changed_cb"); @@ -2594,20 +2695,30 @@ ghb_file_menu_add_dvd(signal_user_data_t *ud) link = drives = dvd_device_list(); while (link != NULL) { - gchar *name = (gchar*)link->data; + GtkAction *action; + gchar *drive = (gchar*)link->data; + gchar *name = get_drive_name(drive); + + action = gtk_action_group_get_action(agroup, drive); + if (action != NULL) + { + gtk_action_group_remove_action(agroup, action); + g_object_unref(G_OBJECT(action)); + } // Create action for this drive - GtkAction *action = gtk_action_new(name, name, + action = gtk_action_new(drive, name, "Scan this DVD source", "gtk-cdrom"); // Add action to action group - gtk_action_group_add_action_with_accel(agroup, action, ""); + gtk_action_group_add_action_with_accel(agroup, action, NULL); // Add to ui manager gtk_ui_manager_add_ui(ui, merge_id, - "ui/menubar1/menuitem1/quit1", name, name, + "ui/menubar1/menuitem1/quit1", drive, drive, GTK_UI_MANAGER_AUTO, TRUE); // Connect signal to action (menu item) g_signal_connect(action, "activate", (GCallback)dvd_source_activate_cb, ud); g_free(name); + g_free(drive); link = link->next; } g_list_free(drives); @@ -2623,9 +2734,33 @@ gboolean ghb_is_cd(GDrive *gd); static GList* dvd_device_list() { + GList *dvd_devices = NULL; + +#if defined(_WIN32) + gint ii, drives; + gchar drive[5]; + + strcpy(drive, "A:" G_DIR_SEPARATOR_S); + drives = GetLogicalDrives(); + for (ii = 0; ii < 26; ii++) + { + if (drives & 0x01) + { + guint dtype; + + drive[0] = 'A' + ii; + dtype = GetDriveType(drive); + if (dtype == DRIVE_CDROM) + { + dvd_devices = g_list_append(dvd_devices, + (gpointer)g_strdup(drive)); + } + } + drives >>= 1; + } +#else GVolumeMonitor *gvm; GList *drives, *link; - GList *dvd_devices = NULL; gvm = g_volume_monitor_get (); drives = g_volume_monitor_get_connected_drives (gvm); @@ -2645,14 +2780,19 @@ dvd_device_list() link = link->next; } g_list_free(drives); +#endif + return dvd_devices; } +#if !defined(_WIN32) static LibHalContext *hal_ctx; +#endif gboolean ghb_is_cd(GDrive *gd) { +#if !defined(_WIN32) gchar *device; LibHalDrive *halDrive; LibHalDriveType dtype; @@ -2663,9 +2803,120 @@ ghb_is_cd(GDrive *gd) libhal_drive_free(halDrive); g_free(device); return (dtype == LIBHAL_DRIVE_TYPE_CDROM); +#else + return FALSE; +#endif +} + +#if defined(_WIN32) +static void +handle_media_change(const gchar *device, gboolean insert, signal_user_data_t *ud) +{ + guint dtype; + static gint ins_count = 0; + static gint rem_count = 0; + + // DVD insertion detected. Scan it. + dtype = GetDriveType(device); + if (dtype != DRIVE_CDROM) + return; + if (insert) + { + rem_count = 0; + ins_count++; + if (ins_count == 2) + { + ghb_file_menu_add_dvd(ud); + if (ud->current_dvd_device != NULL && + strcmp(device, ud->current_dvd_device) == 0) + { + GtkProgressBar *progress; + progress = GTK_PROGRESS_BAR(GHB_WIDGET (ud->builder, "progressbar")); + gtk_progress_bar_set_text (progress, "Scanning ..."); + gtk_progress_bar_set_fraction (progress, 0); + update_source_label(ud, device); + ghb_hb_cleanup(TRUE); + prune_logs(ud); + gint preview_count; + preview_count = ghb_settings_get_int(ud->settings, "preview_count"); + ghb_backend_scan(device, 0, preview_count); + } + } + } + else + { + ins_count = 0; + rem_count++; + if (rem_count == 2) + { + ghb_file_menu_add_dvd(ud); + if (ud->current_dvd_device != NULL && + strcmp(device, ud->current_dvd_device) == 0) + { + ghb_hb_cleanup(TRUE); + prune_logs(ud); + ghb_backend_scan("/dev/null", 0, 1); + } + } + } +} + +static gchar +FindDriveFromMask(ULONG unitmask) +{ + gchar cc; + for (cc = 0; cc < 26; cc++) + { + if (unitmask & 0x01) + return 'A' + cc; + unitmask >>= 1; + } + return 0; } void +wm_drive_changed(MSG *msg, signal_user_data_t *ud) +{ + PDEV_BROADCAST_HDR bch = (PDEV_BROADCAST_HDR)msg->lParam; + gchar drive[4]; + + g_strlcpy(drive, "A:" G_DIR_SEPARATOR_S, 4); + switch (msg->wParam) + { + case DBT_DEVICEARRIVAL: + { + if (bch->dbch_devicetype == DBT_DEVTYP_VOLUME) + { + PDEV_BROADCAST_VOLUME bcv = (PDEV_BROADCAST_VOLUME)bch; + + if (bcv->dbcv_flags & DBTF_MEDIA) + { + drive[0] = FindDriveFromMask(bcv->dbcv_unitmask); + handle_media_change(drive, TRUE, ud); + } + } + } break; + + case DBT_DEVICEREMOVECOMPLETE: + { + if (bch->dbch_devicetype == DBT_DEVTYP_VOLUME) + { + PDEV_BROADCAST_VOLUME bcv = (PDEV_BROADCAST_VOLUME)bch; + + if (bcv->dbcv_flags & DBTF_MEDIA) + { + drive[0] = FindDriveFromMask(bcv->dbcv_unitmask); + handle_media_change(drive, FALSE, ud); + } + } + } break; + default: ; + } +} + +#else + +G_MODULE_EXPORT void drive_changed_cb(GVolumeMonitor *gvm, GDrive *gd, signal_user_data_t *ud) { gchar *device; @@ -2706,8 +2957,9 @@ drive_changed_cb(GVolumeMonitor *gvm, GDrive *gd, signal_user_data_t *ud) } g_free(device); } +#endif - +#if !defined(_WIN32) static void dbus_init (void) { @@ -2719,10 +2971,12 @@ dbus_init (void) #define GPM_DBUS_INHIBIT_INTERFACE "org.freedesktop.PowerManagement.Inhibit" static gboolean gpm_inhibited = FALSE; static guint gpm_cookie = -1; +#endif void ghb_inhibit_gpm() { +#if !defined(_WIN32) DBusGConnection *conn; DBusGProxy *proxy; GError *error = NULL; @@ -2770,11 +3024,13 @@ ghb_inhibit_gpm() gpm_inhibited = TRUE; g_object_unref(G_OBJECT(proxy)); dbus_g_connection_unref(conn); +#endif } void ghb_uninhibit_gpm() { +#if !defined(_WIN32) DBusGConnection *conn; DBusGProxy *proxy; GError *error = NULL; @@ -2818,11 +3074,13 @@ ghb_uninhibit_gpm() gpm_inhibited = FALSE; dbus_g_connection_unref(conn); g_object_unref(G_OBJECT(proxy)); +#endif } void ghb_hal_init() { +#if !defined(_WIN32) DBusGConnection *gconn; DBusConnection *conn; GError *gerror = NULL; @@ -2873,9 +3131,10 @@ ghb_hal_init() libhal_free_string_array (devices); dbus_g_connection_unref(gconn); +#endif } -gboolean +G_MODULE_EXPORT gboolean tweak_setting_cb( GtkWidget *widget, GdkEventButton *event, @@ -2937,7 +3196,7 @@ tweak_setting_cb( return ret; } -gboolean +G_MODULE_EXPORT gboolean easter_egg_cb( GtkWidget *widget, GdkEventButton *event, @@ -2963,7 +3222,7 @@ easter_egg_cb( return FALSE; } -gchar* +G_MODULE_EXPORT gchar* format_deblock_cb(GtkScale *scale, gdouble val, signal_user_data_t *ud) { if (val < 5.0) @@ -2976,7 +3235,7 @@ format_deblock_cb(GtkScale *scale, gdouble val, signal_user_data_t *ud) } } -gchar* +G_MODULE_EXPORT gchar* format_drc_cb(GtkScale *scale, gdouble val, signal_user_data_t *ud) { if (val <= 0.0) @@ -2989,7 +3248,7 @@ format_drc_cb(GtkScale *scale, gdouble val, signal_user_data_t *ud) } } -gchar* +G_MODULE_EXPORT gchar* format_vquality_cb(GtkScale *scale, gdouble val, signal_user_data_t *ud) { gdouble percent; @@ -3029,11 +3288,13 @@ format_vquality_cb(GtkScale *scale, gdouble val, signal_user_data_t *ud) return g_strdup_printf("QP: %.1f / %.1f%%", val, percent); } -static void +#if !defined(_WIN32) +G_MODULE_EXPORT void html_link_cb(GtkHTML *html, const gchar *url, signal_user_data_t *ud) { browse_url(url); } +#endif static gpointer check_stable_update(signal_user_data_t *ud); static gboolean stable_update_lock = FALSE; @@ -3042,7 +3303,10 @@ static void process_appcast(signal_user_data_t *ud) { gchar *description = NULL, *build = NULL, *version = NULL, *msg; - GtkWidget *html, *window, *dialog, *label; +#if !defined(_WIN32) + GtkWidget *html, *window; +#endif + GtkWidget *dialog, *label; gint response, ibuild = 0, skip; if (ud->appcast == NULL || ud->appcast_len < 15 || @@ -3067,17 +3331,21 @@ process_appcast(signal_user_data_t *ud) version, build, hb_get_version(NULL), hb_get_build(NULL)); label = GHB_WIDGET(ud->builder, "update_message"); gtk_label_set_text(GTK_LABEL(label), msg); +#if !defined(_WIN32) html = gtk_html_new_from_string(description, -1); g_signal_connect(html, "link_clicked", G_CALLBACK(html_link_cb), ud); window = GHB_WIDGET(ud->builder, "update_scroll"); gtk_container_add(GTK_CONTAINER(window), html); // Show it - dialog = GHB_WIDGET(ud->builder, "update_dialog"); gtk_widget_set_size_request(html, 420, 240); gtk_widget_show(html); +#endif + dialog = GHB_WIDGET(ud->builder, "update_dialog"); response = gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_hide(dialog); +#if !defined(_WIN32) gtk_widget_destroy(html); +#endif if (response == GTK_RESPONSE_OK) { // Skip @@ -3107,7 +3375,7 @@ ghb_net_close(GIOChannel *ioc) g_io_channel_unref(ioc); } -gboolean +G_MODULE_EXPORT gboolean ghb_net_recv_cb(GIOChannel *ioc, GIOCondition cond, gpointer data) { gchar buf[2048]; @@ -3230,7 +3498,7 @@ check_stable_update(signal_user_data_t *ud) return NULL; } -void +G_MODULE_EXPORT void status_activate_cb(GtkStatusIcon *si, signal_user_data_t *ud) { GtkWindow *window; @@ -3239,20 +3507,24 @@ status_activate_cb(GtkStatusIcon *si, signal_user_data_t *ud) gtk_window_present(window); } -static void +#if !defined(_WIN32) +G_MODULE_EXPORT void notify_closed_cb(NotifyNotification *notification, signal_user_data_t *ud) { g_object_unref(G_OBJECT(notification)); } +#endif void ghb_notify_done(signal_user_data_t *ud) { - NotifyNotification *notification; GtkStatusIcon *si; si = GTK_STATUS_ICON(GHB_OBJECT(ud->builder, "hb_status")); gtk_status_icon_set_from_icon_name(si, "hb-status-empty"); + +#if !defined(_WIN32) + NotifyNotification *notification; notification = notify_notification_new( "Encode Complete", "Put down that cocktail, Your HandBrake queue is done!", @@ -3261,4 +3533,5 @@ ghb_notify_done(signal_user_data_t *ud) notify_notification_attach_to_status_icon(notification, si); g_signal_connect(notification, "closed", (GCallback)notify_closed_cb, ud); notify_notification_show(notification, NULL); +#endif } diff --git a/gtk/src/callbacks.h b/gtk/src/callbacks.h index 2c17e50e2..f438ba534 100644 --- a/gtk/src/callbacks.h +++ b/gtk/src/callbacks.h @@ -25,6 +25,10 @@ #if !defined(_CALLBACKS_H_) #define _CALLBACKS_H_ +#if defined(_WIN32) +#include <windows.h> +#endif + #include <gtk/gtk.h> #include "settings.h" @@ -52,6 +56,9 @@ void ghb_log(gchar *log, ...); gpointer ghb_check_update(signal_user_data_t *ud); void ghb_uninhibit_gpm(void); void ghb_inhibit_gpm(void); +#if defined(_WIN32) +void wm_drive_changed(MSG *msg, signal_user_data_t *ud); +#endif #endif // _CALLBACKS_H_ diff --git a/gtk/src/ghb-dvd.c b/gtk/src/ghb-dvd.c index c20b8fa3e..1d3422caf 100644 --- a/gtk/src/ghb-dvd.c +++ b/gtk/src/ghb-dvd.c @@ -37,6 +37,10 @@ * Free Software Foundation version 2 of the License. */ +#if defined(_WIN32) +#include <windows.h> +#endif + #include <glib.h> #include <gio/gio.h> @@ -315,7 +319,6 @@ ghb_dvd_volname(const gchar *device) } #endif -#if defined(__linux__) gchar* ghb_resolve_symlink(const gchar *name) { @@ -359,12 +362,11 @@ ghb_resolve_symlink(const gchar *name) g_object_unref(gfile); return file; } -#endif void ghb_dvd_set_current(const gchar *name, signal_user_data_t *ud) { -#if defined(__linux__) +#if !defined(_WIN32) GFile *gfile; GFileInfo *info; gchar *resolved = ghb_resolve_symlink(name); @@ -395,11 +397,19 @@ ghb_dvd_set_current(const gchar *name, signal_user_data_t *ud) } g_object_unref(gfile); #else + gchar drive[4]; + guint dtype; + if (ud->current_dvd_device != NULL) { g_free(ud->current_dvd_device); ud->current_dvd_device = NULL; } - ud->current_dvd_device = g_strdup(name);; + g_strlcpy(drive, name, 4); + dtype = GetDriveType(drive); + if (dtype == DRIVE_CDROM) + { + ud->current_dvd_device = g_strdup(name); + } #endif } diff --git a/gtk/src/hb-backend.c b/gtk/src/hb-backend.c index 50125767f..eae2f1f2b 100644 --- a/gtk/src/hb-backend.c +++ b/gtk/src/hb-backend.c @@ -1977,9 +1977,9 @@ ghb_update_ui_combo_box(GtkBuilder *builder, const gchar *name, gint user_data, gint signal_id; gint handler_id = 0; - g_debug("ghb_update_ui_combo_box() %s\n", name); if (name != NULL) { + g_debug("ghb_update_ui_combo_box() %s\n", name); // Clearing a combo box causes a rash of "changed" events, even when // the active item is -1 (inactive). To control things, I'm disabling // the event till things are settled down. @@ -3457,7 +3457,7 @@ add_job(hb_handle_t *h, GValue *js, gint unique_id, gint titleindex) job->deinterlace = 0; job->grayscale = ghb_settings_get_boolean(js, "VideoGrayScale"); - job->anamorphic.mode = ghb_settings_get_boolean(js, "PicturePAR"); + job->anamorphic.mode = ghb_settings_combo_int(js, "PicturePAR"); job->anamorphic.modulus = ghb_settings_combo_int(js, "PictureAlignment"); /* Add selected filters */ diff --git a/gtk/src/main.c b/gtk/src/main.c index 76097cbe3..e67b3db13 100644 --- a/gtk/src/main.c +++ b/gtk/src/main.c @@ -33,10 +33,19 @@ #include <config.h> #include <gtk/gtk.h> + +#if !defined(_WIN32) #include <gst/gst.h> +#include <libnotify/notify.h> +#else +#include <windows.h> +#include <io.h> +//#include <pthread/pthread.h> +#define pipe(phandles) _pipe (phandles, 4096, _O_BINARY) +#endif + #include <glib/gstdio.h> #include <gio/gio.h> -#include <libnotify/notify.h> #include "hb.h" #include "renderer_button.h" #include "hb-backend.h" @@ -76,7 +85,6 @@ #endif - #define BUILDER_NAME "ghb" GtkBuilder* @@ -193,9 +201,9 @@ change_font(GtkWidget *widget, gpointer data) //gtk_container_foreach((GtkContainer*)window, change_font, "sans 20"); #endif -extern void chapter_list_selection_changed_cb(void); -extern void chapter_edited_cb(void); -extern void chapter_keypress_cb(void); +extern G_MODULE_EXPORT void chapter_list_selection_changed_cb(void); +extern G_MODULE_EXPORT void chapter_edited_cb(void); +extern G_MODULE_EXPORT void chapter_keypress_cb(void); // Create and bind the tree model to the tree view for the chapter list // Also, connect up the signal that lets us know the selection has changed @@ -236,11 +244,11 @@ bind_chapter_tree_model (signal_user_data_t *ud) } -extern void queue_list_selection_changed_cb(void); -extern void queue_remove_clicked_cb(void); -extern void queue_list_size_allocate_cb(void); -extern void queue_drag_cb(void); -extern void queue_drag_motion_cb(void); +extern G_MODULE_EXPORT void queue_list_selection_changed_cb(void); +extern G_MODULE_EXPORT void queue_remove_clicked_cb(void); +extern G_MODULE_EXPORT void queue_list_size_allocate_cb(void); +extern G_MODULE_EXPORT void queue_drag_cb(void); +extern G_MODULE_EXPORT void queue_drag_motion_cb(void); // Create and bind the tree model to the tree view for the queue list // Also, connect up the signal that lets us know the selection has changed @@ -304,7 +312,7 @@ bind_queue_tree_model (signal_user_data_t *ud) gtk_widget_hide (widget); } -extern void audio_list_selection_changed_cb(void); +extern G_MODULE_EXPORT void audio_list_selection_changed_cb(void); // Create and bind the tree model to the tree view for the audio track list // Also, connect up the signal that lets us know the selection has changed @@ -369,9 +377,9 @@ bind_audio_tree_model (signal_user_data_t *ud) g_debug("Done\n"); } -extern void presets_list_selection_changed_cb(void); -extern void presets_drag_cb(void); -extern void presets_drag_motion_cb(void); +extern G_MODULE_EXPORT void presets_list_selection_changed_cb(void); +extern G_MODULE_EXPORT void presets_drag_cb(void); +extern G_MODULE_EXPORT void presets_drag_motion_cb(void); extern void presets_row_expanded_cb(void); // Create and bind the tree model to the tree view for the preset list @@ -444,8 +452,12 @@ IoRedirect(signal_user_data_t *ud) g_free(config); // Set encoding to raw. g_io_channel_set_encoding (ud->activity_log, NULL, NULL); +#if !defined(_WIN32) stderr->_fileno = pfd[1]; - stdin->_fileno = pfd[0]; +#else + stderr->_file = pfd[1]; +#endif + setvbuf(stderr, NULL, _IONBF, 0); channel = g_io_channel_unix_new (pfd[0]); // I was getting an this error: // "Invalid byte sequence in conversion input" @@ -472,31 +484,47 @@ static GOptionEntry entries[] = { NULL } }; -#if defined(__linux__) -void drive_changed_cb(GVolumeMonitor *gvm, GDrive *gd, signal_user_data_t *ud); +G_MODULE_EXPORT void drive_changed_cb(GVolumeMonitor *gvm, GDrive *gd, signal_user_data_t *ud); //void drive_disconnected_cb(GnomeVFSVolumeMonitor *gvm, GnomeVFSDrive *gd, signal_user_data_t *ud); +#if defined(_WIN32) +G_MODULE_EXPORT GdkFilterReturn +win_message_cb(GdkXEvent *wmevent, GdkEvent *event, gpointer data) +{ + signal_user_data_t *ud = (signal_user_data_t*)data; + MSG *msg = (MSG*)wmevent; + + if (msg->message == WM_DEVICECHANGE) + { + wm_drive_changed(wmevent, ud); + } + return GDK_FILTER_CONTINUE; +} +#endif + void watch_volumes(signal_user_data_t *ud) { +#if !defined(_WIN32) GVolumeMonitor *gvm; gvm = g_volume_monitor_get (); g_signal_connect(gvm, "drive-changed", (GCallback)drive_changed_cb, ud); - //g_signal_connect(gvm, "drive-connected", (GCallback)drive_connected_cb, ud); -} #else -void -watch_volumes(signal_user_data_t *ud) -{ -} + GdkWindow *window; + GtkWidget *widget; + + widget = GHB_WIDGET (ud->builder, "hb_window"); + window = gtk_widget_get_parent_window(widget); + gdk_window_add_filter(window, win_message_cb, ud); #endif +} // Hack to avoid a segfault in libavcodec extern int mm_flags; int mm_support(); -void x264_entry_changed_cb(GtkWidget *widget, signal_user_data_t *ud); +G_MODULE_EXPORT void x264_entry_changed_cb(GtkWidget *widget, signal_user_data_t *ud); void preview_window_expose_cb(void); // Some style definitions for the preview window and hud @@ -543,24 +571,33 @@ main (int argc, char *argv[]) textdomain (GETTEXT_PACKAGE); #endif +#ifdef PTW32_STATIC_LIB + pthread_win32_process_attach_np(); + pthread_win32_thread_attach_np(); +#endif + if (!g_thread_supported()) g_thread_init(NULL); context = g_option_context_new ("- Rip and encode DVD or MPEG file"); g_option_context_add_main_entries (context, entries, GETTEXT_PACKAGE); g_option_context_add_group (context, gtk_get_option_group (TRUE)); +#if !defined(_WIN32) g_option_context_add_group (context, gst_init_get_option_group ()); +#endif g_option_context_parse (context, &argc, &argv, &error); g_option_context_free(context); gtk_set_locale (); gtk_init (&argc, &argv); gtk_rc_parse_string(hud_rcstyle); +#if !defined(_WIN32) notify_init("HandBrake"); +#endif ghb_register_transforms(); ghb_resource_init(); ghb_load_icons(); -#if defined(__linux__) +#if !defined(_WIN32) ghb_hal_init(); #endif @@ -570,9 +607,9 @@ main (int argc, char *argv[]) g_log_set_handler ("Gtk", G_LOG_LEVEL_WARNING, warn_log_handler, ud); //g_log_set_handler ("Gtk", G_LOG_LEVEL_CRITICAL, warn_log_handler, ud); ud->settings = ghb_settings_new(); + ud->builder = create_builder_or_die (BUILDER_NAME); // Enable events that alert us to media change events watch_volumes (ud); - ud->builder = create_builder_or_die (BUILDER_NAME); //GtkWidget *widget = GHB_WIDGET(ud->builder, "PictureDetelecineCustom"); //gtk_entry_set_inner_border(widget, 2); @@ -687,8 +724,13 @@ main (int argc, char *argv[]) ghb_value_free(ud->settings); g_io_channel_unref(ud->activity_log); ghb_settings_close(); +#if !defined(_WIN32) notify_uninit(); +#endif g_free(ud); +#ifdef PTW32_STATIC_LIB + pthread_win32_thread_detach_np(); + pthread_win32_process_detach_np(); +#endif return 0; } - diff --git a/gtk/src/presets.c b/gtk/src/presets.c index 2a07291f5..1c5869d4c 100644 --- a/gtk/src/presets.c +++ b/gtk/src/presets.c @@ -1033,7 +1033,7 @@ ghb_get_user_config_dir(gchar *subdir) gchar **split; gint ii; - split = g_strsplit(subdir, "/", -1); + split = g_strsplit(subdir, G_DIR_SEPARATOR_S, -1); for (ii = 0; split[ii] != NULL; ii++) { gchar *tmp; @@ -1328,6 +1328,34 @@ ghb_settings_close() ghb_value_free(prefsPlist); } +#if defined(_WIN32) +gchar* +FindFirstCDROM(void) +{ + gint ii, drives; + gchar drive[5]; + + strcpy(drive, "A:" G_DIR_SEPARATOR_S); + drives = GetLogicalDrives(); + for (ii = 0; ii < 26; ii++) + { + if (drives & 0x01) + { + guint dtype; + + drive[0] = 'A' + ii; + dtype = GetDriveType(drive); + if (dtype == DRIVE_CDROM) + { + return g_strdup(drive); + } + } + drives >>= 1; + } + return NULL; +} +#endif + void ghb_prefs_load(signal_user_data_t *ud) { @@ -1363,6 +1391,18 @@ ghb_prefs_load(signal_user_data_t *ud) } ghb_dict_insert(dict, g_strdup("destination_dir"), ghb_value_dup(ghb_string_value(dir))); +#if defined(_WIN32) + gchar *source; + + source = FindFirstCDROM(); + if (source == NULL) + { + source = g_strdup("C:" G_DIR_SEPARATOR_S); + } + ghb_dict_insert(dict, g_strdup("default_source"), + ghb_value_dup(ghb_string_value(source))); + g_free(source); +#endif store_prefs(); } // Read legacy default_preset preference and update accordingly @@ -2837,7 +2877,7 @@ enforce_preset_type(signal_user_data_t *ud, const GValue *path) } } -void +G_MODULE_EXPORT void presets_save_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud) { GtkWidget *dialog; @@ -2906,13 +2946,13 @@ presets_save_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud) } } -void +G_MODULE_EXPORT void preset_type_changed_cb(GtkWidget *widget, signal_user_data_t *ud) { ghb_widget_to_setting(ud->settings, widget); } -void +G_MODULE_EXPORT void preset_name_changed_cb(GtkWidget *entry, signal_user_data_t *ud) { gchar *name; @@ -2928,7 +2968,7 @@ preset_name_changed_cb(GtkWidget *entry, signal_user_data_t *ud) ghb_value_free(dest); } -void +G_MODULE_EXPORT void presets_restore_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud) { GValue *preset; @@ -2942,7 +2982,7 @@ presets_restore_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud) ghb_select_preset(ud->builder, preset); } -void +G_MODULE_EXPORT void presets_remove_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud) { GtkTreeView *treeview; @@ -3011,7 +3051,7 @@ presets_remove_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud) } // controls where valid drop locations are -gboolean +G_MODULE_EXPORT gboolean presets_drag_motion_cb( GtkTreeView *tv, GdkDragContext *ctx, @@ -3102,7 +3142,7 @@ presets_drag_motion_cb( return TRUE; } -void +G_MODULE_EXPORT void presets_drag_cb( GtkTreeView *dstwidget, GdkDragContext *dc, @@ -3347,7 +3387,7 @@ preset_update_title_deps(signal_user_data_t *ud, ghb_title_info_t *tinfo) } } -void +G_MODULE_EXPORT void presets_list_selection_changed_cb(GtkTreeSelection *selection, signal_user_data_t *ud) { GtkTreeModel *store; @@ -3445,7 +3485,7 @@ ghb_clear_presets_selection(signal_user_data_t *ud) ghb_settings_set_boolean(ud->settings, "preset_modified", TRUE); } -void +G_MODULE_EXPORT void presets_frame_size_allocate_cb(GtkWidget *widget, GtkAllocation *allocation, signal_user_data_t *ud) { GtkTreeView *treeview; @@ -3465,7 +3505,7 @@ presets_frame_size_allocate_cb(GtkWidget *widget, GtkAllocation *allocation, sig } } -void +G_MODULE_EXPORT void presets_default_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud) { GValue *preset; diff --git a/gtk/src/preview.c b/gtk/src/preview.c index 6164270de..ef5f8c738 100644 --- a/gtk/src/preview.c +++ b/gtk/src/preview.c @@ -16,11 +16,18 @@ #include <glib/gstdio.h> #include <glib-object.h> #include <gtk/gtk.h> + +#if !defined(_WIN32) #include <gdk/gdkx.h> +#endif + +#if defined(_ENABLE_GST) #include <gst/gst.h> #include <gst/interfaces/xoverlay.h> #include <gst/video/video.h> #include <gst/pbutils/missing-plugins.h> +#endif + #include "settings.h" #include "presets.h" #include "callbacks.h" @@ -34,7 +41,10 @@ struct preview_s { +#if defined(_ENABLE_GST) GstElement *play; + gulong xid; +#endif gint64 len; gint64 pos; gboolean seek_lock; @@ -42,7 +52,6 @@ struct preview_s gint width; gint height; GtkWidget *view; - gulong xid; GdkPixbuf *pix; gint button_width; gint button_height; @@ -55,15 +64,19 @@ struct preview_s gchar *current; }; -static gboolean live_preview_cb(GstBus *bus, GstMessage *msg, gpointer data); +#if defined(_ENABLE_GST) +G_MODULE_EXPORT gboolean live_preview_cb(GstBus *bus, GstMessage *msg, gpointer data); static GstBusSyncReply create_window(GstBus *bus, GstMessage *msg, gpointer data); -gboolean preview_expose_cb(GtkWidget *widget, GdkEventExpose *event, +#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) { +#if defined(_ENABLE_GST) GValue disp_par = {0,}; GstElement *xover; GObjectClass *klass; @@ -91,6 +104,10 @@ ghb_screen_par(signal_user_data_t *ud, gint *par_n, gint *par_d) *par_n = gst_value_get_fraction_numerator(&disp_par); *par_d = gst_value_get_fraction_denominator(&disp_par); g_value_unset(&disp_par); +#else + *par_n = 1; + *par_d = 1; +#endif } void @@ -111,20 +128,22 @@ ghb_par_scale(signal_user_data_t *ud, gint *width, gint *height, gint par_n, gin void ghb_preview_init(signal_user_data_t *ud) { - GstBus *bus; - GstElement *xover; - 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), "expose_event", G_CALLBACK(preview_expose_cb), ud); - ud->preview->xid = GDK_DRAWABLE_XID(ud->preview->view->window); - ud->preview->play = gst_element_factory_make("playbin", "play"); ud->preview->pause = TRUE; ud->preview->encode_frame = -1; ud->preview->live_id = -1; + +#if defined(_ENABLE_GST) + GstBus *bus; + GstElement *xover; + + ud->preview->xid = GDK_DRAWABLE_XID(ud->preview->view->window); + ud->preview->play = gst_element_factory_make("playbin", "play"); //xover = gst_element_factory_make("xvimagesink", "xover"); //xover = gst_element_factory_make("ximagesink", "xover"); xover = gst_element_factory_make("gconfvideosink", "xover"); @@ -135,6 +154,12 @@ ghb_preview_init(signal_user_data_t *ud) gst_bus_add_watch(bus, live_preview_cb, ud); gst_bus_set_sync_handler(bus, create_window, ud->preview); gst_object_unref(bus); +#else + GtkWidget *widget = GHB_WIDGET(ud->builder, "live_preview_box"); + gtk_widget_hide (widget); + widget = GHB_WIDGET(ud->builder, "live_preview_duration_box"); + gtk_widget_hide (widget); +#endif } void @@ -147,6 +172,7 @@ ghb_preview_cleanup(signal_user_data_t *ud) } } +#if defined(_ENABLE_GST) static GstBusSyncReply create_window(GstBus *bus, GstMessage *msg, gpointer data) { @@ -307,7 +333,7 @@ update_stream_info(signal_user_data_t *ud) g_list_free(vstreams); } -static gboolean +G_MODULE_EXPORT gboolean live_preview_cb(GstBus *bus, GstMessage *msg, gpointer data) { signal_user_data_t *ud = (signal_user_data_t*)data; @@ -409,6 +435,7 @@ live_preview_pause(signal_user_data_t *ud) gst_element_set_state(ud->preview->play, GST_STATE_PAUSED); ud->preview->pause = TRUE; } +#endif void live_preview_stop(signal_user_data_t *ud) @@ -418,7 +445,9 @@ live_preview_stop(signal_user_data_t *ud) img = GTK_IMAGE(GHB_WIDGET(ud->builder, "live_preview_play_image")); gtk_image_set_from_stock(img, "gtk-media-play", GTK_ICON_SIZE_BUTTON); +#if defined(_ENABLE_GST) gst_element_set_state(ud->preview->play, GST_STATE_NULL); +#endif ud->preview->pause = TRUE; ud->preview->state = PREVIEW_STATE_IMAGE; @@ -452,7 +481,7 @@ ghb_live_reset(signal_user_data_t *ud) extern void hb_get_tempory_directory(hb_handle_t *h, char path[512]); -void +G_MODULE_EXPORT void live_preview_start_cb(GtkWidget *xwidget, signal_user_data_t *ud) { gchar *tmp_dir; @@ -468,10 +497,12 @@ live_preview_start_cb(GtkWidget *xwidget, signal_user_data_t *ud) if (ud->preview->encoded[frame] && g_file_test(name, G_FILE_TEST_IS_REGULAR)) { +#if defined(_ENABLE_GST) if (ud->preview->pause) live_preview_start(ud); else live_preview_pause(ud); +#endif } else { @@ -502,7 +533,9 @@ ghb_live_encode_done(signal_user_data_t *ud, gboolean success) gtk_progress_bar_set_text(GTK_PROGRESS_BAR(prog), "Done"); gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR(prog), 1); ud->preview->encoded[ud->preview->encode_frame] = TRUE; +#if defined(_ENABLE_GST) live_preview_start(ud); +#endif widget = GHB_WIDGET(ud->builder, "live_progress_box"); gtk_widget_hide (widget); widget = GHB_WIDGET(ud->builder, "live_preview_progress"); @@ -516,7 +549,8 @@ ghb_live_encode_done(signal_user_data_t *ud, gboolean success) } } -static gboolean +#if defined(_ENABLE_GST) +G_MODULE_EXPORT gboolean unlock_progress_cb(signal_user_data_t *ud) { ud->preview->progress_lock = FALSE; @@ -524,10 +558,12 @@ unlock_progress_cb(signal_user_data_t *ud) // so that it is not called again return FALSE; } +#endif void ghb_live_preview_progress(signal_user_data_t *ud) { +#if defined(_ENABLE_GST) GstFormat fmt = GST_FORMAT_TIME; gint64 len = -1, pos = -1; @@ -559,9 +595,11 @@ ghb_live_preview_progress(signal_user_data_t *ud) gtk_range_set_value(progress, percent); } g_idle_add((GSourceFunc)unlock_progress_cb, ud); +#endif } -static gboolean +#if defined(_ENABLE_GST) +G_MODULE_EXPORT gboolean unlock_seek_cb(signal_user_data_t *ud) { ud->preview->seek_lock = FALSE; @@ -569,10 +607,12 @@ unlock_seek_cb(signal_user_data_t *ud) // so that it is not called again return FALSE; } +#endif -void +G_MODULE_EXPORT void live_preview_seek_cb(GtkWidget *widget, signal_user_data_t *ud) { +#if defined(_ENABLE_GST) gdouble dval; gint64 pos; @@ -587,6 +627,7 @@ live_preview_seek_cb(GtkWidget *widget, signal_user_data_t *ud) GST_SEEK_TYPE_SET, pos, GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE); g_idle_add((GSourceFunc)unlock_seek_cb, ud); +#endif } void @@ -666,7 +707,8 @@ ghb_set_preview_image(signal_user_data_t *ud) } } -static gboolean +#if defined(_ENABLE_GST) +G_MODULE_EXPORT gboolean delayed_expose_cb(signal_user_data_t *ud) { GstElement *vsink; @@ -683,13 +725,15 @@ delayed_expose_cb(signal_user_data_t *ud) // so that it is not called again return FALSE; } +#endif -gboolean +G_MODULE_EXPORT gboolean preview_expose_cb( GtkWidget *widget, GdkEventExpose *event, signal_user_data_t *ud) { +#if defined(_ENABLE_GST) if (ud->preview->state == PREVIEW_STATE_LIVE) { if (GST_STATE(ud->preview->play) >= GST_STATE_PAUSED) @@ -712,6 +756,7 @@ preview_expose_cb( } return TRUE; } +#endif if (ud->preview->pix != NULL) { @@ -722,7 +767,7 @@ preview_expose_cb( return TRUE; } -void +G_MODULE_EXPORT void preview_button_size_allocate_cb(GtkWidget *widget, GtkAllocation *allocation, signal_user_data_t *ud) { g_debug("allocate %d x %d", allocation->width, allocation->height); @@ -919,7 +964,7 @@ preview_frame_value_changed_cb(GtkWidget *widget, signal_user_data_t *ud) ghb_set_preview_image(ud); } -gboolean +G_MODULE_EXPORT gboolean preview_window_delete_cb( GtkWidget *widget, GdkEvent *event, @@ -967,7 +1012,7 @@ settings_window_delete_cb( return TRUE; } -void +G_MODULE_EXPORT void preview_duration_changed_cb(GtkWidget *widget, signal_user_data_t *ud) { g_debug("preview_duration_changed_cb ()"); diff --git a/gtk/src/queuehandler.c b/gtk/src/queuehandler.c index f01f543b6..aed2b0790 100644 --- a/gtk/src/queuehandler.c +++ b/gtk/src/queuehandler.c @@ -23,7 +23,7 @@ #include "presets.h" #include "ghb-dvd.h" -void +G_MODULE_EXPORT void queue_list_selection_changed_cb(GtkTreeSelection *selection, signal_user_data_t *ud) { GtkTreeModel *store; @@ -674,14 +674,14 @@ queue_add(signal_user_data_t *ud) return TRUE; } -void +G_MODULE_EXPORT void queue_add_clicked_cb(GtkWidget *widget, signal_user_data_t *ud) { g_debug("queue_add_clicked_cb ()"); queue_add(ud); } -void +G_MODULE_EXPORT void queue_remove_clicked_cb(GtkWidget *widget, gchar *path, signal_user_data_t *ud) { GtkTreeView *treeview; @@ -761,7 +761,7 @@ find_last_finished(GValue *queue) // handler from expanding rows if you hover over them while // dragging. // Also controls where valid drop locations are -gboolean +G_MODULE_EXPORT gboolean queue_drag_motion_cb( GtkTreeView *tv, GdkDragContext *ctx, @@ -839,7 +839,7 @@ queue_drag_motion_cb( return TRUE; } -void +G_MODULE_EXPORT void queue_drag_cb( GtkTreeView *dstwidget, GdkDragContext *dc, @@ -973,7 +973,7 @@ ghb_queue_buttons_grey(signal_user_data_t *ud, gboolean working) gtk_action_set_sensitive (action, working); } -void +G_MODULE_EXPORT void queue_list_size_allocate_cb(GtkWidget *widget, GtkAllocation *allocation, GtkCellRenderer *cell) { GtkTreeViewColumn *column; @@ -988,7 +988,7 @@ queue_list_size_allocate_cb(GtkWidget *widget, GtkAllocation *allocation, GtkCel g_object_set(cell, "wrap-width", width-70, NULL); } -void +G_MODULE_EXPORT void queue_start_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud) { GValue *js; @@ -1024,14 +1024,14 @@ queue_start_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud) } } -void +G_MODULE_EXPORT void queue_stop_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud) { ud->cancel_encode = TRUE; ghb_cancel_encode(NULL); } -void +G_MODULE_EXPORT void queue_pause_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud) { ghb_pause_queue(); @@ -1107,7 +1107,7 @@ ghb_reload_queue(signal_user_data_t *ud) return FALSE; } -gboolean +G_MODULE_EXPORT gboolean queue_key_press_cb( GtkWidget *widget, GdkEventKey *event, @@ -1170,7 +1170,7 @@ queue_key_press_cb( GValue *ghb_queue_edit_settings = NULL; -void +G_MODULE_EXPORT void queue_edit_clicked_cb(GtkWidget *xwidget, signal_user_data_t *ud) { GtkTreeView *treeview; diff --git a/gtk/src/values.c b/gtk/src/values.c index a2096e008..17319a582 100644 --- a/gtk/src/values.c +++ b/gtk/src/values.c @@ -15,6 +15,7 @@ #include <glib.h> #include <glib-object.h> #include <string.h> +#include <inttypes.h> #include "values.h" static void dict_delete_key(gpointer data); @@ -96,7 +97,7 @@ debug_show_value(GValue *gval) } else if (tp == G_TYPE_INT64) { - g_message("Type %s value %ld", "int64", g_value_get_int64(gval)); + g_message("Type %s value %" PRId64, "int64", g_value_get_int64(gval)); } else if (tp == G_TYPE_DOUBLE) { diff --git a/gtk/src/makedeps.c b/gtk/src/widgetdeps.c index 26bf0fbec..26bf0fbec 100644 --- a/gtk/src/makedeps.c +++ b/gtk/src/widgetdeps.c diff --git a/gtk/src/x264handler.c b/gtk/src/x264handler.c index 20ec56e5f..ff2338f19 100644 --- a/gtk/src/x264handler.c +++ b/gtk/src/x264handler.c @@ -26,7 +26,7 @@ static gchar* sanitize_x264opts(signal_user_data_t *ud, const gchar *options); // Flag needed to prevent x264 options processing from chasing its tail static gboolean ignore_options_update = FALSE; -void +G_MODULE_EXPORT void x264_widget_changed_cb(GtkWidget *widget, signal_user_data_t *ud) { ghb_widget_to_setting(ud->settings, widget); @@ -40,7 +40,7 @@ x264_widget_changed_cb(GtkWidget *widget, signal_user_data_t *ud) ghb_clear_presets_selection(ud); } -void +G_MODULE_EXPORT void x264_me_changed_cb(GtkWidget *widget, signal_user_data_t *ud) { gint me; @@ -68,7 +68,7 @@ x264_me_changed_cb(GtkWidget *widget, signal_user_data_t *ud) } } -void +G_MODULE_EXPORT void x264_entry_changed_cb(GtkWidget *widget, signal_user_data_t *ud) { g_debug("x264_entry_changed_cb ()"); @@ -96,7 +96,7 @@ x264_entry_changed_cb(GtkWidget *widget, signal_user_data_t *ud) } } -gboolean +G_MODULE_EXPORT gboolean x264_focus_out_cb(GtkWidget *widget, GdkEventFocus *event, signal_user_data_t *ud) { |