ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/gtkbfc/gtkbfc.c
(Generate patch)

Comparing gtkbfc/gtkbfc.c (file contents):
Revision 1.9 by root, Sat Aug 18 10:48:29 2007 UTC vs.
Revision 1.19 by root, Sat Aug 18 15:01:08 2007 UTC

10#include <unistd.h> 10#include <unistd.h>
11#include <sys/types.h> 11#include <sys/types.h>
12#include <sys/stat.h> 12#include <sys/stat.h>
13#include <fcntl.h> 13#include <fcntl.h>
14 14
15static const char gtkbfc_version_string[] = "gtkbfc version 0.0";
16
15static char *helper = "/etc/gtkbfc-helper"; 17static char *helper = "/etc/gtkbfc-helper";
16 18
17static GObject *(*old_constructor) (GType type, guint n_construct_properties, GObjectConstructParam *construct_properties); 19static GObject *(*old_constructor) (GType type, guint n_construct_properties, GObjectConstructParam *construct_properties);
18 20
19static gchar *last_path; 21static gchar *last_path;
26 28
27///////////////////////////////////////////////////////////////////////////// 29/////////////////////////////////////////////////////////////////////////////
28 30
29gchar *gtk_file_chooser_get_filename (GtkFileChooser *chooser) 31gchar *gtk_file_chooser_get_filename (GtkFileChooser *chooser)
30{ 32{
31 DEBUG ((printf ("gtk_file_chooser_get_filename %s\n", last_path))) 33 DEBUG ((printf ("gtk_file_chooser_get_filename<%s>\n", last_path)))
32 return g_strdup (last_path ? last_path : "/nonex1st4nt"); 34 return g_strdup (last_path ? last_path : "/nonex1st4nt");
33} 35}
34 36
35gboolean gtk_file_chooser_select_filename (GtkFileChooser *chooser, const char *filename) 37gboolean gtk_file_chooser_select_filename (GtkFileChooser *chooser, const char *filename)
36{ 38{
63} 65}
64 66
65gchar * gtk_file_chooser_get_current_folder (GtkFileChooser *chooser) 67gchar * gtk_file_chooser_get_current_folder (GtkFileChooser *chooser)
66{ 68{
67 DEBUG ((printf ("gtk_file_chooser_get_current_folder\n"))) 69 DEBUG ((printf ("gtk_file_chooser_get_current_folder\n")))
68 return g_strdup ("/nonex1st4nt/"); 70 return g_strdup ("/tmp/gtkbfc");
69} 71}
70 72
71///////////////////////////////////////////////////////////////////////////// 73/////////////////////////////////////////////////////////////////////////////
72 74
73static const gchar * 75static const gchar *
74from_uri (const gchar *uri) 76from_uri (const gchar *uri)
75{ 77{
76 const gchar *rv = uri; 78 const gchar *rv = uri;
77 79
78 if (uri && uri == strstr (uri, "file:///")) 80 if (!strncmp (uri, "file:///", sizeof ("file:///") - 1))
79 rv = uri + 7; 81 rv += sizeof ("file:///") - 1;
80 82
81 return rv; 83 return rv;
82} 84}
83 85
84static gchar * 86static gchar *
87 gchar *rv = NULL; 89 gchar *rv = NULL;
88 90
89 if (file) 91 if (file)
90 { 92 {
91 GString *str = g_string_new ("file://"); 93 GString *str = g_string_new ("file://");
92
93 str = g_string_append (str, file); 94 str = g_string_append (str, file);
94 rv = g_strdup (str->str); 95 rv = g_strdup (str->str);
95 g_string_free (str, TRUE); 96 g_string_free (str, TRUE);
96 g_free (file); 97 g_free (file);
97 } 98 }
118} 119}
119 120
120gchar *gtk_file_chooser_get_uri (GtkFileChooser *chooser) 121gchar *gtk_file_chooser_get_uri (GtkFileChooser *chooser)
121{ 122{
122 gchar *uri = to_uri(gtk_file_chooser_get_filename (chooser)); 123 gchar *uri = to_uri(gtk_file_chooser_get_filename (chooser));
123 DEBUG ((printf ("gtk_file_chooser_get_uri %s\n", uri))); 124 DEBUG ((printf ("gtk_file_chooser_get_uri<%s>\n", uri)))
124 return uri; 125 return uri;
125} 126}
126 127
127gboolean gtk_file_chooser_set_uri (GtkFileChooser *chooser, const char *uri) 128gboolean gtk_file_chooser_set_uri (GtkFileChooser *chooser, const char *uri)
128{ 129{
144 return to_uri (gtk_file_chooser_get_current_folder (chooser)); 145 return to_uri (gtk_file_chooser_get_current_folder (chooser));
145} 146}
146 147
147///////////////////////////////////////////////////////////////////////////// 148/////////////////////////////////////////////////////////////////////////////
148 149
149static gboolean activate_cb (gpointer data)
150{
151 gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (data), FALSE);
152 //fprintf (stderr, "ad %d\n", gtk_window_activate_default (GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (data)))));
153 g_signal_emit_by_name (GTK_FILE_CHOOSER (data), "file-activated");
154 return FALSE;
155}
156
157static gboolean unmap_cb (gpointer data) 150static gboolean disable_cb (gpointer data)
158{ 151{
159 gtk_widget_unmap (GTK_WIDGET (gtk_widget_get_toplevel (data))); 152 ((void (*)(void *, const char *)) dlsym (RTLD_NEXT, "gtk_file_chooser_set_filename"))(GTK_FILE_CHOOSER (data), "/tmp/gtkbfc/empty");
153
154 GtkWidget *toplevel = gtk_widget_get_toplevel (data);
155 if (toplevel) gtk_widget_set_sensitive (toplevel, 0);
156
157 gtk_widget_unref (data);
160 return FALSE; 158 return FALSE;
161} 159}
162 160
163static gboolean read_result (GIOChannel *source, GIOCondition condition, gpointer data) 161static gboolean read_result (GIOChannel *source, GIOCondition condition, gpointer data)
164{ 162{
168 last_path = 0; 166 last_path = 0;
169 } 167 }
170 168
171 g_io_channel_read_to_end (source, &last_path, 0, 0); 169 g_io_channel_read_to_end (source, &last_path, 0, 0);
172 g_io_channel_unref (source); 170 g_io_channel_unref (source);
173 activate_cb (data);
174 171
172 GtkWidget *toplevel = gtk_widget_get_toplevel (data);
173 if (toplevel) gtk_widget_set_sensitive (toplevel, 1);
174
175 if (!last_path || *last_path != '/')
176 {
177 DEBUG ((printf ("read_result cancel\n")))
178 g_free (last_path);
179 last_path = 0;
180
181 if (toplevel)
182 {
183 GdkEvent ev = { GDK_DELETE };
184 g_signal_emit_by_name (toplevel, "delete-event", &ev);
185 }
186 }
187 else
188 {
175 DEBUG ((printf ("read_result<%s>\n", last_path))); 189 DEBUG ((printf ("read_result<%s>\n", last_path)))
190 gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (data), FALSE);
191 g_signal_emit_by_name (GTK_FILE_CHOOSER (data), "file-activated");
192 }
176 193
194 gtk_widget_unref (data);
177 return FALSE; 195 return FALSE;
178} 196}
179 197
180static gboolean show_cb (GtkWidget *widget, GdkEvent *event, gpointer user_data) 198static gboolean map_cb (GtkWidget *widget, gpointer user_data)
181{ 199{
182 gchar *argv[10]; 200 gchar *argv[10];
183 gboolean save = 0; 201 gboolean save = 0;
184 char xid [40]; 202 char xid [40];
185 203
189 { 207 {
190 case GTK_FILE_CHOOSER_ACTION_SAVE: argv [1] = "save "; save = 1;break; 208 case GTK_FILE_CHOOSER_ACTION_SAVE: argv [1] = "save "; save = 1;break;
191 case GTK_FILE_CHOOSER_ACTION_OPEN: argv [1] = "load "; break; 209 case GTK_FILE_CHOOSER_ACTION_OPEN: argv [1] = "load "; break;
192 case GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER: argv [1] = "mkdir "; save = 1; break; 210 case GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER: argv [1] = "mkdir "; save = 1; break;
193 case GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER: argv [1] = "cd "; break; 211 case GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER: argv [1] = "cd "; break;
194 default: argv [1] = "<filechooser> "; break; 212 default: argv [1] = "<unknown action> "; break;
195 } 213 }
196 214
197 GdkWindow *w = gtk_widget_get_parent_window (GTK_WIDGET (widget)); 215 GdkWindow *w = gtk_widget_get_parent_window (GTK_WIDGET (widget));
198 216
199 snprintf (xid, 80, "%lu", (unsigned long)(w ? gdk_x11_drawable_get_xid (w) : 0)); 217 snprintf (xid, 80, "%lu", (unsigned long)(w ? gdk_x11_drawable_get_xid (w) : 0));
201 argv [3] = 0; 219 argv [3] = 0;
202 220
203 mkdir ("/tmp/gtkbfc", 0777); 221 mkdir ("/tmp/gtkbfc", 0777);
204 close (open ("/tmp/gtkbfc/empty", O_WRONLY|O_CREAT|O_TRUNC, 0666)); 222 close (open ("/tmp/gtkbfc/empty", O_WRONLY|O_CREAT|O_TRUNC, 0666));
205 223
206 if (save)
207 ((void (*)(void *, const char *)) dlsym (RTLD_NEXT, "gtk_file_chooser_set_current_name"))(GTK_FILE_CHOOSER (widget), "/tmp/gtkbfc/empty");
208 else
209 ((void (*)(void *, const char *)) dlsym (RTLD_NEXT, "gtk_file_chooser_set_filename"))(GTK_FILE_CHOOSER (widget), "/tmp/gtkbfc/empty"); 224 ((void (*)(void *, const char *)) dlsym (RTLD_NEXT, "gtk_file_chooser_set_filename"))(GTK_FILE_CHOOSER (widget), "/tmp/gtkbfc/empty");
210 225
211 gint stdout_fd = -1; 226 gint stdout_fd = -1;
212 227
228 gtk_widget_ref (widget); disable_cb (widget);
229
213 if (g_spawn_async_with_pipes (0, argv, 0, 0, 0, 0, 0, 0, &stdout_fd, 0, 0)) 230 if (g_spawn_async_with_pipes (0, argv, 0, 0, 0, 0, 0, 0, &stdout_fd, 0, 0))
214 { 231 {
215 GIOChannel *channel = g_io_channel_unix_new (stdout_fd); 232 GIOChannel *channel = g_io_channel_unix_new (stdout_fd);
216 gtk_widget_hide (GTK_WIDGET (gtk_widget_get_toplevel (widget))); 233
217 g_io_add_watch (channel, G_IO_IN, read_result, widget); 234 gtk_widget_ref (widget); g_io_add_watch (channel, G_IO_IN | G_IO_ERR | G_IO_HUP, read_result, widget);
218 g_idle_add (unmap_cb, widget); 235
219 //g_timeout_add (1, unmap_cb, widget); 236 // disable again in an idle handler, to get around race conditions
237 gtk_widget_ref (widget); g_idle_add (disable_cb, widget);
220 } 238 }
221 else
222 ;//gtk_widget_show (widget);
223} 239}
224 240
225static GObject *new_constructor (GType type, guint n_construct_properties, GObjectConstructParam *construct_properties) 241static GObject *new_constructor (GType type, guint n_construct_properties, GObjectConstructParam *construct_properties)
226{ 242{
227 GObject *ob = old_constructor (type, n_construct_properties, construct_properties); 243 GObject *ob = old_constructor (type, n_construct_properties, construct_properties);
228 g_signal_connect_after (ob, "map", G_CALLBACK (show_cb), 0); 244 g_signal_connect_after (ob, "map", G_CALLBACK (map_cb), 0);
229 return ob; 245 return ob;
230} 246}
231 247
232__attribute__ ((constructor)) 248__attribute__ ((constructor))
233static void init () 249static void init ()

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines