… | |
… | |
16 | |
16 | |
17 | static GObject *(*old_constructor) (GType type, guint n_construct_properties, GObjectConstructParam *construct_properties); |
17 | static GObject *(*old_constructor) (GType type, guint n_construct_properties, GObjectConstructParam *construct_properties); |
18 | |
18 | |
19 | static gchar *last_path; |
19 | static gchar *last_path; |
20 | |
20 | |
|
|
21 | #if 0 |
21 | #define DEBUG(stmt) stmt; |
22 | # define DEBUG(stmt) stmt; |
|
|
23 | #else |
|
|
24 | # define DEBUG(stmt) |
|
|
25 | #endif |
22 | |
26 | |
23 | ///////////////////////////////////////////////////////////////////////////// |
27 | ///////////////////////////////////////////////////////////////////////////// |
24 | |
28 | |
25 | gchar *gtk_file_chooser_get_filename (GtkFileChooser *chooser) |
29 | gchar *gtk_file_chooser_get_filename (GtkFileChooser *chooser) |
26 | { |
30 | { |
… | |
… | |
59 | } |
63 | } |
60 | |
64 | |
61 | gchar * gtk_file_chooser_get_current_folder (GtkFileChooser *chooser) |
65 | gchar * gtk_file_chooser_get_current_folder (GtkFileChooser *chooser) |
62 | { |
66 | { |
63 | DEBUG ((printf ("gtk_file_chooser_get_current_folder\n"))) |
67 | DEBUG ((printf ("gtk_file_chooser_get_current_folder\n"))) |
64 | return g_strdup ("/nonex1st4nt/"); |
68 | return g_strdup ("/tmp/gtkbfc"); |
65 | } |
69 | } |
66 | |
70 | |
67 | ///////////////////////////////////////////////////////////////////////////// |
71 | ///////////////////////////////////////////////////////////////////////////// |
68 | |
72 | |
69 | static const gchar * |
73 | static const gchar * |
… | |
… | |
142 | |
146 | |
143 | ///////////////////////////////////////////////////////////////////////////// |
147 | ///////////////////////////////////////////////////////////////////////////// |
144 | |
148 | |
145 | static gboolean activate_cb (gpointer data) |
149 | static gboolean activate_cb (gpointer data) |
146 | { |
150 | { |
|
|
151 | gtk_widget_set_sensitive (GTK_WIDGET (gtk_widget_get_toplevel (data)), 1); |
147 | gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (data), FALSE); |
152 | gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (data), FALSE); |
148 | //fprintf (stderr, "ad %d\n", gtk_window_activate_default (GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (data))))); |
153 | //fprintf (stderr, "ad %d\n", gtk_window_activate_default (GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (data))))); |
149 | g_signal_emit_by_name (GTK_FILE_CHOOSER (data), "file-activated"); |
154 | g_signal_emit_by_name (GTK_FILE_CHOOSER (data), "file-activated"); |
150 | return FALSE; |
155 | return FALSE; |
151 | } |
156 | } |
152 | |
157 | |
153 | static gboolean unmap_cb (gpointer data) |
158 | static gboolean unmap_cb (gpointer data) |
154 | { |
159 | { |
|
|
160 | // set the path again to avoid a race condition |
|
|
161 | ((void (*)(void *, const char *)) dlsym (RTLD_NEXT, "gtk_file_chooser_set_filename"))(GTK_FILE_CHOOSER (data), "/tmp/gtkbfc/empty"); |
|
|
162 | gtk_widget_set_sensitive (GTK_WIDGET (gtk_widget_get_toplevel (data)), 0); |
155 | gtk_widget_unmap (GTK_WIDGET (gtk_widget_get_toplevel (data))); |
163 | //gtk_widget_unmap (GTK_WIDGET (gtk_widget_get_toplevel (data))); |
156 | return FALSE; |
164 | return FALSE; |
157 | } |
165 | } |
158 | |
166 | |
159 | static gboolean read_result (GIOChannel *source, GIOCondition condition, gpointer data) |
167 | static gboolean read_result (GIOChannel *source, GIOCondition condition, gpointer data) |
160 | { |
168 | { |
… | |
… | |
197 | argv [3] = 0; |
205 | argv [3] = 0; |
198 | |
206 | |
199 | mkdir ("/tmp/gtkbfc", 0777); |
207 | mkdir ("/tmp/gtkbfc", 0777); |
200 | close (open ("/tmp/gtkbfc/empty", O_WRONLY|O_CREAT|O_TRUNC, 0666)); |
208 | close (open ("/tmp/gtkbfc/empty", O_WRONLY|O_CREAT|O_TRUNC, 0666)); |
201 | |
209 | |
202 | if (save) |
|
|
203 | ((void (*)(void *, const char *)) dlsym (RTLD_NEXT, "gtk_file_chooser_set_current_name"))(GTK_FILE_CHOOSER (widget), "/tmp/gtkbfc/empty"); |
|
|
204 | else |
|
|
205 | ((void (*)(void *, const char *)) dlsym (RTLD_NEXT, "gtk_file_chooser_set_filename"))(GTK_FILE_CHOOSER (widget), "/tmp/gtkbfc/empty"); |
210 | ((void (*)(void *, const char *)) dlsym (RTLD_NEXT, "gtk_file_chooser_set_filename"))(GTK_FILE_CHOOSER (widget), "/tmp/gtkbfc/empty"); |
206 | |
211 | |
207 | gint stdout_fd = -1; |
212 | gint stdout_fd = -1; |
208 | |
213 | |
209 | if (g_spawn_async_with_pipes (0, argv, 0, 0, 0, 0, 0, 0, &stdout_fd, 0, 0)) |
214 | if (g_spawn_async_with_pipes (0, argv, 0, 0, 0, 0, 0, 0, &stdout_fd, 0, 0)) |
210 | { |
215 | { |
211 | GIOChannel *channel = g_io_channel_unix_new (stdout_fd); |
216 | GIOChannel *channel = g_io_channel_unix_new (stdout_fd); |
212 | gtk_widget_hide (GTK_WIDGET (gtk_widget_get_toplevel (widget))); |
217 | //gtk_widget_hide (GTK_WIDGET (gtk_widget_get_toplevel (widget))); |
213 | g_io_add_watch (channel, G_IO_IN, read_result, widget); |
218 | g_io_add_watch (channel, G_IO_IN, read_result, widget); |
214 | g_idle_add (unmap_cb, widget); |
219 | g_idle_add (unmap_cb, widget); |
215 | //g_timeout_add (1, unmap_cb, widget); |
220 | //g_timeout_add (1, unmap_cb, widget); |
216 | } |
221 | } |
217 | else |
222 | else |