Gentoo Websites Logo
Go to: Gentoo Home Documentation Forums Lists Bugs Planet Store Wiki Get Gentoo!
View | Details | Raw Unified | Return to bug 39376
Collapse All | Expand All

(-)gtk+-2.2.4/gtk/gtkfilesel.c.old (-60 / +2029 lines)
Lines 41-48 Link Here
41
#ifdef HAVE_PWD_H
41
#ifdef HAVE_PWD_H
42
#include <pwd.h>
42
#include <pwd.h>
43
#endif
43
#endif
44
#include <time.h>
45
#include <ctype.h>
44
46
45
#include <glib.h>		/* Include early to get G_OS_WIN32 etc */
47
#include <glib.h>		/* Include early to get G_OS_WIN32 etc */
48
#include <gmodule.h>
46
49
47
#if defined(G_PLATFORM_WIN32)
50
#if defined(G_PLATFORM_WIN32)
48
#include <ctype.h>
51
#include <ctype.h>
Lines 55-62 Link Here
55
#endif
58
#endif
56
59
57
#include "gdk/gdkkeysyms.h"
60
#include "gdk/gdkkeysyms.h"
61
#include "gdk/x11/gdkx.h"
58
#include "gtkbutton.h"
62
#include "gtkbutton.h"
59
#include "gtkcellrenderertext.h"
63
#include "gtkcellrenderertext.h"
64
#include "gtkcellrendererpixbuf.h"
60
#include "gtkentry.h"
65
#include "gtkentry.h"
61
#include "gtkfilesel.h"
66
#include "gtkfilesel.h"
62
#include "gtkhbox.h"
67
#include "gtkhbox.h"
Lines 78-83 Link Here
78
#include "gtkmessagedialog.h"
83
#include "gtkmessagedialog.h"
79
#include "gtkdnd.h"
84
#include "gtkdnd.h"
80
#include "gtkeventbox.h"
85
#include "gtkeventbox.h"
86
#include "gtktoolbar.h"
87
#include "gtkimage.h"
88
#include "gtktogglebutton.h"
89
#include "gtkarrow.h"
90
#include "gtkbin.h"
91
#undef GTK_DISABLE_DEPRECATED
92
#  include "gtklist.h"
93
#  include "gtkcombo.h"
94
#define GTK_DISABLE_DEPRECATED
81
95
82
#define WANT_HPANED 1
96
#define WANT_HPANED 1
83
#include "gtkhpaned.h"
97
#include "gtkhpaned.h"
Lines 95-101 Link Here
95
#include <sys/cygwin.h>		/* For cygwin_conv_to_posix_path */
109
#include <sys/cygwin.h>		/* For cygwin_conv_to_posix_path */
96
#endif
110
#endif
97
111
98
#define DIR_LIST_WIDTH   180
112
#define DIR_LIST_WIDTH   150
99
#define DIR_LIST_HEIGHT  180
113
#define DIR_LIST_HEIGHT  180
100
#define FILE_LIST_WIDTH  180
114
#define FILE_LIST_WIDTH  180
101
#define FILE_LIST_HEIGHT 180
115
#define FILE_LIST_HEIGHT 180
Lines 232-237 Link Here
232
  GList* directory_sent_storage;
246
  GList* directory_sent_storage;
233
247
234
  struct _CompletionUserDir *user_directories;
248
  struct _CompletionUserDir *user_directories;
249
250
  GtkEntry *filter_entry;
235
};
251
};
236
252
237
enum {
253
enum {
Lines 246-252 Link Here
246
};
262
};
247
263
248
enum {
264
enum {
249
  FILE_COLUMN
265
  FILE_COLUMN,
266
  ICON_COLUMN,
267
  TYPE_COLUMN,
268
  SIZE_COLUMN,
269
  SIZE_DATA_COLUMN,
270
  DATE_COLUMN,
271
  DATE_DATA_COLUMN
250
};
272
};
251
273
252
/* File completion functions which would be external, were they used
274
/* File completion functions which would be external, were they used
Lines 393-398 Link Here
393
					      gpointer               user_data);
415
					      gpointer               user_data);
394
static void gtk_file_selection_update_fileops (GtkFileSelection     *filesel);
416
static void gtk_file_selection_update_fileops (GtkFileSelection     *filesel);
395
417
418
static void filter_chosen_callback           (GtkWidget         *w,
419
					      gpointer          user_data);
420
static void filter_chosen_selected_callback (GtkWidget *w,
421
					     GtkBin *item);
396
static void gtk_file_selection_file_activate (GtkTreeView       *tree_view,
422
static void gtk_file_selection_file_activate (GtkTreeView       *tree_view,
397
					      GtkTreePath       *path,
423
					      GtkTreePath       *path,
398
					      GtkTreeViewColumn *column,
424
					      GtkTreeViewColumn *column,
Lines 413-424 Link Here
413
static void gtk_file_selection_update_history_menu (GtkFileSelection       *fs,
439
static void gtk_file_selection_update_history_menu (GtkFileSelection       *fs,
414
						    gchar                  *current_dir);
440
						    gchar                  *current_dir);
415
441
442
static void gtk_file_selection_back (GtkWidget *widget, gpointer data);
443
static void gtk_file_selection_up (GtkWidget *widget, gpointer data);
444
static void gtk_file_selection_refresh (GtkWidget *widget, gpointer data);
445
static void gtk_file_selection_home (GtkWidget *widget, gpointer data);
446
static void gtk_file_selection_desktop (GtkWidget *widget, gpointer data);
447
static void gtk_file_selection_launch_terminal (GtkWidget *widget, GtkFileSelection *fs);
448
static void gtk_file_selection_launch_fm (GtkWidget *widget, GtkFileSelection *fs);
416
static void gtk_file_selection_create_dir  (GtkWidget *widget, gpointer data);
449
static void gtk_file_selection_create_dir  (GtkWidget *widget, gpointer data);
417
static void gtk_file_selection_delete_file (GtkWidget *widget, gpointer data);
450
static void gtk_file_selection_delete_file (GtkWidget *widget, gpointer data);
418
static void gtk_file_selection_rename_file (GtkWidget *widget, gpointer data);
451
static void gtk_file_selection_rename_file (GtkWidget *widget, gpointer data);
419
452
420
static void free_selected_names (GPtrArray *names);
453
static void free_selected_names (GPtrArray *names);
421
454
455
static void reload_bookmarks (GtkWidget *bookmarks_button, GtkWidget *fs);
456
457
static gboolean simple_mode = FALSE;
458
static gchar *global_last_dir = NULL;
459
extern gboolean _gtk_fnmatch_show_hidden;
460
461
462
#define GNOME_VFS_FILE_INFO_GET_MIME_TYPE (1 << 0)
463
#define GNOME_VFS_FILE_INFO_FORCE_FAST_MIME_TYPE (1 << 1)
464
typedef struct _GnomeVFSFileInfo GnomeVFSFileInfo;
465
static GModule *gnome_mod = NULL;
466
static gboolean vfs_initialized = FALSE;
467
static GnomeVFSFileInfo* (*gnome_vfs_file_info_new) (void);
468
static gint (*gnome_vfs_get_file_info) (const gchar *text_uri, GnomeVFSFileInfo *info, gint options);
469
static const char* (*gnome_vfs_file_info_get_mime_type) (GnomeVFSFileInfo *info);
470
static const char* (*gnome_vfs_mime_get_description) (const gchar *mime_type);
471
static const char* (*gnome_vfs_mime_get_icon) (const gchar *mime_type);
472
static void (*gnome_vfs_file_info_unref) (GnomeVFSFileInfo *info);
473
474
static gboolean icon_theme_initialized = FALSE;
475
typedef struct _GnomeIconTheme GnomeIconTheme;
476
static GnomeIconTheme* (*gnome_icon_theme_new) (void);
477
static char* (*gnome_icon_theme_lookup_icon) (GnomeIconTheme *theme, const char *icon_name,
478
					      int size, gpointer icon_data, int *base_size);
479
static void (*gnome_icon_theme_append_search_path) (GnomeIconTheme *theme, const char *path);
480
static GSList *icon_theme_paths = NULL;
481
482
#define GNOME_FILE_DOMAIN_PIXMAP 4
483
typedef struct _GnomeProgram GnomeProgram;
484
static GnomeProgram* (*gnome_program_get) (void);
485
static gchar* (*gnome_program_locate_file) (GnomeProgram *program, gint domain, const gchar *filename,
486
					    gboolean only_if_exists, GSList **ret_locations);
487
488
typedef struct _GConfClient GConfClient;
489
typedef struct _GConfEntry GConfEntry;
490
#define GCONF_CLIENT_PRELOAD_NONE 0
491
typedef void (*GConfClientNotifyFunc) (GConfClient* client,
492
				       guint cnxn_id,
493
				       GConfEntry *entry,
494
				       gpointer user_data);
495
static gboolean gconf_initialized = FALSE;
496
static gchar *gconf_hidden_key = NULL;
497
static GConfClient* (*gconf_client_get_default) (void);
498
static gboolean (*gconf_client_dir_exists) (GConfClient* client,
499
					    const gchar* dir, GError** err);
500
static gboolean (*gconf_client_get_bool) (GConfClient* client, const gchar* key, GError** err);
501
static void (*gconf_client_add_dir) (GConfClient* client,
502
				     const gchar* dir,
503
				     gint preload,
504
				     GError** err);
505
static guint (*gconf_client_notify_add) (GConfClient* client,
506
					 const gchar* namespace_section,
507
					 GConfClientNotifyFunc func,
508
					 gpointer user_data,
509
					 GFreeFunc destroy_notify,
510
					 GError** err);
511
static void (*gconf_client_notify_remove) (GConfClient* client, guint cnxn);
512
513
static gboolean sn_launch_app (const gchar *name, const gchar *description,
514
			       const gchar *icon, gchar **argv);
515
516
517
static const guint8 new_folder_icon[] = 
518
{ ""
519
  /* Pixbuf magic (0x47646b50) */
520
  "GdkP"
521
  /* length: header (24) + pixel_data (1622) */
522
  "\0\0\6n"
523
  /* pixdata_type (0x2010002) */
524
  "\2\1\0\2"
525
  /* rowstride (96) */
526
  "\0\0\0`"
527
  /* width (24) */
528
  "\0\0\0\30"
529
  /* height (24) */
530
  "\0\0\0\30"
531
  /* pixel_data: */
532
  "\251\0\0\0\0\3\0\0\0!\0\0\0\377\0\0\0T\206\0\0\0\0\1\16\16\16Y\207\0"
533
  "\0\0\377\2\0\0\0O\6\7\6\3\203\0\0\0\0\10\11\10\0P\7\7\0p\0\0\0\377\310"
534
  "\305\0\363\0\0\0\377\11\11\0=\35\34\0\214\0\0\0\13\203\0\0\0\0\1\0\0"
535
  "\0\377\206\216\222|\377\3fiX\377\0\0\0\377\1\2\1J\203\0\0\0\0\10\7\7"
536
  "\0p\0\0\0\377\266\261\0\377\367\363\0\377\306\303\0\377\0\0\0\3771.\0"
537
  "\277\0\0\0\20\203\0\0\0\0\11\0\0\0\377\241\244\214\377\204\207o\377\204"
538
  "\206n\377\203\205m\377\202\204m\377\200\204l\377\205\210u\377gh[\377"
539
  "\205\0\0\0\377\1\266\261\0\377\202\373\367\0\377\5\372\366\0\377\332"
540
  "\326\0\377\0\0\0\377\0\0\0p\0\0\0\6\202\0\0\0\0\11\0\0\0\377\216\222"
541
  "|\377twa\377swa\377sv`\377ru`\377qs_\377or]\377rrb\377\203ruc\377\3\0"
542
  "\0\0\377\310\304\1\377\367\363\0\377\203\373\367\0\377\4\370\364\0\377"
543
  "\307\305\2\377\0\0\0\377\0\0\0D\202\0\0\0\0\2\0\0\0\377\216\222|\377"
544
  "\202hjW\377\202giV\377\1VXH\377\207\0\0\0\377\1\307\304\0\377\202\373"
545
  "\367\0\377\5\371\365\0\377\340\334\0\377\36\35\0\377\0\0\0\377\0\0\0"
546
  "\16\202\0\0\0\0\2\0\0\0\377\216\222|\377\202]`N\377\202\\_M\377\17\0"
547
  "\0\0\377\242\243\233\377\330\331\314\377\326\327\312\377\322\324\307"
548
  "\377\321\323\306\377\320\321\304\377\225\225\210\377\0\0\0\377\330\324"
549
  "\0\377\355\351\0\377\337\333\0\377\0\0\0\37700\30\377\0\0\0\377\203\0"
550
  "\0\0\0\206\0\0\0\377\2\247\250\241\377\333\334\317\377\205\303\305\261"
551
  "\377\10ghO\377cc\"\377\0\0\0\377\310\305\3\377\0\0\0\377\77A\"\37741"
552
  "\2\377\0\0\0\377\203\0\0\0\0\11\0\0\0\377\320\321\304\377\331\332\316"
553
  "\377\331\331\315\377\327\330\314\377\327\327\312\377\326\327\311\377"
554
  "\276\300\254\377\276\301\254\377\202\276\301\255\377\12\276\300\254\377"
555
  "\277\301\255\377\266\267\245\377\257\260\236\377\233\235\215\377\0\0"
556
  "\0\377LN<\377\272\273\247\377\203\205o\377\0\0\0\377\203\0\0\0\0\4\0"
557
  "\0\0\377\327\330\314\377\272\274\250\377\273\274\250\377\205\272\274"
558
  "\250\377\2\273\274\251\377\272\274\251\377\205\272\274\250\377\5\220"
559
  "\221\201\377\272\274\251\377\272\274\250\377\217\221\177\377\0\0\0\377"
560
  "\203\0\0\0\0\6\0\0\0\377\327\330\314\377\265\267\244\377\266\267\245"
561
  "\377\266\270\244\377\265\267\244\377\202\266\270\244\377\2\265\267\244"
562
  "\377\266\267\244\377\202\266\270\244\377\203\266\267\244\377\6\266\270"
563
  "\244\377\266\267\244\377\265\270\244\377\266\270\244\377\214\216y\377"
564
  "\0\0\0\377\203\0\0\0\0\2\0\0\0\377\327\330\314\377\203\261\263\240\377"
565
  "\1\262\263\237\377\205\261\263\240\377\5\261\262\240\377\261\263\240"
566
  "\377\262\263\240\377\261\263\240\377\262\262\240\377\203\261\263\240"
567
  "\377\2\203\205u\377\0\0\0\377\203\0\0\0\0\2\0\0\0\377\327\330\314\377"
568
  "\202\255\256\233\377\2\254\256\233\377\255\257\233\377\202\255\256\233"
569
  "\377\1\254\256\234\377\202\255\256\234\377\204\255\256\233\377\6\255"
570
  "\256\234\377\255\256\233\377\255\256\234\377\254\257\234\377\177\201"
571
  "r\377\0\0\0\377\202\0\0\0\0\5\0\0\0\1\0\0\0\377\327\330\314\377\250\252"
572
  "\227\377\251\252\227\377\210\250\252\227\377\3\250\251\227\377\250\252"
573
  "\230\377\251\252\227\377\202\250\252\227\377\4\251\252\227\377\250\252"
574
  "\227\377|~o\377\0\0\0\377\202\0\0\0\1\3\0\0\0\5\0\0\0\377\327\330\314"
575
  "\377\202\244\245\222\377\202\243\245\223\377\202\244\245\223\377\4\244"
576
  "\245\222\377\244\245\223\377\244\246\223\377\244\245\222\377\202\243"
577
  "\245\223\377\2\244\245\222\377\244\245\223\377\202\243\245\223\377\10"
578
  "\244\246\223\377{}m\377\0\0\0\377\0\0\0\6\0\0\0\5\0\0\0\21\0\0\0\377"
579
  "\327\330\314\377\202\237\240\216\377\202\240\241\217\377\4\237\240\217"
580
  "\377\237\241\216\377\237\240\216\377\237\241\217\377\202\237\241\216"
581
  "\377\202\240\241\216\377\202\237\241\217\377\14\240\241\217\377\237\241"
582
  "\216\377\240\241\217\377yzl\377\0\0\0\377\0\0\0\21\0\0\0\10\0\0\0\33"
583
  "\0\0\0\377\327\330\314\377\233\234\212\377\232\234\212\377\204\233\234"
584
  "\212\377\2\233\235\213\377\233\234\212\377\203\232\234\212\377\202\233"
585
  "\234\212\377\20\233\234\213\377\233\234\212\377\232\234\212\377\233\234"
586
  "\212\377wxj\377\0\0\0\377\0\0\0\31\0\0\0\12\0\0\0/\0\0\0\377\327\330"
587
  "\314\377\227\227\206\377\227\230\206\377\226\227\206\377\227\230\206"
588
  "\377\226\227\206\377\204\227\230\206\377\3\226\230\206\377\226\227\206"
589
  "\377\227\227\206\377\205\226\230\206\377\10yzl\377\0\0\0\377\0\0\0-\0"
590
  "\0\0\10\0\0\0""1\0\0\0\377\327\330\314\377\224\226\201\377\202\224\225"
591
  "\202\377\1\222\223\202\377\202\222\223\201\377\3\221\223\201\377\222"
592
  "\223\201\377\221\223\201\377\203\222\223\201\377\15\222\223\202\377\222"
593
  "\223\201\377\222\223\202\377\222\224\201\377\222\223\201\377wxj\377\0"
594
  "\0\0\377\0\0\0""0\0\0\0\4\0\0\0*\0\0\0\377\327\330\314\377\222\222|\377"
595
  "\202\222\223|\377\5\215\216~\377\215\216}\377\216\217~\377\215\217}\377"
596
  "\216\217}\377\202\215\217}\377\4\215\217~\377\215\216}\377\215\217~\377"
597
  "\216\216}\377\202\216\217}\377\34\215\216}\377vxi\377\0\0\0\377\0\0\0"
598
  "*\0\0\0\1\0\0\0\4\0\0\0\377\231\233\211\377\222\226|\377\221\224{\377"
599
  "\216\221x\377\210\212y\377\206\210w\377\205\206u\377\202\203s\377\200"
600
  "\201r\377}\177o\377|~o\377z|m\377y{l\377xyk\377vxi\377uwi\377uwh\377"
601
  "vxi\377^`T\377\0\0\0\377\0\0\0\37\202\0\0\0\0\1\0\0\0\214\223\0\0\0\377"
602
  "\2\0\0\0\204\0\0\0\16\202\0\0\0\0\5\0\0\0\12\0\0\0\15\0\0\0\23\0\0\0"
603
  "\24\0\0\0\25\203\0\0\0\26\1\0\0\0\27\207\0\0\0\30\202\0\0\0\31\4\0\0"
604
  "\0\26\0\0\0\22\0\0\0\13\0\0\0\6"};
605
606
#ifdef __SUNPRO_C
607
#pragma align 4 (desktop_icon)
608
#endif
609
#ifdef __GNUC__
610
static const guint8 desktop_icon[] __attribute__ ((__aligned__ (4))) =
611
#else
612
static const guint8 desktop_icon[] =
613
#endif
614
{ ""
615
  /* Pixbuf magic (0x47646b50) */
616
  "GdkP"
617
  /* length: header (24) + pixel_data (1571) */
618
  "\0\0\6;"
619
  /* pixdata_type (0x2010002) */
620
  "\2\1\0\2"
621
  /* rowstride (96) */
622
  "\0\0\0`"
623
  /* width (24) */
624
  "\0\0\0\30"
625
  /* height (24) */
626
  "\0\0\0\30"
627
  /* pixel_data: */
628
  "\311\0\0\0\0\26\300\262\235\33\334\323\304\321\312\275\243\377\276\256"
629
  "\217\377\212\200v\377\230\220\233\377\236\225\242\377\230\217\234\377"
630
  "\223\212\230\377\220\207\225\377\217\205\224\377\215\204\222\377\216"
631
  "\204\223\377\214\202\221\377\212\200\217\377\200v\206\377pee\377\265"
632
  "\260\247\377\354\351\341\377\321\306\257\377xoa\312ZOK\23\202\0\0\0\0"
633
  "\26\302\265\236@\343\334\320\366\263\244\210\377[RH\377;1\77\377UF\\"
634
  "\377VF]\377RCZ\377ZMa\377_Qf\377j^p\377obu\377{o\200\377MBR\377M>T\377"
635
  "O@W\377J;Q\377G=I\377\217\213\212\377\315\301\252\377YQE\355B;66\202"
636
  "\0\0\0\0\17\332\321\301H\306\300\270\376@86\3775*;\377J;R\377O@W\377"
637
  "\206|\214\377\222\216\225\377\253\250\255\377\303\300\305\377\333\331"
638
  "\334\377\346\344\346\377\366\365\366\377PPQ\3772'7\377\202L<T\377\5J"
639
  ":R\3774)9\377\204|r\377LF:\376)%\37H\202\0\0\0\0\17\231\225\221IUOU\377"
640
  "@2F\377I:Q\377RCY\377\251\242\255\377\373\373\373\377\205\205\205\377"
641
  "\274\274\274\377\301\301\301\377\255\255\255\377\315\315\315\377\371"
642
  "\371\371\377yyy\377,#0\377\203L<T\377\4J;R\377E9E\377#\36\37\377\22\17"
643
  "\22I\202\0\0\0\0\17\263\256\266\213l`r\377E6L\377G8N\377i]n\377\220\220"
644
  "\220\377ddd\377eee\377\206\206\206\377\210\210\210\377\255\255\255\377"
645
  "\340\340\340\377\371\371\371\377\200\200\200\377)\40-\377\202L<T\377"
646
  "\1K;S\377\202L<T\377\2+\"0\377)!.y\202\0\0\0\0\2\262\253\265\267dWk\377"
647
  "\202L<T\377\16h\\n\377\250\250\250\377\255\255\255\377\230\230\230\377"
648
  "\211\211\211\377~~~\377\262\262\262\377\307\307\307\377\374\374\374\377"
649
  "\244\244\244\377\35\27\40\377L<T\377K;S\377K<S\377\202L<T\377\2=0C\377"
650
  "3)9\244\202\0\0\0\0\2\254\244\260\320[Lb\377\202L<T\377\15tiz\377\274"
651
  "\274\274\377~~~\377\240\240\240\377\310\310\310\377\277\277\277\377\351"
652
  "\351\351\377\346\346\346\377\374\374\374\377\270\270\270\377\30\23\24"
653
  "\377\244\202\\\377lTT\377\202L<T\377kK;S\377\77""2G\3772'8\310\0\0\0"
654
  "\0\255\246\262\14\240\230\244\337QAX\377L<T\377I:Q\377xm~\377\330\330"
655
  "\330\377\263\263\263\377\240\240\240\377\260\260\260\377\245\245\245"
656
  "\377\206\206\206\377\230\230\230\377\364\364\364\377\351\344\333\377"
657
  "\246\204C\377\352\265Y\377\260r*\377T\77K\377G7N\377H8P\377A3I\3773)"
658
  "9\3356+=\10\264\255\267>\217\205\224\357L<T\377J:R\377K;S\377|q\202\377"
659
  "\354\354\354\377\340\340\340\377\316\316\316\377\347\347\347\377\354"
660
  "\354\354\377\371\371\371\377\325\325\325\377\376\366\346\377\373\325"
661
  "\211\377\342\252I\377\312v\13\377\273i\5\377O4.\3775*;\377>0D\377@2G"
662
  "\3774)9\3534)91\263\255\265Y~tu\370A3E\377J;R\377L<T\377~r\203\377\371"
663
  "\371\371\377\251\251\251\377\334\334\334\377\257\257\257\377\245\245"
664
  "\245\377\252\252\252\377\230\216x\377\370\315|\377\354\260R\377\315w"
665
  "\10\377\262`\2\377w3\5\3777\40\"\377$\34(\377)\40-\377:0:\377XMM\365"
666
  ".$2Q\276\266\264k\310\277\263\376XNJ\3777+<\377K;S\377~s\204\377\375"
667
  "\375\375\377\341\341\341\377\366\366\366\377\372\372\372\377\374\373"
668
  "\373\377\377\360\325\377\360\305q\377\345\245C\377\315x\12\377\243U\0"
669
  "\377f&\2\377<\34\25\377\37\27\37\377\32\24\34\3776/0\377\232\221\206"
670
  "\377\224\210z\375)!.i\325\320\316\242\351\344\333\377\306\274\252\377"
671
  "C<:\377+\"0\377k_q\377\304\302\305\377\202\326\326\326\377R\327\326\325"
672
  "\377\357\334\271\377\362\303l\377\334\222*\377\302m\3\377\221G\5\377"
673
  "R\33\1\377#\22\20\377\26\21\31\377\22\16\24\37771/\377\326\321\310\377"
674
  "\325\313\271\377\231\213x\377-#2\226\326\321\317\316\336\326\307\377"
675
  "\307\273\245\377\261\243\212\377@94\377-%2\3772*7\377\25\24\25\377\32"
676
  "\30\26\377\204l>\377\337\253Q\377\307{\24\377\267c\1\377t0\1\377D\31"
677
  "\5\377\21\11\11\377\17\13\20\377\23\17\24\377FA=\377\311\304\273\377"
678
  "\346\340\327\377\306\271\243\377\221\203s\3776,7\275\253\243\230\371"
679
  "rlb\377^WL\377WND\377E=9\377#\34$\377'\36+\377+#(\377\226wC\377\330\236"
680
  "B\377\310x\17\377\247X\2\377h'\1\377/\22\6\377\14\7\10\377\11\7\12\377"
681
  "\24\17\26\377#\35#\377XON\377\207|t\377\203ys\377\201ul\377PEF\377%\36"
682
  "'\350f_Yd(#%d\26\22\31d\33\26\37d+#,d'\40+d)#-h\232\225h\306\337\247"
683
  "F\377\306r\10\377\232J\0\371]\40\1\366\31\10\1\362\2\1\2\354\3\2\3\310"
684
  "\11\7\12\231\26\21\31y\40\32$i%\36*d\203&\37+d\2!\32%d\26\21\31d\206"
685
  "\0\0\0\0\13\312\324\2447\334\332\257\363eS'\377p6\2\373E\26\0\356\11"
686
  "\3\0\343\0\0\0\312\0\0\0\206\0\0\0D\0\0\0\35\0\0\0\6\215\0\0\0\0\12r"
687
  "rW\245MH7\374\14\13\2\324\40\17\0\311\5\2\0\306\0\0\0\242\0\0\0W\0\0"
688
  "\0(\0\0\0\17\0\0\0\3\216\0\0\0\0\11\27\27\21""1\7\6\2E\10\7\1X\0\0\0"
689
  "\177\0\0\0f\0\0\0""7\0\0\0\24\0\0\0\5\0\0\0\1\220\0\0\0\0\5\0\0\0\1\0"
690
  "\0\0\24\0\0\0\25\0\0\0\14\0\0\0\4\274\0\0\0\0"};
691
692
static const guint8 terminal_icon[] = 
693
{ ""
694
  /* Pixbuf magic (0x47646b50) */
695
  "GdkP"
696
  /* length: header (24) + pixel_data (1990) */
697
  "\0\0\7\336"
698
  /* pixdata_type (0x2010002) */
699
  "\2\1\0\2"
700
  /* rowstride (96) */
701
  "\0\0\0`"
702
  /* width (24) */
703
  "\0\0\0\30"
704
  /* height (24) */
705
  "\0\0\0\30"
706
  /* pixel_data: */
707
  "\231\0\0\0\0\3\0\0\0\2\0\0\0\4\0\0\0\5\220\0\0\0\6\12\0\0\0\5\0\0\0\4"
708
  "\0\0\0\2\0\0\0\0\0\0\0\2B@A\304\201\202\201\377|||\377{||\377|{{\377"
709
  "\203|}}\377\25{|z\377yyx\377xxw\377wxv\377wvu\377qrp\377mli\377jig\377"
710
  "ged\377cca\377_^\\\377ec^\377'&$\312\0\0\0\17\0\0\0\3\0\0\0\4\204\203"
711
  "\203\377\366\363\351\377\365\361\350\377\376\374\362\377\377\377\367"
712
  "\377\202\377\377\370\377\13\377\377\367\377\377\376\366\377\377\374\364"
713
  "\377\376\370\357\377\371\364\352\377\363\356\344\377\357\351\337\377"
714
  "\345\340\327\377\335\327\315\377\324\315\304\377\310\303\270\377\202"
715
  "\270\263\251\377\13\77\77:\377\0\0\0%\0\0\0\10\0\0\0\6||{\377\364\360"
716
  "\346\377\202\200z\377EDA\377HEC\377FCA\377EC@\377\203EB@\377\177EC@\377"
717
  "DC\77\377DB\77\377C@=\377A>;\377<;8\377;95\37720/\377qng\377\253\247"
718
  "\235\377751\377\0\0\0""5\0\0\0\13\0\0\0\6||}\377\373\367\355\377DB\77"
719
  "\377HMI\377qwr\377sxt\377y}y\377tyu\377mrn\377bic\377Y^Z\377KQL\377B"
720
  "FC\377>B\77\3779=:\377061\377',(\377\22\30\24\377UTO\377\250\242\230"
721
  "\37744/\377\0\0\0:\0\0\0\15\0\0\0\6zzy\377\367\363\353\377CA>\377puq"
722
  "\377\264\267\264\377\257\260\257\377\243\246\243\377\223\230\223\377"
723
  "\204\210\204\377qwq\377_d_\377SWS\377PVP\377LQL\377HMH\377<A<\377040"
724
  "\377\33\37\34\377WSN\377\240\233\220\37711-\377\0\0\0;\0\0\0\16\0\0\0"
725
  "\6{zz\377\361\354\342\377>=:\377svs\377\244\247\244\377\223\225\223\377"
726
  "\211\215\211\377\201\206\201\377sxs\377glg\377bhb\377`f`\377\\a\\\377"
727
  "V\\V\377PVP\377CHC\3776<6\377\37$\40\377TPK\377\226\223\210\377..*\377"
728
  "\0\0\0<\0\0\0\16\0\0\0\6yyy\377\350\344\332\377>;8\377kpl\377\214\216"
729
  "\214\377}\202}\377x\177x\377v~v\377x~x\377t{t\377pxp\377msm\377glg\377"
730
  "aga\377W]W\377JMJ\3779>9\377\"&#\377QMG\377\214\211\177\377,+'\377\0"
731
  "\0\0<\0\0\0\16\0\0\0\6rsr\377\337\332\317\377;85\377cgd\377rwr\377lq"
732
  "l\377pvp\377}\203}\377\202\207\202\377\177\206\177\377|\202|\377t|t\377"
733
  "ouo\377hmh\377]b]\377MSM\377=@=\377\177#'$\377NHD\377\203\200u\377)("
734
  "%\377\0\0\0<\0\0\0\16\0\0\0\6qpo\377\324\317\304\377763\377RYS\377X^"
735
  "X\377djd\377t|t\377\200\205\200\377\205\212\205\377\204\212\204\377\201"
736
  "\211\201\377{\201{\377u{u\377lrl\377_e_\377OTO\377<@<\377\"'#\377JGA"
737
  "\377|vk\377&$\"\377\0\0\0<\0\0\0\16\0\0\0\6onm\377\312\305\271\37763"
738
  "0\377JPK\377\232\236\232\377V]V\377ini\377y\177y\377\202\211\202\377"
739
  "\203\211\203\377\201\207\201\377|\203|\377v|v\377lql\377_e_\377MRM\377"
740
  "<A<\377\"'$\377HD>\377roe\377%#\37\377\0\0\0<\0\0\0\16\0\0\0\6mlk\377"
741
  "\276\267\255\3772/,\377DLE\377\344\345\344\377\376\377\376\377\274\277"
742
  "\274\377{\201{\377y~y\377~\204~\377{\203{\377y\177y\377rxr\377gng\377"
743
  "\\b\\\377KPK\377:>:\377#(%\377GC;\377kf]\377\"!\35\377\0\0\0<\0\0\0\16"
744
  "\0\0\0\6ffc\377\260\254\240\377/,(\377>D\77\377]a]\377\241\244\241\377"
745
  "\377\377\377\377\233\237\233\377ele\377dld\377djd\377cic\377bgb\377\\"
746
  "a\\\377QVQ\377BIB\3777:7\377\"%#\377D@:\377d_V\377\37\36\33\377\0\0\0"
747
  "<\0\0\0\16\0\0\0\6`^]\377\246\240\226\377*(%\377=D>\377\377\377\377\377"
748
  "\215\220\215\377OTO\377RXR\377\206\213\206\377\316\321\316\377\320\322"
749
  "\320\377\220\224\220\377OVO\377JQJ\377AEA\3778=8\377.3.\377\36#\37\377"
750
  "C\77""8\377]XN\377\35\33\30\377\0\0\0<\0\0\0\16\0\0\0\6\177[ZV\377\230"
751
  "\222\206\377#!\36\377.71\377082\3774<6\377BHC\377FKH\377BHC\377;A=\377"
752
  "6>7\3776<7\3776=8\377274\377,1.\377&,(\377\40#\"\377\21\27\24\377>:4"
753
  "\377SPF\377\33\32\26\377\0\0\0<\0\0\0\16\0\0\0\6WUS\377\210\202w\377"
754
  "li`\377WSM\377WUM\377WTN\377UQJ\377TPI\377RNG\377RNE\377OKD\377NIC\377"
755
  "LHA\377KG\77\377JD<\377HD:\377FC:\377C\77""5\377hdU\377RNC\377\33\33"
756
  "\27\377\0\0\0<\0\0\0\16\0\0\0\6RQO\377yti\377vrf\377yui\377zsi\377ws"
757
  "i\377vqg\377qlb\377oi^\377ieY\377c_U\377_\\P\377\\YM\377XVJ\377VRF\377"
758
  "RND\377TQG\377eaX\377MJ@\377QNC\377\33\33\27\377\0\0\0<\0\0\0\16\0\0"
759
  "\0\6RPK\376upd\377pj_\377lh\\\377lg\\\377hdZ\377fbW\377b^R\377_[O\377"
760
  "[WK\377ZUJ\377WRG\377TQE\377RND\377QLB\377MJ\77\377ZVM\377A<3\377HF;"
761
  "\377URF\377\"!\34\377\0\0\0""9\0\0\0\15\0\0\0\5!\40\36\316!\37\33\377"
762
  "omg\375ljc\377qoh\377vsm\377xvo\377zwq\377xvn\377tpk\377qnh\377kid\377"
763
  "jfa\377eb]\377a_W\377\\ZT\377[YR\377\\[T\377UQK\376\31\31\25\377\21\20"
764
  "\16\336\0\0\0/\0\0\0\12\0\0\0\2\0\0\0\24\0\0\0s/.,\372#\"\35\377)'$\377"
765
  "./*\377642\377\26""896\377763\377541\37732/\37710-\377,-(\377)(%\377"
766
  "$\"\37\377\40\40\33\377\37\36\31\377\40\36\32\377\34\33\27\374\0\0\0"
767
  "\221\0\0\0>\0\0\0\31\0\0\0\5\0\0\0\1\0\0\0\6\0\0\0\25\0\0\0.\0\0\0B\0"
768
  "\0\0J\203\0\0\0K\207\0\0\0L\202\0\0\0K\6\0\0\0J\0\0\0C\0\0\0/\0\0\0\26"
769
  "\0\0\0\6\0\0\0\1\202\0\0\0\0\3\0\0\0\4\0\0\0\12\0\0\0\21\204\0\0\0\24"
770
  "\207\0\0\0\25\203\0\0\0\24\4\0\0\0\21\0\0\0\12\0\0\0\4\0\0\0\1\205\0"
771
  "\0\0\0\203\0\0\0\1\213\0\0\0\2\202\0\0\0\1\204\0\0\0\0"};
772
773
static const guint8 fm_icon[] = 
774
{ ""
775
  /* Pixbuf magic (0x47646b50) */
776
  "GdkP"
777
  /* length: header (24) + pixel_data (1756) */
778
  "\0\0\6\364"
779
  /* pixdata_type (0x2010002) */
780
  "\2\1\0\2"
781
  /* rowstride (96) */
782
  "\0\0\0`"
783
  /* width (24) */
784
  "\0\0\0\30"
785
  /* height (24) */
786
  "\0\0\0\30"
787
  /* pixel_data: */
788
  "\210\0\0\0\0\1\340\247\2123\204\340\247\212Z\1\340\247\2128\217\0\0\0"
789
  "\0\14\375\274\232\13\366\270\227c\361\265\216\263\355\256s\336\351\253"
790
  "k\377\353\254c\377\354\257l\377\354\263w\377\357\270\201\342\363\273"
791
  "\220\263\367\270\226l\377\303\240\14\212\0\0\0\0\20\376\277\236\13\357"
792
  "\260\213g\352\243t\342\345\231R\377\353\230>\377\356\237D\377\360\251"
793
  "P\377\361\261U\377\364\276`\377\365\305f\377\370\320v\377\370\311f\377"
794
  "\351\231M\377\360\264\202\353\366\303\237g\377\301\241\21\206\0\0\0\0"
795
  "\24\377\304\244\1\357\261\224_\345\242|\310\337\214M\377\342\213@\377"
796
  "\345\220D\377\346\222D\377\344\224F\377\344\231F\377\347\242I\377\361"
797
  "\263V\377\364\276`\377\365\312n\377\366\307d\377\345\201)\377\347\223"
798
  "9\377\362\316\203\377\361\277\226\313\357\261\224h\377\302\241\3\204"
799
  "\0\0\0\0\24\353\256\221Z\325\212c\377\324w9\377\326}A\377\323yE\377\317"
800
  "s\77\377\311e7\377\302_2\377\271g-\377\313x1\377\340\2108\377\345\221"
801
  "9\377\356\250E\377\360\253H\377\331l)\377\335r!\377\356\255R\377\370"
802
  "\330\202\377\346\261~\377\357\263\225h\203\0\0\0\0\26\325\231|c\310|"
803
  "Z\361\300c5\377\277h>\377\267`8\377\257U4\377\254O-\377\254G*\377\255"
804
  "G(\377\254W(\377\265g+\377\315r.\377\331|/\377\345\2167\377\347\222;"
805
  "\377\306P&\377\324b#\377\340\2034\377\367\314d\377\354\242\77\377\355"
806
  "\265\211\363\367\271\233T\202\0\0\0\0\177\314\214o\377\245R1\377\250"
807
  "W6\377\236M0\377\227D*\377\225A)\377\241F-\377\247A+\377\254A'\377\266"
808
  "Q-\377\267].\377\276l/\377\315w1\377\334\2106\377\350\213:\377\324l3"
809
  "\377\311U$\377\331m*\377\353\235@\377\346\204'\377\355\260[\377\360\275"
810
  "\223\265\375\275\235\7\0\0\0\0\316\220t\377\231P6\377\211A*\377\204;"
811
  "'\377\212=&\377\221\77&\377\241I.\377\256L3\377\254D)\377\276[6\377\301"
812
  "i<\377\273p9\377\301q;\377\265j4\377\274c.\377\316m0\377\275Q(\377\310"
813
  "]$\377\333s2\377\337v'\377\353\234F\377\360\310\201\377\372\277\2332"
814
  "\0\0\0\0\324\231}\241\232U@\377u3!\377y7#\377\204<&\377\223C+\377\240"
815
  "L1\377\265^=\377\270V6\377\302d>\377\305pH\377\273oI\377\257gJ\377\234"
816
  "Z\77\377\216I2\377\2058\40\377\2158\"\377\263M&\377\320b-\377\326f%\377"
817
  "\343\215E\377\370\315a\377\363\274\221\263\0\0\0\0\337\246\211A\317\224"
818
  "y\353q5&\377t3!\377|8$\377\222E,\377\241L4\377\254X8\377\262]<\377\257"
819
  "_B\377\266oP\377\277\201_\377\311\212m\377\321\210p\377\273nT\377\211"
820
  "\77%\377}3\35\377\265\\3\377\315k6\377\317^%\377\344\215I\377\354\235"
821
  "5\377\353\243h\371\341\252\214R\0\0\0\0\360\263\224L\260v`\377t6#\377"
822
  "{7#\377\216@(\377\230E.\377\234K1\377\231K2\377\223H2\377\233T>\377\256"
823
  "mT\377\264v]\377\251iN\377\270vX\377\303\203\\\377\325\225^\377\315|"
824
  "L\377\303n>\377\327{G\377\337~A\377\330e\37\377\343\220L\377\340\252"
825
  "\207\300\0\0\0\0\377\304\241\0\360\264\226J\303\210m\353\206D/\377\203"
826
  ";%\377\204=)\377\21\201>,\377~;-\377\207A6\377\257mQ\377\273uK\377\266"
827
  "n@\377\272pG\377\236X1\377\223S7\377\332\233x\377\332\214_\377\314{L"
828
  "\377\336\205Q\377\310Y\"\377\330l1\377\352\237N\377\340\243w\377\203"
829
  "\0\0\0\0\25\375\275\235\77\312\213q\237\226UA\376o2#\377n3#\377i/%\377"
830
  "\250dH\377\306xJ\377\274o>\377\311~D\377\317\177C\377\267f7\377\207C"
831
  "%\377\222X7\377\361\277\200\377\337\220Y\377\324wA\377\322k4\377\350"
832
  "\243p\377\343\217B\377\333\235u\377\205\0\0\0\0\23\362\264\225\201\247"
833
  "nY\320xG8\377yE7\377\305sD\377\245\\1\377\257c1\377\314zD\377\270z\\"
834
  "\377\267{W\377\276}S\377\206M3\377\323\224e\377\336\216[\377\335\215"
835
  "[\377\355\270\212\377\345\232P\377\334z3\377\325\230v\377\206\0\0\0\0"
836
  "\22\360\262\222#\302\220w\330\260y^\377\273h8\377\210H+\377\177\77&\377"
837
  "\301z\\\377\273\203g\377\250xk\377\320\211W\377\266}Y\377\334\222U\377"
838
  "\350\243e\377\340\223Z\377\335\210=\377\330u1\377\343\226`\377\312\223"
839
  "r\377\207\0\0\0\0\21\262\206o7\252v`\377\242P+\377l5#\377M)\37\377\256"
840
  "t]\377h5\40\377{J9\377\320}\77\377\343\251u\377\331\205J\377\323|D\377"
841
  "\331\200B\377\334\202\77\377\361\274\216\377\356\247m\377\265\204h\377"
842
  "\207\0\0\0\0\21\202bQ7\262\202g\377\235Q-\377U)\35\377J*\"\377nJ=\377"
843
  "\257y`\377\263rA\377\344\247f\377\305}Z\377\310h,\377\332\221X\377\330"
844
  "\203P\377\342\231c\377\337\217K\377\352\245v\377\211hW\351\207\0\0\0"
845
  "\0\21T\77""4\34\310\232\201\311\240\\=\377Y(\30\377G$\40\377D\"\33\377"
846
  "c<4\377\211[C\377\204D3\377\250R&\377\264[.\377\271c5\377\307m8\377\314"
847
  "i+\377\332\202A\377\320\240\206\377\207dSZ\210\0\0\0\0\20\230s`u\315"
848
  "\216m\373r;&\377E\40\32\377J'\37\377P&\36\377T\"\32\377{;#\377\204=!"
849
  "\377\272m@\377\301m@\377\312k:\377\332\207Q\377\350\253x\377\240xe\277"
850
  "YB7\17\211\0\0\0\0\16\367\274\234\221\266wU\377X%\31\377U)\37\377b2\37"
851
  "\377^+\37\377\216M)\377\230J)\377\252T.\377\300nA\377\317yE\377\347\233"
852
  "d\377\241x^\377/$\36Z\212\0\0\0\0\16\377\303\241\7\324\233{\251\303\204"
853
  "^\377\215K(\377u5\36\377\207A#\377\222@\40\377\243T0\377\271a5\377\314"
854
  "q=\377\325\215f\377\237t`\310D4+_K8.\1\213\0\0\0\0\13\201`P@\220kW\373"
855
  "\326\222d\377\277h3\377\267e5\377\271],\377\303k:\377\327\214^\377\335"
856
  "\241y\377\240yd\255\250~h\13\216\0\0\0\0\11\\E9\15\215kY~\340\250\212"
857
  "\263\345\253\216\263\355\261\222\263\342\251\214\263\212hW\263\207eU"
858
  ")}]M\6\234\0\0\0\0"};
859
422
#ifndef G_PLATFORM_WIN32
860
#ifndef G_PLATFORM_WIN32
423
861
424
#define compare_utf8_filenames(a, b) strcmp(a, b)
862
#define compare_utf8_filenames(a, b) strcmp(a, b)
Lines 640-645 Link Here
640
    }
1078
    }
641
}
1079
}
642
1080
1081
static gchar *
1082
read_line_from_command (gchar *command)
1083
{
1084
  gchar *argv[] = { "/bin/sh", "-c", command, NULL };
1085
  gint output, pid;
1086
  GIOChannel *io;
1087
  gchar *data = NULL, *line;
1088
  gsize term;
1089
1090
  if (!g_spawn_async_with_pipes (NULL, argv, NULL,
1091
  		G_SPAWN_SEARCH_PATH | G_SPAWN_STDERR_TO_DEV_NULL,
1092
  		NULL, NULL, &pid, NULL, &output, NULL, NULL))
1093
      return g_strdup ("");
1094
1095
  io = g_io_channel_unix_new (output);
1096
  g_io_channel_set_close_on_unref (io, TRUE);
1097
  g_io_channel_read_line (io, &data, NULL, &term, NULL);
1098
  g_io_channel_unref (io);
1099
1100
  if (!data) return NULL;
1101
  line = g_strndup (data, term);
1102
  g_free (data);
1103
  return line;
1104
}
1105
1106
static void
1107
notify_show_hidden (GConfClient *client, guint cnxn_id, GConfEntry *entry, gpointer fs)
1108
{
1109
  _gtk_fnmatch_show_hidden = gconf_client_get_bool (gconf_client_get_default (),
1110
			gconf_hidden_key, NULL);
1111
  gtk_file_selection_refresh (NULL, GTK_FILE_SELECTION (fs));
1112
}
1113
1114
static void
1115
widget_force_hide (GtkWidget *widget)
1116
{
1117
  g_signal_stop_emission_by_name (widget, "show");
1118
  gtk_widget_hide (widget);
1119
}
1120
1121
static void bookmarks_popup_pos (GtkMenu *menu, gint *x, gint *y, gboolean push_in, GtkWidget *button);
1122
1123
static gboolean
1124
handle_key_presses (GtkFileSelection *fs, GdkEventKey *event)
1125
{
1126
  if ((event->state & GDK_CONTROL_MASK) && event->keyval == GDK_l)
1127
    {
1128
      GtkCombo *combo;
1129
1130
      combo = (GtkCombo *) g_object_get_data (G_OBJECT (fs), "__combo");
1131
      gtk_widget_grab_focus (combo->entry);
1132
    }
1133
  else if ((event->state & GDK_MOD1_MASK) && event->keyval == GDK_Left)
1134
      gtk_file_selection_back (NULL, fs);
1135
  else if ((event->state & GDK_MOD1_MASK) && event->keyval == GDK_Up)
1136
      gtk_file_selection_up (NULL, fs);
1137
  else if ((event->state & GDK_CONTROL_MASK) && event->keyval == GDK_r)
1138
      gtk_file_selection_refresh (NULL, fs);
1139
  else if ((event->state & GDK_MOD1_MASK) && event->keyval == GDK_Home)
1140
      gtk_file_selection_home (NULL, fs);
1141
  else if ((event->state & GDK_MOD1_MASK) && event->keyval == GDK_b)
1142
    {
1143
      GtkWidget *button, *menu;
1144
1145
      button = (GtkWidget *) g_object_get_data (G_OBJECT (fs), "__bookmarks_button");
1146
      menu = (GtkWidget *) g_object_get_data (G_OBJECT (fs), "__bookmarks");
1147
1148
      g_object_set (button, "active", TRUE, NULL);
1149
      gtk_menu_popup (GTK_MENU (menu), NULL, NULL,
1150
		      (GtkMenuPositionFunc) bookmarks_popup_pos, button,
1151
		      1, event->time);
1152
    }
1153
  else if ((event->state & GDK_CONTROL_MASK) && (event->state & GDK_SHIFT_MASK) && event->keyval == GDK_N)
1154
      gtk_file_selection_create_dir (NULL, fs);
1155
  else if ((event->state & GDK_CONTROL_MASK) && event->keyval == GDK_t)
1156
      gtk_file_selection_launch_terminal (NULL, fs);
1157
  else if ((event->state & GDK_CONTROL_MASK) && event->keyval == GDK_f)
1158
      gtk_file_selection_launch_fm (NULL, fs);
1159
  else
1160
      return FALSE;
1161
1162
  return TRUE;
1163
}
1164
1165
static void
1166
history_combo_activate (GtkEntry *entry, GtkFileSelection *fs)
1167
{
1168
  gchar *dir;
1169
  gint len;
1170
1171
  if (GPOINTER_TO_INT (g_object_get_data (G_OBJECT (entry), "__busy")))
1172
    return;
1173
  g_object_set_data (G_OBJECT (entry), "__busy", GINT_TO_POINTER (TRUE));
1174
1175
  dir = (gchar *) gtk_entry_get_text (entry);
1176
  if (dir[strlen (dir) - 1] != G_DIR_SEPARATOR)
1177
      dir = g_strdup_printf ("%s%c", dir, G_DIR_SEPARATOR);
1178
  else
1179
      dir = g_strdup (dir);
1180
  gtk_file_selection_populate (fs, dir, FALSE, FALSE);
1181
1182
  g_free (dir);
1183
  dir = (gchar *) gtk_entry_get_text (entry);
1184
  len = strlen (dir);
1185
  if (len > 1 && dir[len - 1] == G_DIR_SEPARATOR)
1186
    {
1187
      dir = g_strndup (dir, len - 1);
1188
      gtk_entry_set_text (entry, dir);
1189
    }
1190
1191
  if ((gpointer) gtk_window_get_focus (GTK_WINDOW (fs)) == (gpointer) entry)
1192
      gtk_widget_grab_focus (fs->selection_entry);
1193
  g_object_set_data (G_OBJECT (entry), "__busy", GINT_TO_POINTER (FALSE));
1194
}
1195
1196
static void
1197
history_combo_selected (GtkList *list, GtkBin *item, GtkFileSelection *fs)
1198
{
1199
  GtkCombo *combo;
1200
  GList *nav_history;
1201
  const gchar *current, *entry, *selected;
1202
1203
  if (!GTK_WIDGET_HAS_FOCUS (item))
1204
      return;
1205
1206
  nav_history = (GList *) g_object_get_data (G_OBJECT (fs), "__nav_history");
1207
  if (!nav_history) return;
1208
  current = (const gchar *) g_list_last (nav_history)->data;
1209
1210
  combo = GTK_COMBO (g_object_get_data (G_OBJECT (fs), "__combo"));
1211
  entry = gtk_entry_get_text (GTK_ENTRY (combo->entry));
1212
  selected = gtk_label_get_text (GTK_LABEL (gtk_bin_get_child (item)));
1213
1214
  if (strcmp (entry, selected) == 0 && strcmp (entry, current) != 0)
1215
      history_combo_activate (GTK_ENTRY (combo->entry), fs);
1216
}
1217
643
static gboolean
1218
static gboolean
644
grab_default (GtkWidget *widget)
1219
grab_default (GtkWidget *widget)
645
{
1220
{
Lines 648-708 Link Here
648
}
1223
}
649
     
1224
     
650
static void
1225
static void
1226
popup_deactivate (GtkMenuShell *menu,
1227
		  gpointer button)
1228
{
1229
  g_object_set (button, "active", FALSE, NULL);
1230
}
1231
1232
static void
1233
back_menu_activate (GtkWidget *item,
1234
		    gpointer dp)
1235
{
1236
  GtkWidget *fs;
1237
  GList *nav_history;
1238
  gint i, l, d;
1239
  gchar *dir;
1240
1241
  fs = GTK_WIDGET (g_object_get_data (G_OBJECT (item), "fs"));
1242
  nav_history = g_object_get_data (G_OBJECT (fs), "__nav_history");
1243
  l = (gint) g_list_length (nav_history);
1244
  d = GPOINTER_TO_INT (dp);
1245
  dir = g_strdup_printf ("%s/", (gchar *) g_list_nth_data (nav_history, d));
1246
1247
  for (i = l - 1; i >= d; i--)
1248
    {
1249
      GList *nth = g_list_nth (nav_history, i);
1250
      g_free (nth->data);
1251
      nav_history = g_list_remove_link (nav_history, nth);
1252
    }
1253
  g_object_set_data (G_OBJECT (fs), "__nav_history", nav_history);
1254
  gtk_file_selection_populate (GTK_FILE_SELECTION (fs), dir, FALSE, FALSE);
1255
  g_free (dir);
1256
}
1257
1258
static void
1259
update_nav_history_popup (GtkWidget *fs)
1260
{
1261
  GList *nav_history;
1262
  GtkWidget *back_dropdown;
1263
  GtkWidget *menu;
1264
  guint i, l;
1265
1266
  nav_history = g_object_get_data (G_OBJECT (fs), "__nav_history");
1267
  back_dropdown = g_object_get_data (G_OBJECT (fs), "__back_dropdown");
1268
  menu = g_object_get_data (G_OBJECT (back_dropdown), "menu");
1269
1270
  if (menu) gtk_widget_destroy (menu);
1271
  menu = gtk_menu_new ();
1272
  l = g_list_length (nav_history);
1273
  for (i = l - 1; i > 0; i--)
1274
    {
1275
      GtkWidget *item;
1276
1277
      item = gtk_menu_item_new_with_label ((gchar *) g_list_nth_data (nav_history,
1278
					   i - 1));
1279
      gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
1280
      g_object_set_data (G_OBJECT (item), "fs", fs);
1281
      g_signal_connect (item, "activate", G_CALLBACK (back_menu_activate),
1282
			GINT_TO_POINTER ((gint) (i - 1)));
1283
    }
1284
  gtk_widget_show_all (menu);
1285
  g_object_set_data (G_OBJECT (back_dropdown), "menu", menu);
1286
1287
  g_signal_connect (menu, "deactivate", G_CALLBACK (popup_deactivate),
1288
		    back_dropdown);
1289
}
1290
1291
static void
1292
back_popup_pos (GtkMenu *menu,
1293
		gint *x,
1294
		gint *y,
1295
		gboolean push_in,
1296
		GtkWidget *button)
1297
{
1298
  gdk_window_get_origin (button->window, x, y);
1299
  *x += button->allocation.x;
1300
  *y += button->allocation.y + button->requisition.height - 1;
1301
}
1302
1303
static gboolean
1304
back_menu (GtkWidget *button,
1305
	   GdkEventButton *event,
1306
	   gpointer data)
1307
{
1308
  GtkWidget *menu;
1309
1310
  if (event->button != 1) return FALSE;
1311
  g_object_set (button, "active", TRUE, NULL);
1312
  menu = g_object_get_data (G_OBJECT (button), "menu");
1313
  gtk_menu_popup (GTK_MENU (menu), NULL, NULL,
1314
		  (GtkMenuPositionFunc) back_popup_pos, button,
1315
		  1, event->time);
1316
  return TRUE;
1317
}
1318
1319
static void
1320
bookmarks_item_clicked (GtkWidget *widget,
1321
			gchar *dir)
1322
{
1323
  GtkFileSelection *fs = GTK_FILE_SELECTION (g_object_get_data (G_OBJECT (widget), "fs"));
1324
  gchar *realDir;
1325
1326
  realDir = g_strdup_printf ("%s/", dir);
1327
  gtk_file_selection_populate (fs, realDir, FALSE, FALSE);
1328
  g_free (realDir);
1329
}
1330
1331
static void
1332
bookmarks_popup_pos (GtkMenu *menu,
1333
		     gint *x,
1334
		     gint *y,
1335
		     gboolean push_in,
1336
		     GtkWidget *button)
1337
{
1338
  gdk_window_get_origin (button->window, x, y);
1339
  *x += button->allocation.x;
1340
  *y += button->allocation.y + button->requisition.height - 1;
1341
}
1342
1343
static gboolean
1344
bookmarks_popup (GtkWidget *widget,
1345
		 GdkEventButton *event,
1346
		 GtkMenu *menu)
1347
{
1348
  if (event->button != 1) return FALSE;
1349
  g_object_set (widget, "active", TRUE, NULL);
1350
  gtk_menu_popup (menu, NULL, NULL,
1351
		  (GtkMenuPositionFunc) bookmarks_popup_pos, widget,
1352
		  1, event->time);
1353
  return TRUE;
1354
}
1355
1356
static void
1357
bookmarks_add (GtkWidget *item, GtkWidget *bookmarks_button)
1358
{
1359
  GtkWidget *fs = gtk_widget_get_toplevel (bookmarks_button);
1360
  gchar *filename;
1361
  GIOChannel *io;
1362
1363
  filename = g_strdup_printf ("%s/.gtk-bookmarks", g_get_home_dir ());
1364
  io = g_io_channel_new_file (filename, "a", NULL);
1365
  if (io)
1366
    {
1367
      GList *nav_history;
1368
      gchar *dir;
1369
1370
      nav_history = g_object_get_data (G_OBJECT (fs), "__nav_history");
1371
      dir = (gchar *) g_list_last (nav_history)->data;
1372
      g_io_channel_write_chars (io, dir, strlen (dir), NULL, NULL);
1373
      g_io_channel_write_chars (io, "\n", strlen ("\n"), NULL, NULL);
1374
      g_io_channel_unref (io);
1375
1376
      reload_bookmarks (bookmarks_button, fs);
1377
    }
1378
  else
1379
    {
1380
      GtkWidget *dialog;
1381
1382
      dialog = gtk_message_dialog_new (GTK_WINDOW (fs),
1383
			      GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL,
1384
			      GTK_MESSAGE_ERROR,
1385
			      GTK_BUTTONS_OK,
1386
			      "Unable to write to %s", filename);
1387
      g_signal_connect (dialog, "response", G_CALLBACK (gtk_widget_destroy), NULL);
1388
      gtk_widget_show (dialog);
1389
    }
1390
  g_free (filename);
1391
}
1392
1393
static void
1394
bookmarks_edit (GtkWidget *item,
1395
		GtkWidget *bookmarks_button)
1396
{
1397
  GtkWidget *fs = gtk_widget_get_toplevel (bookmarks_button);
1398
  GtkWidget *dialog;
1399
  gchar *filename, *prog;
1400
1401
  filename = g_strdup_printf ("%s/.gtk-bookmarks", g_get_home_dir ());
1402
  prog = g_find_program_in_path ("gedit");
1403
  if (prog)
1404
    {
1405
      gboolean use_sn;
1406
      gchar *argv[] = {"gedit", NULL, NULL};
1407
1408
      g_free (prog);
1409
      use_sn = (system ("gedit --version | awk '{ver=$3;if($3>2.2)exit 0;else exit 1}'") == 0);
1410
      argv[1] = filename;
1411
1412
      if (!g_file_test (filename, G_FILE_TEST_EXISTS))
1413
        {
1414
          FILE *f;
1415
          f = fopen (filename, "w");
1416
          if (f) fclose (f);
1417
      }
1418
1419
      if (use_sn)
1420
        {
1421
          gchar *icon = NULL;
1422
          GnomeProgram *app;
1423
1424
          if (icon_theme_initialized && (app = gnome_program_get ()))
1425
              icon = gnome_program_locate_file (app, GNOME_FILE_DOMAIN_PIXMAP,
1426
              	"gedit-icon.png", FALSE, NULL);
1427
          else
1428
	    {
1429
	      gchar *prefix;
1430
1431
	      prefix = read_line_from_command ("pkg-config --variable=prefix libgnomeui-2.0");
1432
	      if (*prefix == '\0')
1433
	          icon = g_strdup ("/usr/share/pixmaps/gedit-icon.png");
1434
	      else
1435
	          icon = g_strdup_printf ("%s/share/pixmaps/gedit-icon.png", prefix);
1436
	      g_free (prefix);
1437
	    }
1438
1439
          sn_launch_app ("Text Editor", "Starting Text Editor", icon, argv);
1440
          if (icon) g_free (icon);
1441
        }
1442
      else
1443
          g_spawn_async (NULL, argv, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL, NULL, NULL);
1444
1445
      g_free (filename);
1446
      return;
1447
    }
1448
1449
  dialog = gtk_message_dialog_new (GTK_WINDOW (fs),
1450
			      GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL,
1451
			      GTK_MESSAGE_INFO,
1452
			      GTK_BUTTONS_OK,
1453
			      "The bookmark editor hasn't been implemented yet.\n"
1454
			      "Please open your favorite text editor and edit:\n"
1455
			      "%s", filename);
1456
  gtk_container_set_border_width (GTK_CONTAINER (dialog), 8);
1457
  g_signal_connect (dialog, "response", G_CALLBACK (gtk_widget_destroy), NULL);
1458
  gtk_widget_show (dialog);
1459
  g_free (filename);
1460
}
1461
1462
static void
1463
reload_bookmarks (GtkWidget *bookmarks_button, GtkWidget *fs)
1464
{
1465
  GtkWidget *menu, *add, *edit;
1466
  GtkTooltips *tips = NULL;
1467
  gchar *filename;
1468
  GIOChannel *io;
1469
  gulong signal;
1470
1471
  /* Destroy the previous menu */
1472
  menu = g_object_get_data (G_OBJECT (fs), "__bookmarks");
1473
  if (menu)
1474
      gtk_widget_destroy (menu);
1475
  signal = (gulong) GPOINTER_TO_INT (g_object_get_data (G_OBJECT (fs), "__bookmarks_signal"));
1476
  if (signal > 0)
1477
      g_signal_handler_disconnect (bookmarks_button, signal);
1478
1479
1480
  /* Create the menu */
1481
  menu = gtk_menu_new ();
1482
  gtk_menu_set_title (GTK_MENU (menu), _("Bookmarks"));
1483
  add = gtk_menu_item_new_with_mnemonic (_("_Add to bookmarks"));
1484
  edit = gtk_menu_item_new_with_mnemonic (_("_Edit bookmarks..."));
1485
  gtk_menu_shell_append (GTK_MENU_SHELL (menu), add);
1486
  gtk_menu_shell_append (GTK_MENU_SHELL (menu), edit);
1487
1488
  g_signal_connect (add, "activate", G_CALLBACK (bookmarks_add),
1489
		    bookmarks_button);
1490
  g_signal_connect (edit, "activate", G_CALLBACK (bookmarks_edit),
1491
		    bookmarks_button);
1492
1493
  tips = gtk_tooltips_new ();
1494
  g_signal_connect_swapped (menu, "destroy", G_CALLBACK (gtk_object_destroy), tips);
1495
1496
  /* Load the bookmark file */
1497
  filename = g_strdup_printf ("%s/.gtk-bookmarks", g_get_home_dir ());
1498
  io = g_io_channel_new_file (filename, "r", NULL);
1499
  if (io)
1500
    {
1501
      gchar *tmp, *dir;
1502
      gsize term;
1503
1504
      gtk_menu_shell_append (GTK_MENU_SHELL (menu),
1505
			     gtk_menu_item_new ());
1506
      while (g_io_channel_read_line (io, &tmp, NULL, &term, NULL) == G_IO_STATUS_NORMAL)
1507
        {
1508
	  GtkWidget *item;
1509
1510
	  dir = g_strndup (tmp, term);
1511
	  g_free (tmp);
1512
          if (strlen (dir) == 0)
1513
            {
1514
	      g_free (dir);
1515
	      continue;
1516
            }
1517
1518
	  item = gtk_menu_item_new_with_label (g_path_get_basename (dir));
1519
	  gtk_tooltips_set_tip (tips, item, dir, NULL);
1520
	  g_object_set_data (G_OBJECT (item), "fs", fs);
1521
	  g_signal_connect (item, "activate", G_CALLBACK (bookmarks_item_clicked),
1522
			    dir);
1523
	  g_signal_connect_swapped (item, "destroy", G_CALLBACK (g_free), dir);
1524
	  gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
1525
        }
1526
1527
      g_io_channel_unref (io);
1528
    }
1529
  g_free (filename);
1530
1531
1532
  gtk_widget_show_all (menu);
1533
  signal = g_signal_connect (bookmarks_button, "button-press-event",
1534
			     G_CALLBACK (bookmarks_popup), menu);
1535
  g_signal_connect (menu, "deactivate", G_CALLBACK (popup_deactivate),
1536
		    bookmarks_button);
1537
  g_object_set_data (G_OBJECT (fs), "__bookmarks", menu);
1538
  g_object_set_data (G_OBJECT (fs), "__bookmarks_signal", GINT_TO_POINTER ((int) signal));
1539
}
1540
1541
static void
1542
sort_by_anything (GtkTreeViewColumn *column, GtkTreeView *view, gint sort_column, GtkSortType default_sort)
1543
{
1544
  GtkTreeModel *model = gtk_tree_view_get_model (view);
1545
  GList *list, *cols = gtk_tree_view_get_columns (view);
1546
  gint sort_id;
1547
  GtkSortType sort_type;
1548
1549
  for (list = cols; list; list = list->next)
1550
    {
1551
      GtkTreeViewColumn *col = (GtkTreeViewColumn *) list->data;
1552
      gtk_tree_view_column_set_sort_indicator (col, FALSE);
1553
    }
1554
  g_list_free (cols);
1555
1556
  gtk_tree_view_column_set_sort_indicator (column, TRUE);
1557
  gtk_tree_sortable_get_sort_column_id (GTK_TREE_SORTABLE (model), &sort_id, &sort_type);
1558
  if (sort_id == sort_column)
1559
    {
1560
      sort_type = (sort_type == GTK_SORT_ASCENDING) ? GTK_SORT_DESCENDING : GTK_SORT_ASCENDING;
1561
      gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (model), sort_column, sort_type);
1562
      gtk_tree_view_column_set_sort_order (column, sort_type);
1563
    }
1564
  else
1565
    {
1566
      gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (model), sort_column, default_sort);
1567
      gtk_tree_view_column_set_sort_order (column, default_sort);
1568
    }
1569
1570
  /* Save sort option */
1571
  
1572
}
1573
1574
static void
1575
sort_by_name (GtkTreeViewColumn *column, GtkTreeView *view)
1576
{
1577
  sort_by_anything (column, view, FILE_COLUMN, GTK_SORT_ASCENDING);
1578
}
1579
1580
static void
1581
sort_by_type (GtkTreeViewColumn *column, GtkTreeView *view)
1582
{
1583
  sort_by_anything (column, view, TYPE_COLUMN, GTK_SORT_ASCENDING);
1584
}
1585
1586
static void
1587
sort_by_size (GtkTreeViewColumn *column, GtkTreeView *view)
1588
{
1589
  sort_by_anything (column, view, SIZE_DATA_COLUMN, GTK_SORT_DESCENDING);
1590
}
1591
1592
static void
1593
sort_by_date (GtkTreeViewColumn *column, GtkTreeView *view)
1594
{
1595
  sort_by_anything (column, view, DATE_DATA_COLUMN, GTK_SORT_DESCENDING);
1596
}
1597
1598
static gint
1599
default_sort_func (GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer user_data)
1600
{
1601
  return 0;
1602
}
1603
1604
static void
651
gtk_file_selection_init (GtkFileSelection *filesel)
1605
gtk_file_selection_init (GtkFileSelection *filesel)
652
{
1606
{
1607
  GtkWidget *toolbar;
1608
  GtkWidget *back;
1609
  GtkWidget *back_dropdown;
1610
  GtkWidget *back_dropdown_arrow;
1611
  GtkWidget *bookmarks;
1612
  GtkWidget *bookmarks_icon;
653
  GtkWidget *entry_vbox;
1613
  GtkWidget *entry_vbox;
654
  GtkWidget *label;
1614
  GtkWidget *label;
655
  GtkWidget *list_hbox, *list_container;
1615
  GtkWidget *list_hbox, *list_container;
656
  GtkWidget *confirm_area;
1616
  GtkWidget *confirm_area;
657
  GtkWidget *pulldown_hbox;
1617
  GtkWidget *pulldown_hbox;
1618
  GtkWidget *combo;
658
  GtkWidget *scrolled_win;
1619
  GtkWidget *scrolled_win;
659
  GtkWidget *eventbox;
1620
  GtkWidget *eventbox;
660
  GtkWidget *spacer;
1621
  GtkWidget *vbox, *hbox;
1622
  GtkWidget *filter_combo;
661
  GtkDialog *dialog;
1623
  GtkDialog *dialog;
662
1624
663
  GtkListStore *model;
1625
  GtkListStore *model;
664
  GtkTreeViewColumn *column;
1626
  GtkTreeViewColumn *column;
1627
  GParamSpec *action_area_border;
1628
  GParamSpec *toolbar_shadow;
1629
  GdkPixbuf *icon;
665
  
1630
  
666
  gtk_widget_push_composite_child ();
1631
  gtk_widget_push_composite_child ();
667
1632
1633
  simple_mode = (g_getenv ("GTK_FILESEL_SIMPLE") && strcmp (g_getenv ("GTK_FILESEL_SIMPLE"), "1") == 0);
1634
1635
  /* Dirty hack to use gconf, gnome-vfs and libgnomeui without depending on them */
1636
  if (!gnome_mod && g_module_supported ())
1637
    {
1638
      gnome_mod = g_module_open (NULL, G_MODULE_BIND_LAZY);
1639
      gboolean (*gnome_vfs_initialized) (void);
1640
      gboolean (*gnome_vfs_init) (void);
1641
1642
      if (!gnome_mod) goto stop_mod;
1643
1644
      if (g_module_symbol (gnome_mod, "gconf_client_get_default", (gpointer *) &gconf_client_get_default)
1645
       && g_module_symbol (gnome_mod, "gconf_client_dir_exists", (gpointer *) &gconf_client_dir_exists)
1646
       && g_module_symbol (gnome_mod, "gconf_client_get_bool", (gpointer *) &gconf_client_get_bool)
1647
       && g_module_symbol (gnome_mod, "gconf_client_add_dir", (gpointer *) &gconf_client_add_dir)
1648
       && g_module_symbol (gnome_mod, "gconf_client_notify_add", (gpointer *) &gconf_client_notify_add)
1649
       && g_module_symbol (gnome_mod, "gconf_client_notify_remove", (gpointer *) &gconf_client_notify_remove)
1650
       && gconf_client_get_default ())
1651
	{
1652
	  gconf_initialized = TRUE;
1653
	  if (gconf_client_dir_exists (gconf_client_get_default (), "/desktop/gnome/file_views", NULL))
1654
	      gconf_hidden_key = "/desktop/gnome/file_views/show_hidden_files";   /* GNOME 2.2 */
1655
	  else
1656
	      gconf_hidden_key = "/apps/nautilus/preferences/show_hidden_files";  /* GNOME 2.2 */
1657
1658
1659
	  _gtk_fnmatch_show_hidden = gconf_client_get_bool (gconf_client_get_default (),
1660
			gconf_hidden_key, NULL);
1661
	  gconf_client_add_dir (gconf_client_get_default (),
1662
	  			gconf_hidden_key,
1663
	  			GCONF_CLIENT_PRELOAD_NONE,
1664
	  			NULL);
1665
	}
1666
1667
      if (simple_mode) goto stop_mod;
1668
1669
      if (g_module_symbol (gnome_mod, "gnome_vfs_initialized", (gpointer *) &gnome_vfs_initialized)
1670
       && g_module_symbol (gnome_mod, "gnome_vfs_init", (gpointer *) &gnome_vfs_init))
1671
        {
1672
          vfs_initialized = (*gnome_vfs_initialized) ();
1673
          if (!vfs_initialized)
1674
              vfs_initialized = gnome_vfs_init ();
1675
1676
          if (!vfs_initialized
1677
           || !g_module_symbol (gnome_mod, "gnome_vfs_file_info_new", (gpointer *) &gnome_vfs_file_info_new)
1678
           || !g_module_symbol (gnome_mod, "gnome_vfs_get_file_info", (gpointer *) &gnome_vfs_get_file_info)
1679
           || !g_module_symbol (gnome_mod, "gnome_vfs_file_info_get_mime_type", (gpointer *) &gnome_vfs_file_info_get_mime_type)
1680
           || !g_module_symbol (gnome_mod, "gnome_vfs_mime_get_description", (gpointer *) &gnome_vfs_mime_get_description)
1681
           || !g_module_symbol (gnome_mod, "gnome_vfs_mime_get_icon", (gpointer *) &gnome_vfs_mime_get_icon)
1682
           || !g_module_symbol (gnome_mod, "gnome_vfs_file_info_unref", (gpointer *) &gnome_vfs_file_info_unref))
1683
              vfs_initialized = FALSE;
1684
1685
          if (vfs_initialized
1686
           && g_module_symbol (gnome_mod, "gnome_icon_theme_new", (gpointer *) &gnome_icon_theme_new)
1687
           && g_module_symbol (gnome_mod, "gnome_icon_theme_lookup_icon", (gpointer *) &gnome_icon_theme_lookup_icon)
1688
           && g_module_symbol (gnome_mod, "gnome_icon_theme_append_search_path", (gpointer *) &gnome_icon_theme_append_search_path))
1689
              icon_theme_initialized = TRUE;
1690
1691
          if (icon_theme_initialized
1692
           && g_module_symbol (gnome_mod, "gnome_program_get", (gpointer *) &gnome_program_get)
1693
           && g_module_symbol (gnome_mod, "gnome_program_locate_file", (gpointer *) &gnome_program_locate_file))
1694
            {
1695
              GnomeProgram *app = gnome_program_get ();
1696
1697
              if (app)
1698
                  gnome_program_locate_file (app, GNOME_FILE_DOMAIN_PIXMAP, "document-icons", FALSE, &icon_theme_paths);
1699
            }
1700
        }
1701
    }
1702
  stop_mod:
1703
1704
  if (gconf_initialized)
1705
    {
1706
        guint id = gconf_client_notify_add (gconf_client_get_default (),
1707
	  		gconf_hidden_key,
1708
	  		notify_show_hidden,
1709
	  		filesel, NULL, NULL);
1710
	g_object_set_data (G_OBJECT (filesel), "__notify_show_hidden", GINT_TO_POINTER ((gint) id));
1711
    }
1712
  else
1713
    {
1714
      gchar *show_hidden;
1715
1716
      show_hidden = read_line_from_command ("gconftool-2 --get /desktop/gnome/file_views/show_hidden_files");
1717
      if (strcmp (show_hidden, "") == 0)
1718
        {
1719
          /* GNOME 2.0 */
1720
          g_free (show_hidden);
1721
          show_hidden = read_line_from_command ("gconftool-2 --get /apps/nautilus/preferences/show_hidden_files");
1722
          _gtk_fnmatch_show_hidden = (strcmp (show_hidden, "true") == 0);
1723
        }
1724
      else
1725
          /* GNOME 2.2 */
1726
          _gtk_fnmatch_show_hidden = (strcmp (show_hidden, "true") == 0);
1727
      g_free (show_hidden);
1728
    }
1729
1730
668
  dialog = GTK_DIALOG (filesel);
1731
  dialog = GTK_DIALOG (filesel);
1732
  g_signal_connect (filesel, "key-press-event", G_CALLBACK (handle_key_presses), NULL);
669
1733
670
  filesel->cmpl_state = cmpl_init_state ();
1734
  filesel->cmpl_state = cmpl_init_state ();
671
1735
672
  /* The dialog-sized vertical box  */
1736
  /* The dialog-sized vertical box  */
673
  filesel->main_vbox = dialog->vbox;
1737
  filesel->main_vbox = dialog->vbox;
674
  gtk_container_set_border_width (GTK_CONTAINER (filesel), 10);
1738
  gtk_box_set_spacing (GTK_BOX (dialog->vbox), 6);
1739
  gtk_container_set_border_width (GTK_CONTAINER (filesel), 12);
1740
1741
  /* The toolbar */
1742
  toolbar = gtk_toolbar_new ();
1743
  gtk_toolbar_set_style (GTK_TOOLBAR (toolbar), GTK_TOOLBAR_ICONS);
1744
  g_object_set_data (G_OBJECT (filesel), "__toolbar", toolbar);
1745
  gtk_box_pack_start (GTK_BOX (filesel->main_vbox), toolbar,
1746
		      FALSE, FALSE, 0);
1747
  /* Get rid of the border shadow */
1748
  toolbar_shadow = gtk_widget_class_find_style_property (GTK_WIDGET_GET_CLASS (toolbar),
1749
  							 "shadow_type");
1750
  G_PARAM_SPEC_ENUM (toolbar_shadow)->default_value = GTK_SHADOW_NONE;
1751
  g_object_set_data (G_OBJECT (toolbar), "__force_no_shadow", GINT_TO_POINTER (TRUE));
1752
  
1753
1754
  back = gtk_toolbar_insert_stock (GTK_TOOLBAR (toolbar),
1755
				   GTK_STOCK_GO_BACK,
1756
				   _("Go to the previous visited location  (Alt+Left)"), NULL,
1757
				   G_CALLBACK (gtk_file_selection_back), filesel, -1);
1758
  g_object_set_data (G_OBJECT (filesel), "__back", back);
1759
1760
  back_dropdown = gtk_toggle_button_new ();
1761
  gtk_button_set_relief (GTK_BUTTON (back_dropdown), GTK_RELIEF_NONE);
1762
  GTK_WIDGET_UNSET_FLAGS (back_dropdown, GTK_CAN_FOCUS);
1763
  back_dropdown_arrow = gtk_arrow_new (GTK_ARROW_DOWN, GTK_SHADOW_IN);
1764
  gtk_widget_set_size_request (back_dropdown_arrow, 10, 24);
1765
  gtk_container_add (GTK_CONTAINER (back_dropdown), back_dropdown_arrow);
1766
  gtk_toolbar_append_widget (GTK_TOOLBAR (toolbar), back_dropdown, NULL, NULL);
1767
  g_object_set_data (G_OBJECT (filesel), "__back_dropdown", back_dropdown);
1768
  g_signal_connect (back_dropdown, "button-press-event",
1769
		    G_CALLBACK (back_menu), NULL);
1770
1771
  gtk_toolbar_insert_stock (GTK_TOOLBAR (toolbar),
1772
			   GTK_STOCK_GO_UP,
1773
			   _("Go to the parent directory  (Alt+Up)"), NULL,
1774
			   G_CALLBACK (gtk_file_selection_up), filesel, -1);
1775
  gtk_toolbar_insert_stock (GTK_TOOLBAR (toolbar),
1776
			   GTK_STOCK_REFRESH,
1777
			   _("Display the latest contents of the current location  (Ctrl+R)"), NULL,
1778
			   G_CALLBACK (gtk_file_selection_refresh), filesel, -1);
1779
  gtk_toolbar_insert_space (GTK_TOOLBAR (toolbar), -1);
1780
  gtk_toolbar_insert_stock (GTK_TOOLBAR (toolbar),
1781
			   GTK_STOCK_HOME,
1782
			   _("Go to the home location  (Alt+Home)"), NULL,
1783
			   G_CALLBACK (gtk_file_selection_home), filesel, -1);
1784
1785
  icon = gdk_pixbuf_new_from_inline (sizeof (desktop_icon),
1786
				     (const guint8 *) desktop_icon,
1787
				     FALSE, NULL);
1788
  gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1789
			   _("Desktop"),
1790
			   _("Go to the desktop location"), NULL,
1791
			   gtk_image_new_from_pixbuf (icon),
1792
			   G_CALLBACK (gtk_file_selection_desktop), filesel);
1793
1794
  bookmarks = gtk_toggle_button_new ();
1795
  g_object_set_data (G_OBJECT (filesel), "__bookmarks_button", bookmarks);
1796
  gtk_button_set_relief (GTK_BUTTON (bookmarks), GTK_RELIEF_NONE);
1797
  GTK_WIDGET_UNSET_FLAGS (bookmarks, GTK_CAN_FOCUS);
1798
  bookmarks_icon = gtk_image_new_from_stock (GTK_STOCK_JUMP_TO, GTK_ICON_SIZE_LARGE_TOOLBAR);
1799
  gtk_container_add (GTK_CONTAINER (bookmarks), bookmarks_icon);
1800
  gtk_toolbar_append_widget (GTK_TOOLBAR (toolbar), bookmarks, _("Bookmarks  (Alt+B)"), NULL);
1801
1802
  gtk_toolbar_insert_space (GTK_TOOLBAR (toolbar), -1);
1803
1804
  gtk_widget_realize (bookmarks);
1805
  reload_bookmarks (bookmarks, GTK_WIDGET (filesel));
1806
675
1807
676
  /* The horizontal box containing create, rename etc. buttons */
1808
  /* The horizontal box containing create, rename etc. buttons */
677
  filesel->button_area = gtk_hbutton_box_new ();
1809
  filesel->button_area = gtk_hbutton_box_new ();
678
  gtk_button_box_set_layout (GTK_BUTTON_BOX (filesel->button_area), GTK_BUTTONBOX_START);
1810
  gtk_button_box_set_layout (GTK_BUTTON_BOX (filesel->button_area), GTK_BUTTONBOX_START);
679
  gtk_box_set_spacing (GTK_BOX (filesel->button_area), 0);
1811
  gtk_box_set_spacing (GTK_BOX (filesel->button_area), 0);
680
  gtk_box_pack_start (GTK_BOX (filesel->main_vbox), filesel->button_area, 
1812
  gtk_toolbar_append_widget (GTK_TOOLBAR (toolbar), filesel->button_area, NULL, NULL);
681
		      FALSE, FALSE, 0);
682
  gtk_widget_show (filesel->button_area);
1813
  gtk_widget_show (filesel->button_area);
1814
  gtk_widget_show_all (toolbar);
683
  
1815
  
684
  gtk_file_selection_show_fileop_buttons (filesel);
1816
  gtk_file_selection_show_fileop_buttons (filesel);
1817
  gtk_container_set_border_width (GTK_CONTAINER (dialog), 12);
1818
1819
1820
  /* The terminal and file manager buttons */
1821
  gtk_toolbar_insert_space (GTK_TOOLBAR (toolbar), -1);
1822
1823
  icon = gdk_pixbuf_new_from_inline (sizeof (terminal_icon),
1824
				     (const guint8 *) terminal_icon,
1825
				     FALSE, NULL);
1826
  gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1827
			   _("Terminal"),
1828
			   _("Launch a terminal in this folder  (Ctrl+T)"), NULL,
1829
			   gtk_image_new_from_pixbuf (icon),
1830
			   G_CALLBACK (gtk_file_selection_launch_terminal), filesel);
1831
  icon = gdk_pixbuf_new_from_inline (sizeof (fm_icon),
1832
				     (const guint8 *) fm_icon,
1833
				     FALSE, NULL);
1834
  gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
1835
			   _("File Manager"),
1836
			   _("Launch a file manager in this folder  (Ctrl+F)"), NULL,
1837
			   gtk_image_new_from_pixbuf (icon),
1838
			   G_CALLBACK (gtk_file_selection_launch_fm), filesel);
1839
685
1840
686
  /* hbox for pulldown menu */
1841
  /* hbox for pulldown menu */
1842
  vbox = gtk_vbox_new (FALSE, 12);
1843
  gtk_box_pack_start (GTK_BOX (filesel->main_vbox), vbox, TRUE, TRUE, 0);
687
  pulldown_hbox = gtk_hbox_new (TRUE, 5);
1844
  pulldown_hbox = gtk_hbox_new (TRUE, 5);
688
  gtk_box_pack_start (GTK_BOX (filesel->main_vbox), pulldown_hbox, FALSE, FALSE, 0);
1845
  gtk_box_pack_start (GTK_BOX (vbox), pulldown_hbox, FALSE, TRUE, 0);
689
  gtk_widget_show (pulldown_hbox);
1846
  gtk_widget_show_all (vbox);
690
  
1847
  
691
  /* Pulldown menu */
1848
  /* Pulldown menu */
692
  filesel->history_pulldown = gtk_option_menu_new ();
1849
  filesel->history_pulldown = gtk_option_menu_new ();
693
  gtk_widget_show (filesel->history_pulldown);
1850
  g_signal_connect (filesel->history_pulldown, "show", G_CALLBACK (widget_force_hide), NULL);
694
  gtk_box_pack_start (GTK_BOX (pulldown_hbox), filesel->history_pulldown, 
1851
  gtk_box_pack_start (GTK_BOX (pulldown_hbox), filesel->history_pulldown, 
695
		      FALSE, FALSE, 0);
1852
		      TRUE, TRUE, 0);
696
    
1853
    
697
  /*  The horizontal box containing the directory and file listboxes  */
1854
  combo = gtk_combo_new ();
1855
  gtk_combo_set_case_sensitive (GTK_COMBO (combo), TRUE);
1856
  gtk_combo_set_value_in_list (GTK_COMBO (combo), FALSE, FALSE);
1857
  gtk_combo_disable_activate (GTK_COMBO (combo));
1858
  gtk_combo_set_use_arrows (GTK_COMBO (combo), FALSE);
1859
  g_signal_connect (GTK_COMBO (combo)->entry, "activate",
1860
  		    G_CALLBACK (history_combo_activate), filesel);
1861
  g_signal_connect (GTK_COMBO (combo)->list, "select-child",
1862
  		    G_CALLBACK (history_combo_selected), filesel);
1863
  gtk_widget_show (combo);
1864
  g_object_set_data (G_OBJECT (filesel), "__combo", combo);
1865
  gtk_box_pack_start (GTK_BOX (pulldown_hbox), combo, TRUE, TRUE, 0);
698
1866
699
  spacer = gtk_hbox_new (FALSE, 0);
1867
  /*  The horizontal box containing the directory and file listboxes  */
700
  gtk_widget_set_size_request (spacer, -1, 5);
701
  gtk_box_pack_start (GTK_BOX (filesel->main_vbox), spacer, FALSE, FALSE, 0);
702
  gtk_widget_show (spacer);
703
  
1868
  
704
  list_hbox = gtk_hbox_new (FALSE, 5);
1869
  list_hbox = gtk_hbox_new (FALSE, 6);
705
  gtk_box_pack_start (GTK_BOX (filesel->main_vbox), list_hbox, TRUE, TRUE, 0);
1870
  gtk_box_pack_start (GTK_BOX (vbox), list_hbox, TRUE, TRUE, 0);
706
  gtk_widget_show (list_hbox);
1871
  gtk_widget_show (list_hbox);
707
  if (WANT_HPANED)
1872
  if (WANT_HPANED)
708
    list_container = g_object_new (GTK_TYPE_HPANED,
1873
    list_container = g_object_new (GTK_TYPE_HPANED,
Lines 713-723 Link Here
713
  else
1878
  else
714
    list_container = list_hbox;
1879
    list_container = list_hbox;
715
1880
716
  spacer = gtk_hbox_new (FALSE, 0);
717
  gtk_widget_set_size_request (spacer, -1, 5);
718
  gtk_box_pack_start (GTK_BOX (filesel->main_vbox), spacer, FALSE, FALSE, 0);  
719
  gtk_widget_show (spacer);
720
  
721
  /* The directories list */
1881
  /* The directories list */
722
1882
723
  model = gtk_list_store_new (1, G_TYPE_STRING);
1883
  model = gtk_list_store_new (1, G_TYPE_STRING);
Lines 734-739 Link Here
734
  gtk_tree_view_column_set_widget (column, label);
1894
  gtk_tree_view_column_set_widget (column, label);
735
  gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
1895
  gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
736
  gtk_tree_view_append_column (GTK_TREE_VIEW (filesel->dir_list), column);
1896
  gtk_tree_view_append_column (GTK_TREE_VIEW (filesel->dir_list), column);
1897
  if (!simple_mode)
1898
    {
1899
      /* The files are already being sorted by qsort when in simple mode */
1900
      gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (model), DIR_COLUMN, GTK_SORT_ASCENDING);
1901
      gtk_tree_view_column_set_sort_order (column, GTK_SORT_DESCENDING);
1902
    }
737
1903
738
  gtk_widget_set_size_request (filesel->dir_list,
1904
  gtk_widget_set_size_request (filesel->dir_list,
739
			       DIR_LIST_WIDTH, DIR_LIST_HEIGHT);
1905
			       DIR_LIST_WIDTH, DIR_LIST_HEIGHT);
Lines 749-775 Link Here
749
				  GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
1915
				  GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
750
  gtk_container_set_border_width (GTK_CONTAINER (scrolled_win), 0);
1916
  gtk_container_set_border_width (GTK_CONTAINER (scrolled_win), 0);
751
  if (GTK_IS_PANED (list_container))
1917
  if (GTK_IS_PANED (list_container))
752
    gtk_paned_pack1 (GTK_PANED (list_container), scrolled_win, TRUE, TRUE);
1918
    gtk_paned_pack1 (GTK_PANED (list_container), scrolled_win, FALSE, TRUE);
753
  else
1919
  else
754
    gtk_container_add (GTK_CONTAINER (list_container), scrolled_win);
1920
    gtk_container_add (GTK_CONTAINER (list_container), scrolled_win);
755
  gtk_widget_show (filesel->dir_list);
1921
  gtk_widget_show (filesel->dir_list);
756
  gtk_widget_show (scrolled_win);
1922
  gtk_widget_show (scrolled_win);
757
1923
758
  /* The files list */
1924
  /* The files list */
759
  model = gtk_list_store_new (1, G_TYPE_STRING);
1925
  model = gtk_list_store_new (7,
1926
		G_TYPE_STRING,		/* FILE_COLUMN */
1927
		GDK_TYPE_PIXBUF,	/* ICON_COLUMN */
1928
		G_TYPE_STRING,		/* TYPE_COLUMN */
1929
		G_TYPE_STRING,		/* SIZE_COLUMN */
1930
		G_TYPE_UINT,		/* SIZE_DATA_COLUMN */
1931
		G_TYPE_STRING,		/* DATE_COLUMN */
1932
		G_TYPE_UINT);		/* DATE_DATA_COLUMN */
760
  filesel->file_list = gtk_tree_view_new_with_model (GTK_TREE_MODEL (model));
1933
  filesel->file_list = gtk_tree_view_new_with_model (GTK_TREE_MODEL (model));
1934
  gtk_tree_view_set_headers_clickable (GTK_TREE_VIEW (filesel->file_list), !simple_mode);
1935
  gtk_tree_sortable_set_default_sort_func (GTK_TREE_SORTABLE (model), default_sort_func, NULL, NULL);
1936
  if (!simple_mode)
1937
      gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (filesel->file_list), TRUE);
761
  g_object_unref (model);
1938
  g_object_unref (model);
762
1939
1940
1941
  if (g_getenv ("GTK_FILESEL_NO_ICONS") && strcmp (g_getenv ("GTK_FILESEL_NO_ICONS"), "1") == 0)
1942
      icon_theme_initialized = FALSE;
1943
  if (g_getenv ("GTK_FILESEL_NO_MIME") && strcmp (g_getenv ("GTK_FILESEL_NO_MIME"), "1") == 0)
1944
    {
1945
      vfs_initialized = FALSE;
1946
      icon_theme_initialized = FALSE;
1947
    }
1948
1949
  if (!simple_mode && icon_theme_initialized)
1950
    {
1951
      column = gtk_tree_view_column_new_with_attributes ("",
1952
							 gtk_cell_renderer_pixbuf_new (),
1953
							 "pixbuf", ICON_COLUMN,
1954
							 NULL);
1955
      g_object_set (column, "reorderable", TRUE, NULL);
1956
      gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
1957
      gtk_tree_view_append_column (GTK_TREE_VIEW (filesel->file_list), column);
1958
    }
1959
1960
763
  column = gtk_tree_view_column_new_with_attributes (_("Files"),
1961
  column = gtk_tree_view_column_new_with_attributes (_("Files"),
764
						     gtk_cell_renderer_text_new (),
1962
						     gtk_cell_renderer_text_new (),
765
						     "text", FILE_COLUMN,
1963
						     "text", FILE_COLUMN,
766
						     NULL);
1964
						     NULL);
1965
  g_signal_connect (column, "clicked", G_CALLBACK (sort_by_name), filesel->file_list);
767
  label = gtk_label_new_with_mnemonic (_("_Files"));
1966
  label = gtk_label_new_with_mnemonic (_("_Files"));
768
  gtk_label_set_mnemonic_widget (GTK_LABEL (label), filesel->file_list);
1967
  gtk_label_set_mnemonic_widget (GTK_LABEL (label), filesel->file_list);
769
  gtk_widget_show (label);
1968
  gtk_widget_show (label);
770
  gtk_tree_view_column_set_widget (column, label);
1969
  gtk_tree_view_column_set_widget (column, label);
771
  gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
1970
  gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
772
  gtk_tree_view_append_column (GTK_TREE_VIEW (filesel->file_list), column);
1971
  gtk_tree_view_append_column (GTK_TREE_VIEW (filesel->file_list), column);
1972
  g_object_set (column, "clickable", !simple_mode, "resizable", !simple_mode, "reorderable", !simple_mode, NULL);
1973
  g_object_set_data (G_OBJECT (filesel), "__file_column", column);
1974
  /* if (!simple_mode)
1975
      gtk_tree_view_column_set_sort_indicator (column, TRUE); */
773
1976
774
  gtk_widget_set_size_request (filesel->file_list,
1977
  gtk_widget_set_size_request (filesel->file_list,
775
			       FILE_LIST_WIDTH, FILE_LIST_HEIGHT);
1978
			       FILE_LIST_WIDTH, FILE_LIST_HEIGHT);
Lines 778-783 Link Here
778
  g_signal_connect (gtk_tree_view_get_selection (GTK_TREE_VIEW (filesel->file_list)), "changed",
1981
  g_signal_connect (gtk_tree_view_get_selection (GTK_TREE_VIEW (filesel->file_list)), "changed",
779
		    G_CALLBACK (gtk_file_selection_file_changed), filesel);
1982
		    G_CALLBACK (gtk_file_selection_file_changed), filesel);
780
1983
1984
1985
  if (!simple_mode && vfs_initialized)
1986
    {
1987
      column = gtk_tree_view_column_new_with_attributes (_("Type"),
1988
							 gtk_cell_renderer_text_new (),
1989
							 "text", TYPE_COLUMN,
1990
							 NULL);
1991
      g_signal_connect (column, "clicked", G_CALLBACK (sort_by_type), filesel->file_list);
1992
      label = gtk_label_new_with_mnemonic (_("_Type"));
1993
      gtk_label_set_mnemonic_widget (GTK_LABEL (label), filesel->file_list);
1994
      gtk_widget_show (label);
1995
      gtk_tree_view_column_set_widget (column, label);
1996
      gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
1997
      gtk_tree_view_append_column (GTK_TREE_VIEW (filesel->file_list), column);
1998
      g_object_set (column, "clickable", !simple_mode, "resizable", !simple_mode, "reorderable", !simple_mode, NULL);
1999
    }
2000
2001
2002
  column = gtk_tree_view_column_new_with_attributes (_("Size"),
2003
						     gtk_cell_renderer_text_new (),
2004
						     "text", SIZE_COLUMN,
2005
						     NULL);
2006
  g_signal_connect (column, "clicked", G_CALLBACK (sort_by_size), filesel->file_list);
2007
  label = gtk_label_new_with_mnemonic (_("_Size"));
2008
  gtk_label_set_mnemonic_widget (GTK_LABEL (label), filesel->file_list);
2009
  gtk_widget_show (label);
2010
  gtk_tree_view_column_set_widget (column, label);
2011
  gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
2012
  if (!simple_mode)
2013
      gtk_tree_view_append_column (GTK_TREE_VIEW (filesel->file_list), column);
2014
  g_object_set (column, "clickable", !simple_mode, "resizable", !simple_mode, "reorderable", !simple_mode, NULL);
2015
2016
2017
  column = gtk_tree_view_column_new_with_attributes (_("Last Modified"),
2018
						     gtk_cell_renderer_text_new (),
2019
						     "text", DATE_COLUMN,
2020
						     NULL);
2021
  g_signal_connect (column, "clicked", G_CALLBACK (sort_by_date), filesel->file_list);
2022
  label = gtk_label_new_with_mnemonic (_("Last _Modified"));
2023
  gtk_label_set_mnemonic_widget (GTK_LABEL (label), filesel->file_list);
2024
  gtk_widget_show (label);
2025
  gtk_tree_view_column_set_widget (column, label);
2026
  gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
2027
  if (!simple_mode)
2028
      gtk_tree_view_append_column (GTK_TREE_VIEW (filesel->file_list), column);
2029
  g_object_set (column, "clickable", !simple_mode, "resizable", !simple_mode, "reorderable", !simple_mode, NULL);
2030
2031
781
  /* gtk_clist_column_titles_passive (GTK_CLIST (filesel->file_list)); */
2032
  /* gtk_clist_column_titles_passive (GTK_CLIST (filesel->file_list)); */
782
2033
783
  scrolled_win = gtk_scrolled_window_new (NULL, NULL);
2034
  scrolled_win = gtk_scrolled_window_new (NULL, NULL);
Lines 798-803 Link Here
798
  
2049
  
799
  /*  The OK/Cancel button area */
2050
  /*  The OK/Cancel button area */
800
  confirm_area = dialog->action_area;
2051
  confirm_area = dialog->action_area;
2052
  action_area_border = gtk_widget_class_find_style_property (
2053
				GTK_WIDGET_GET_CLASS (dialog),
2054
				"action_area_border");
2055
  G_PARAM_SPEC_INT (action_area_border)->default_value = 0;  
801
2056
802
  /*  The Cancel button  */
2057
  /*  The Cancel button  */
803
  filesel->cancel_button = gtk_dialog_add_button (dialog,
2058
  filesel->cancel_button = gtk_dialog_add_button (dialog,
Lines 811-817 Link Here
811
  gtk_widget_grab_default (filesel->ok_button);
2066
  gtk_widget_grab_default (filesel->ok_button);
812
2067
813
  /*  The selection entry widget  */
2068
  /*  The selection entry widget  */
814
  entry_vbox = gtk_vbox_new (FALSE, 2);
2069
  entry_vbox = gtk_vbox_new (FALSE, 6);
815
  gtk_box_pack_end (GTK_BOX (filesel->main_vbox), entry_vbox, FALSE, FALSE, 2);
2070
  gtk_box_pack_end (GTK_BOX (filesel->main_vbox), entry_vbox, FALSE, FALSE, 2);
816
  gtk_widget_show (entry_vbox);
2071
  gtk_widget_show (entry_vbox);
817
  
2072
  
Lines 821-827 Link Here
821
  gtk_container_add (GTK_CONTAINER (eventbox), label);
2076
  gtk_container_add (GTK_CONTAINER (eventbox), label);
822
  gtk_box_pack_start (GTK_BOX (entry_vbox), eventbox, FALSE, FALSE, 0);
2077
  gtk_box_pack_start (GTK_BOX (entry_vbox), eventbox, FALSE, FALSE, 0);
823
  gtk_widget_show (label);
2078
  gtk_widget_show (label);
824
  gtk_widget_show (eventbox);
2079
  g_signal_connect (eventbox, "show", G_CALLBACK (widget_force_hide), NULL);
825
2080
826
  filesel->selection_entry = gtk_entry_new ();
2081
  filesel->selection_entry = gtk_entry_new ();
827
  g_signal_connect (filesel->selection_entry, "key_press_event",
2082
  g_signal_connect (filesel->selection_entry, "key_press_event",
Lines 843-848 Link Here
843
  gtk_label_set_mnemonic_widget (GTK_LABEL (filesel->selection_text),
2098
  gtk_label_set_mnemonic_widget (GTK_LABEL (filesel->selection_text),
844
				 filesel->selection_entry);
2099
				 filesel->selection_entry);
845
2100
2101
2102
  /* The filter combo box */
2103
  hbox = gtk_hbox_new (FALSE, 6);
2104
  gtk_box_pack_start (GTK_BOX (entry_vbox), hbox, TRUE, TRUE, 0);
2105
  gtk_box_pack_start (GTK_BOX (hbox), gtk_label_new (_("Filter:")), FALSE, TRUE, 0);
2106
2107
  filter_combo = gtk_combo_new ();
2108
  do
2109
    {
2110
      GList *items = NULL;
2111
      items = g_list_append (items, _("<All Files> *"));
2112
      items = g_list_append (items, _("<Text> *.txt"));
2113
      items = g_list_append (items, _("<Markup text> *.xml/*.xhtml/*.html/*.sgml/"
2114
				"*.[Tt]e[Xx]/*.me"));
2115
      items = g_list_append (items, _("<Word Processing Documents> *.abw/*.sxw/*.kwd/"
2116
				"*.doc/*.wpd"));
2117
     items = g_list_append (items, _("<Spreadsheets> *.gnumeric/*.sxc/*.ksp/*.xls"));
2118
     items = g_list_append (items, _("<Documents> *.pdf/*.ps/*.dvi"));
2119
     items = g_list_append (items, _("<Images> *.jpg/*.gif/*.xpm/*.png/*.bmp/*.xbm/*.xcf"));
2120
     items = g_list_append (items, _("<Sound> *.mp3/*.ogg/*.wav/*.cdda/*.rm/*.ram"));
2121
     items = g_list_append (items, _("<Video> *.mpg/*.mpeg/*.wmv/*.avi/*.rm/*.mov/*.asf/*.mkv/*.ogm"));
2122
     items = g_list_append (items, _("<Compressed> *.gz/*.Z/*.tgz/*.bz2/*.zip"));
2123
     items = g_list_append (items, _("<Packages> *.rpm/*.deb/*.tgz/*.tbz/*.tar.gz/"
2124
				"*.tar.bz2/*.tar/*.zip"));
2125
     items = g_list_append (items, _("<Code> *.c/*.h/*.cc/*.cpp/*.pas/*.py/*.pl/*.pm/"
2126
				"*.java/*.el/*.diff/*.patch"));
2127
2128
     gtk_combo_set_popdown_strings (GTK_COMBO (filter_combo), items);
2129
    }
2130
  while (0);
2131
  g_object_set_data (G_OBJECT (filesel), "__filter_combo", filter_combo);
2132
2133
  gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (filter_combo)->entry), "<All Files> *");
2134
  gtk_box_pack_start (GTK_BOX (hbox), filter_combo, TRUE, TRUE, 0);
2135
  gtk_combo_disable_activate (GTK_COMBO (filter_combo));
2136
  g_signal_connect_swapped (GTK_COMBO (filter_combo)->entry, "activate",
2137
			GTK_SIGNAL_FUNC (filter_chosen_callback), filesel);
2138
  g_signal_connect_swapped (GTK_COMBO (filter_combo)->list, "select-child",
2139
			GTK_SIGNAL_FUNC (filter_chosen_selected_callback), filesel);
2140
  ((CompletionState *) filesel->cmpl_state)->filter_entry = GTK_ENTRY (GTK_COMBO (filter_combo)->entry);
2141
2142
  if (!simple_mode && !(g_getenv ("GTK_FILESEL_NO_FILTER") && *g_getenv ("GTK_FILESEL_NO_FILTER")))
2143
      gtk_widget_show_all (hbox);
2144
2145
846
  if (!cmpl_state_okay (filesel->cmpl_state))
2146
  if (!cmpl_state_okay (filesel->cmpl_state))
847
    {
2147
    {
848
      gchar err_buf[256];
2148
      gchar err_buf[256];
Lines 851-864 Link Here
851
2151
852
      gtk_label_set_text (GTK_LABEL (filesel->selection_text), err_buf);
2152
      gtk_label_set_text (GTK_LABEL (filesel->selection_text), err_buf);
853
    }
2153
    }
2154
  else if (global_last_dir)
2155
    {
2156
      gchar *dir = g_strdup_printf ("%s/", global_last_dir);
2157
      gtk_file_selection_populate (filesel, dir, TRUE, TRUE);
2158
      g_free (dir);
2159
    }
854
  else
2160
  else
855
    {
2161
    {
856
      gtk_file_selection_populate (filesel, "", FALSE, TRUE);
2162
      gtk_file_selection_populate (filesel, "", FALSE, TRUE);
2163
      g_object_set_data (G_OBJECT (filesel), "__first_start", GINT_TO_POINTER (TRUE));
857
    }
2164
    }
858
2165
859
  gtk_widget_grab_focus (filesel->selection_entry);
2166
  gtk_widget_grab_focus (filesel->selection_entry);
860
2167
861
  gtk_widget_pop_composite_child ();
2168
  gtk_widget_pop_composite_child ();
2169
  gtk_file_selection_update_fileops (filesel);
2170
2171
  if (simple_mode)
2172
      gtk_window_set_default_size (GTK_WINDOW (filesel), 500, 420);
2173
  else
2174
      gtk_window_set_default_size (GTK_WINDOW (filesel), 560, 420);
862
}
2175
}
863
2176
864
static gchar *
2177
static gchar *
Lines 1104-1142 Link Here
1104
void
2417
void
1105
gtk_file_selection_show_fileop_buttons (GtkFileSelection *filesel)
2418
gtk_file_selection_show_fileop_buttons (GtkFileSelection *filesel)
1106
{
2419
{
2420
  GtkToolbar *toolbar;
2421
1107
  g_return_if_fail (GTK_IS_FILE_SELECTION (filesel));
2422
  g_return_if_fail (GTK_IS_FILE_SELECTION (filesel));
1108
    
2423
    
2424
  toolbar = GTK_TOOLBAR (g_object_get_data (G_OBJECT (filesel),
2425
			 "__toolbar"));
2426
1109
  /* delete, create directory, and rename */
2427
  /* delete, create directory, and rename */
1110
  if (!filesel->fileop_c_dir) 
2428
  if (!filesel->fileop_c_dir) 
1111
    {
2429
    {
1112
      filesel->fileop_c_dir = gtk_button_new_with_mnemonic (_("_New Folder"));
2430
      GdkPixbuf *icon;
1113
      g_signal_connect (filesel->fileop_c_dir, "clicked",
2431
      gchar *tip;
1114
			G_CALLBACK (gtk_file_selection_create_dir),
2432
1115
			filesel);
2433
      tip = g_strdup_printf ("%s  (Shift+Ctrl+N)",
1116
      gtk_box_pack_start (GTK_BOX (filesel->button_area), 
2434
      			     _("Create a new empty folder inside this folder"));
1117
			  filesel->fileop_c_dir, TRUE, TRUE, 0);
2435
2436
      icon = gdk_pixbuf_new_from_inline (sizeof (new_folder_icon),
2437
					 (const guint8 *) new_folder_icon,
2438
					 FALSE, NULL);
2439
      filesel->fileop_c_dir = gtk_toolbar_append_item (toolbar,
2440
			_("New Folder"),
2441
			tip, NULL,
2442
			gtk_image_new_from_pixbuf (icon),
2443
			G_CALLBACK (gtk_file_selection_create_dir), filesel);
1118
      gtk_widget_show (filesel->fileop_c_dir);
2444
      gtk_widget_show (filesel->fileop_c_dir);
2445
      g_free (tip);
1119
    }
2446
    }
1120
	
2447
	
1121
  if (!filesel->fileop_del_file) 
2448
  if (!filesel->fileop_del_file) 
1122
    {
2449
    {
1123
      filesel->fileop_del_file = gtk_button_new_with_mnemonic (_("De_lete File"));
2450
      filesel->fileop_del_file = gtk_toolbar_insert_stock (toolbar,
1124
      g_signal_connect (filesel->fileop_del_file, "clicked",
2451
      			"gtk-delete",
1125
			G_CALLBACK (gtk_file_selection_delete_file),
2452
			_("Delete selected file"), NULL,
1126
			filesel);
2453
      			G_CALLBACK (gtk_file_selection_delete_file), filesel,
1127
      gtk_box_pack_start (GTK_BOX (filesel->button_area), 
2454
			-1);
1128
			  filesel->fileop_del_file, TRUE, TRUE, 0);
1129
      gtk_widget_show (filesel->fileop_del_file);
2455
      gtk_widget_show (filesel->fileop_del_file);
1130
    }
2456
    }
1131
2457
1132
  if (!filesel->fileop_ren_file)
2458
  if (!filesel->fileop_ren_file)
1133
    {
2459
    {
1134
      filesel->fileop_ren_file = gtk_button_new_with_mnemonic (_("_Rename File"));
2460
      filesel->fileop_ren_file = gtk_toolbar_append_item (toolbar,
1135
      g_signal_connect (filesel->fileop_ren_file, "clicked",
2461
      			_("Rename"), _("Rename selected file"), NULL,
1136
			G_CALLBACK (gtk_file_selection_rename_file),
2462
      			gtk_image_new_from_stock ("gtk-convert",
1137
			filesel);
2463
				gtk_toolbar_get_icon_size (toolbar)),
1138
      gtk_box_pack_start (GTK_BOX (filesel->button_area), 
2464
			G_CALLBACK (gtk_file_selection_rename_file), filesel);
1139
			  filesel->fileop_ren_file, TRUE, TRUE, 0);
1140
      gtk_widget_show (filesel->fileop_ren_file);
2465
      gtk_widget_show (filesel->fileop_ren_file);
1141
    }
2466
    }
1142
  
2467
  
Lines 1285-1291 Link Here
1285
gtk_file_selection_destroy (GtkObject *object)
2610
gtk_file_selection_destroy (GtkObject *object)
1286
{
2611
{
1287
  GtkFileSelection *filesel;
2612
  GtkFileSelection *filesel;
1288
  GList *list;
2613
  GList *list, *nav_history;
1289
  HistoryCallbackArg *callback_arg;
2614
  HistoryCallbackArg *callback_arg;
1290
  
2615
  
1291
  g_return_if_fail (GTK_IS_FILE_SELECTION (object));
2616
  g_return_if_fail (GTK_IS_FILE_SELECTION (object));
Lines 1330-1335 Link Here
1330
      filesel->last_selected = NULL;
2655
      filesel->last_selected = NULL;
1331
    }
2656
    }
1332
2657
2658
  nav_history = g_object_get_data (G_OBJECT (filesel), "__nav_history");
2659
  if (nav_history)
2660
      g_list_free (nav_history);
2661
  g_object_set_data (G_OBJECT (filesel), "__nav_history", NULL);
2662
2663
  if (gconf_initialized)
2664
    {
2665
      guint notify_id;
2666
2667
      notify_id = (guint) GPOINTER_TO_INT (g_object_get_data (G_OBJECT (filesel),
2668
  				           "__notify_show_hidden"));
2669
2670
      if (notify_id)
2671
        {
2672
          gconf_client_notify_remove (gconf_client_get_default (), notify_id);
2673
          g_object_set_data (G_OBJECT (filesel), "__notify_show_hidden", NULL);
2674
        }
2675
    }
2676
1333
  GTK_OBJECT_CLASS (parent_class)->destroy (object);
2677
  GTK_OBJECT_CLASS (parent_class)->destroy (object);
1334
}
2678
}
1335
2679
Lines 1337-1346 Link Here
1337
gtk_file_selection_map (GtkWidget *widget)
2681
gtk_file_selection_map (GtkWidget *widget)
1338
{
2682
{
1339
  GtkFileSelection *filesel = GTK_FILE_SELECTION (widget);
2683
  GtkFileSelection *filesel = GTK_FILE_SELECTION (widget);
2684
  GtkTreeViewColumn *column;
1340
2685
1341
  /* Refresh the contents */
2686
  /* Refresh the contents */
2687
  if (GINT_TO_POINTER (g_object_get_data (G_OBJECT (filesel), "__first_start")))
2688
      g_object_set_data (G_OBJECT (filesel), "__first_start", GINT_TO_POINTER (FALSE));
2689
  else
1342
  gtk_file_selection_populate (filesel, "", FALSE, FALSE);
2690
  gtk_file_selection_populate (filesel, "", FALSE, FALSE);
1343
  
2691
  
2692
  if (!simple_mode)
2693
    {
2694
      column = (GtkTreeViewColumn *) g_object_get_data (G_OBJECT (filesel), "__file_column");
2695
      sort_by_anything (column, GTK_TREE_VIEW (filesel->file_list), FILE_COLUMN, GTK_SORT_ASCENDING);
2696
    }
2697
  
1344
  GTK_WIDGET_CLASS (parent_class)->map (widget);
2698
  GTK_WIDGET_CLASS (parent_class)->map (widget);
1345
}
2699
}
1346
2700
Lines 1410-1415 Link Here
1410
}
2764
}
1411
2765
1412
static void
2766
static void
2767
gtk_file_selection_back (GtkWidget *widget,
2768
			 gpointer data)
2769
{
2770
  GtkFileSelection *fs = data;
2771
  GList *nav_history;
2772
  gchar *last_dir;
2773
  guint l;
2774
2775
  nav_history = g_object_get_data (G_OBJECT (fs), "__nav_history");
2776
  l = g_list_length (nav_history);
2777
  if (l >= 2)
2778
    {
2779
      last_dir = g_strdup_printf ("%s/", (gchar *) g_list_nth_data (nav_history, l - 2));
2780
      g_free (g_list_nth_data (nav_history, l - 1));
2781
      g_free (g_list_nth_data (nav_history, l - 2));
2782
      nav_history = g_list_remove_link (nav_history, g_list_nth (nav_history, l - 1));
2783
      nav_history = g_list_remove_link (nav_history, g_list_nth (nav_history, l - 2));
2784
2785
      g_object_set_data (G_OBJECT (fs), "__nav_history", nav_history);
2786
      gtk_file_selection_populate (fs, last_dir, FALSE, FALSE);
2787
      g_free (last_dir);
2788
      update_nav_history_popup (GTK_WIDGET (fs));
2789
    }
2790
}
2791
2792
static void
2793
gtk_file_selection_up (GtkWidget *widget,
2794
			 gpointer data)
2795
{
2796
  GtkFileSelection *fs = data;
2797
  gtk_file_selection_populate (fs, "../", FALSE, FALSE);
2798
}
2799
2800
static void
2801
gtk_file_selection_refresh (GtkWidget *widget,
2802
			    gpointer data)
2803
{
2804
  GtkFileSelection *fs = data;
2805
  gtk_file_selection_populate (fs, "./", FALSE, FALSE);
2806
}
2807
2808
static void
2809
gtk_file_selection_home (GtkWidget *widget,
2810
			 gpointer data)
2811
{
2812
  GtkFileSelection *fs = data;
2813
  gtk_file_selection_populate (fs, "~/", FALSE, FALSE);
2814
}
2815
2816
static void
2817
gtk_file_selection_desktop (GtkWidget *widget,
2818
			 gpointer data)
2819
{
2820
  GtkFileSelection *fs = data;
2821
  gtk_file_selection_populate (fs, "~/Desktop/", FALSE, FALSE);
2822
}
2823
2824
static void
2825
gtk_file_selection_launch_terminal (GtkWidget *widget, GtkFileSelection *fs)
2826
{
2827
  GList *list;
2828
  gchar *terminal;
2829
2830
  /* This is a little script that autodetects which desktop environment you're running on.
2831
     If you're running on KDE, konsole is launched. Otherwise, gnome-terminal is launched, or
2832
     xterm is gnome-terminal is not available. */
2833
  terminal = read_line_from_command ("gterm() { if ! command -v gnome-terminal >/dev/null 2>/dev/null; then echo xterm; fi; if gnome-terminal --version | grep -q 'Gnome Terminal 1'; then echo gnome1; else echo gnome2; fi }; pl=`ps auxw | grep -V '/bin/sh -c'`; if echo \"$pl\" | grep -q 'kicker'; then echo konsole; else gterm; fi");
2834
2835
  switch (fork ())
2836
    {
2837
      case 0: /* child */
2838
	list = g_object_get_data (G_OBJECT (fs), "__nav_history");
2839
	if (g_list_last (list)->data)
2840
	    chdir ((gchar *) g_list_last (list)->data);
2841
	g_list_free (list);
2842
2843
	if (strcmp (terminal, "konsole") == 0)
2844
	    execlp ("konsole", "konsole", NULL);
2845
	else if (strcmp (terminal, "gnome1") == 0)
2846
	    execlp ("gnome-terminal", "gnome-terminal", NULL);
2847
	else if (strcmp (terminal, "gnome2") == 0)
2848
	  {
2849
	    gchar *dir;
2850
2851
	    dir = g_strdup_printf ("--working-directory=%s", g_get_current_dir ());
2852
	    execlp ("gnome-terminal", "gnome-terminal", dir, NULL);
2853
	  }
2854
	else
2855
	    execlp ("xterm", "xterm", NULL);
2856
2857
	_exit (1);
2858
      case -1: /* error */
2859
	g_error ("Cannot fork()\n");
2860
	break;
2861
      default:
2862
  	/* Do nothing in parent */
2863
	break;
2864
    }
2865
2866
  g_free (terminal);
2867
}
2868
2869
static void
2870
gtk_file_selection_launch_fm (GtkWidget *widget, GtkFileSelection *fs)
2871
{
2872
  GList *list;
2873
2874
  switch (fork ())
2875
  {
2876
  case 0: /* child */
2877
	list = g_object_get_data (G_OBJECT (fs), "__nav_history");
2878
	if (g_list_last (list)->data)
2879
	    chdir ((gchar *) g_list_last (list)->data);
2880
	g_list_free (list);
2881
2882
	/* This is a little script that autodetects which desktop environment you're running on.
2883
	   If you're running on KDE, Konqueror is launched. Otherwise, Nautilus is launched. */
2884
	execlp ("/bin/sh", "/bin/sh", "-c", 
2885
		"pl=`ps auxw | grep -V '/bin/sh -c'`; if echo \"$pl\" | grep -q kicker; then exec konqueror .; else exec nautilus .; fi",
2886
		NULL);
2887
	_exit (1);
2888
  case -1: /* error */
2889
	g_error ("Cannot fork()\n");
2890
	break;
2891
  default:
2892
  	/* Do nothing in parent */
2893
	break;
2894
  }
2895
}
2896
2897
static void
1413
gtk_file_selection_create_dir_confirmed (GtkWidget *widget,
2898
gtk_file_selection_create_dir_confirmed (GtkWidget *widget,
1414
					 gpointer   data)
2899
					 gpointer   data)
1415
{
2900
{
Lines 1465-1470 Link Here
1465
  GtkWidget *label;
2950
  GtkWidget *label;
1466
  GtkWidget *dialog;
2951
  GtkWidget *dialog;
1467
  GtkWidget *vbox;
2952
  GtkWidget *vbox;
2953
  GtkWidget *spacer;
1468
  GtkWidget *button;
2954
  GtkWidget *button;
1469
2955
1470
  g_return_if_fail (GTK_IS_FILE_SELECTION (fs));
2956
  g_return_if_fail (GTK_IS_FILE_SELECTION (fs));
Lines 1481-1486 Link Here
1481
  gtk_window_set_title (GTK_WINDOW (dialog), _("New Folder"));
2967
  gtk_window_set_title (GTK_WINDOW (dialog), _("New Folder"));
1482
  gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_MOUSE);
2968
  gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_MOUSE);
1483
  gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (fs));
2969
  gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (fs));
2970
  gtk_container_set_border_width (GTK_CONTAINER (dialog), 12);
1484
2971
1485
  /* If file dialog is grabbed, grab option dialog */
2972
  /* If file dialog is grabbed, grab option dialog */
1486
  /* When option dialog is closed, file dialog will be grabbed again */
2973
  /* When option dialog is closed, file dialog will be grabbed again */
Lines 1488-1494 Link Here
1488
      gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
2975
      gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
1489
2976
1490
  vbox = gtk_vbox_new (FALSE, 0);
2977
  vbox = gtk_vbox_new (FALSE, 0);
1491
  gtk_container_set_border_width (GTK_CONTAINER (vbox), 8);
1492
  gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), vbox,
2978
  gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), vbox,
1493
		     FALSE, FALSE, 0);
2979
		     FALSE, FALSE, 0);
1494
  gtk_widget_show( vbox);
2980
  gtk_widget_show( vbox);
Lines 1502-1512 Link Here
1502
  fs->fileop_entry = gtk_entry_new ();
2988
  fs->fileop_entry = gtk_entry_new ();
1503
  gtk_label_set_mnemonic_widget (GTK_LABEL (label), fs->fileop_entry);
2989
  gtk_label_set_mnemonic_widget (GTK_LABEL (label), fs->fileop_entry);
1504
  gtk_box_pack_start (GTK_BOX (vbox), fs->fileop_entry, 
2990
  gtk_box_pack_start (GTK_BOX (vbox), fs->fileop_entry, 
1505
		      TRUE, TRUE, 5);
2991
		      TRUE, TRUE, 0);
1506
  GTK_WIDGET_SET_FLAGS (fs->fileop_entry, GTK_CAN_DEFAULT);
2992
  GTK_WIDGET_SET_FLAGS (fs->fileop_entry, GTK_CAN_DEFAULT);
1507
  gtk_entry_set_activates_default (GTK_ENTRY (fs->fileop_entry), TRUE); 
2993
  gtk_entry_set_activates_default (GTK_ENTRY (fs->fileop_entry), TRUE); 
1508
  gtk_widget_show (fs->fileop_entry);
2994
  gtk_widget_show (fs->fileop_entry);
1509
  
2995
  
2996
  spacer = gtk_hbox_new (FALSE, 0);
2997
  gtk_widget_set_size_request (spacer, -1, 12);
2998
  gtk_box_pack_start (GTK_BOX (vbox), spacer, FALSE, FALSE, 0);
2999
  gtk_widget_show (spacer);
3000
1510
  /* buttons */
3001
  /* buttons */
1511
  button = gtk_dialog_add_button (GTK_DIALOG (dialog), 
3002
  button = gtk_dialog_add_button (GTK_DIALOG (dialog), 
1512
				  GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL);
3003
				  GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL);
Lines 1525-1530 Link Here
1525
  g_signal_connect (fs->fileop_entry, "changed",
3016
  g_signal_connect (fs->fileop_entry, "changed",
1526
                    G_CALLBACK (gtk_file_selection_fileop_entry_changed),
3017
                    G_CALLBACK (gtk_file_selection_fileop_entry_changed),
1527
		    button);
3018
		    button);
3019
  g_signal_connect_swapped (fs->fileop_entry, "activate",
3020
			    G_CALLBACK (gtk_button_clicked),
3021
			    button);
1528
3022
1529
  gtk_widget_grab_default (button);
3023
  gtk_widget_grab_default (button);
1530
3024
Lines 1624-1629 Link Here
1624
		    fs);
3118
		    fs);
1625
  gtk_window_set_title (GTK_WINDOW (dialog), _("Delete File"));
3119
  gtk_window_set_title (GTK_WINDOW (dialog), _("Delete File"));
1626
  gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_MOUSE);
3120
  gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_MOUSE);
3121
  gtk_container_set_border_width (GTK_CONTAINER (dialog), 12);
3122
  gtk_box_set_spacing (GTK_BOX (GTK_DIALOG (dialog)->vbox), 12);
1627
  
3123
  
1628
  /* buttons */
3124
  /* buttons */
1629
  gtk_dialog_add_buttons (GTK_DIALOG (dialog),
3125
  gtk_dialog_add_buttons (GTK_DIALOG (dialog),
Lines 1723-1728 Link Here
1723
  GtkWidget *label;
3219
  GtkWidget *label;
1724
  GtkWidget *dialog;
3220
  GtkWidget *dialog;
1725
  GtkWidget *vbox;
3221
  GtkWidget *vbox;
3222
  GtkWidget *spacer;
1726
  GtkWidget *button;
3223
  GtkWidget *button;
1727
  gchar *buf;
3224
  gchar *buf;
1728
  
3225
  
Lines 1744-1749 Link Here
1744
  gtk_window_set_title (GTK_WINDOW (dialog), _("Rename File"));
3241
  gtk_window_set_title (GTK_WINDOW (dialog), _("Rename File"));
1745
  gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_MOUSE);
3242
  gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_MOUSE);
1746
  gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (fs));
3243
  gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (fs));
3244
  gtk_container_set_border_width (GTK_CONTAINER (dialog), 12);  
1747
3245
1748
  /* If file dialog is grabbed, grab option dialog */
3246
  /* If file dialog is grabbed, grab option dialog */
1749
  /* When option dialog  closed, file dialog will be grabbed again */
3247
  /* When option dialog  closed, file dialog will be grabbed again */
Lines 1751-1757 Link Here
1751
    gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
3249
    gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
1752
  
3250
  
1753
  vbox = gtk_vbox_new (FALSE, 0);
3251
  vbox = gtk_vbox_new (FALSE, 0);
1754
  gtk_container_set_border_width (GTK_CONTAINER (vbox), 8);
3252
  gtk_container_set_border_width (GTK_CONTAINER (vbox), 0);
1755
  gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), vbox,
3253
  gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), vbox,
1756
		      FALSE, FALSE, 0);
3254
		      FALSE, FALSE, 0);
1757
  gtk_widget_show(vbox);
3255
  gtk_widget_show(vbox);
Lines 1759-1765 Link Here
1759
  buf = g_strdup_printf (_("Rename file \"%s\" to:"), fs->fileop_file);
3257
  buf = g_strdup_printf (_("Rename file \"%s\" to:"), fs->fileop_file);
1760
  label = gtk_label_new (buf);
3258
  label = gtk_label_new (buf);
1761
  gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.0);
3259
  gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.0);
1762
  gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 5);
3260
  gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
1763
  gtk_widget_show (label);
3261
  gtk_widget_show (label);
1764
  g_free (buf);
3262
  g_free (buf);
1765
3263
Lines 1775-1780 Link Here
1775
  gtk_editable_select_region (GTK_EDITABLE (fs->fileop_entry),
3273
  gtk_editable_select_region (GTK_EDITABLE (fs->fileop_entry),
1776
			      0, strlen (fs->fileop_file));
3274
			      0, strlen (fs->fileop_file));
1777
3275
3276
  spacer = gtk_hbox_new (FALSE, 0);
3277
  gtk_widget_set_size_request (spacer, -1, 12);
3278
  gtk_box_pack_start (GTK_BOX (vbox), spacer, FALSE, FALSE, 0);
3279
  gtk_widget_show (spacer);
3280
1778
  /* buttons */
3281
  /* buttons */
1779
  button = gtk_dialog_add_button (GTK_DIALOG (dialog), 
3282
  button = gtk_dialog_add_button (GTK_DIALOG (dialog), 
1780
				  GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL);
3283
				  GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL);
Lines 1792-1797 Link Here
1792
  g_signal_connect (fs->fileop_entry, "changed",
3295
  g_signal_connect (fs->fileop_entry, "changed",
1793
		    G_CALLBACK (gtk_file_selection_fileop_entry_changed),
3296
		    G_CALLBACK (gtk_file_selection_fileop_entry_changed),
1794
		    button);
3297
		    button);
3298
  g_signal_connect_swapped (fs->fileop_entry, "activate",
3299
			    G_CALLBACK (gtk_button_clicked),
3300
			    button);
1795
3301
1796
  gtk_widget_grab_default (button);
3302
  gtk_widget_grab_default (button);
1797
  
3303
  
Lines 1869-1874 Link Here
1869
}
3375
}
1870
3376
1871
static void
3377
static void
3378
filter_chosen_callback (GtkWidget *w,
3379
			gpointer user_data)
3380
{
3381
  GtkFileSelection *fs;
3382
3383
  fs = GTK_FILE_SELECTION (w);
3384
  if (!fs->cmpl_state)
3385
    {
3386
      /* Dialog's not intact, we're probably being closed */
3387
      return;
3388
    }
3389
#ifdef G_WITH_CYGWIN
3390
  translate_win32_path (fs);
3391
#endif
3392
  gtk_file_selection_populate (fs, "./", FALSE, FALSE);
3393
}
3394
3395
static void
3396
filter_chosen_selected_callback (GtkWidget *w,
3397
				 GtkBin *item)
3398
{
3399
  GtkFileSelection *fs;
3400
  GtkCombo *combo;
3401
  const gchar *entry, *selected;
3402
3403
  if (!GTK_WIDGET_HAS_FOCUS (item))
3404
      return;
3405
3406
  fs = GTK_FILE_SELECTION (w);
3407
  if (!fs->cmpl_state)
3408
    {
3409
      /* Dialog's not intact, we're probably being closed */
3410
      return;
3411
    }
3412
3413
  combo = GTK_COMBO (g_object_get_data (G_OBJECT (fs), "__filter_combo"));
3414
  entry = gtk_entry_get_text (GTK_ENTRY (combo->entry));
3415
  selected = gtk_label_get_text (GTK_LABEL (gtk_bin_get_child (item)));
3416
3417
  if (strcmp (entry, selected) == 0)
3418
      filter_chosen_callback (w, NULL);
3419
}
3420
3421
static void
1872
gtk_file_selection_history_callback (GtkWidget *widget,
3422
gtk_file_selection_history_callback (GtkWidget *widget,
1873
				     gpointer   data)
3423
				     gpointer   data)
1874
{
3424
{
Lines 1898-1913 Link Here
1898
					gchar            *current_directory)
3448
					gchar            *current_directory)
1899
{
3449
{
1900
  HistoryCallbackArg *callback_arg;
3450
  HistoryCallbackArg *callback_arg;
1901
  GtkWidget *menu_item;
3451
  GtkWidget *menu_item, *combo;
1902
  GList *list;
3452
  GList *list, *nav_history, *history_items;
1903
  gchar *current_dir;
3453
  gchar *current_dir, *last_dir;
1904
  gint dir_len;
3454
  gint dir_len;
1905
  gint i;
3455
  gint i;
1906
  
3456
  
1907
  g_return_if_fail (GTK_IS_FILE_SELECTION (fs));
3457
  g_return_if_fail (GTK_IS_FILE_SELECTION (fs));
1908
  g_return_if_fail (current_directory != NULL);
3458
  g_return_if_fail (current_directory != NULL);
1909
  
3459
  
3460
  if (GPOINTER_TO_INT (g_object_get_data (G_OBJECT (fs), "__history_busy")))
3461
      return;
3462
  g_object_set_data (G_OBJECT (fs), "__history_busy", GINT_TO_POINTER (TRUE));
3463
1910
  list = fs->history_list;
3464
  list = fs->history_list;
3465
  history_items = NULL;
1911
3466
1912
  if (fs->history_menu) 
3467
  if (fs->history_menu) 
1913
    {
3468
    {
Lines 1960-1965 Link Here
1960
	    }
3515
	    }
1961
	  
3516
	  
1962
	  fs->history_list = g_list_append (fs->history_list, callback_arg);
3517
	  fs->history_list = g_list_append (fs->history_list, callback_arg);
3518
	  history_items = g_list_append (history_items, g_strdup (current_dir));
1963
	  
3519
	  
1964
	  g_signal_connect (menu_item, "activate",
3520
	  g_signal_connect (menu_item, "activate",
1965
			    G_CALLBACK (gtk_file_selection_history_callback),
3521
			    G_CALLBACK (gtk_file_selection_history_callback),
Lines 1969-1977 Link Here
1969
	}
3525
	}
1970
    }
3526
    }
1971
3527
3528
  combo = (GtkWidget *) g_object_get_data (G_OBJECT (fs), "__combo");
3529
  gtk_combo_set_popdown_strings (GTK_COMBO (combo), history_items);
1972
  gtk_option_menu_set_menu (GTK_OPTION_MENU (fs->history_pulldown), 
3530
  gtk_option_menu_set_menu (GTK_OPTION_MENU (fs->history_pulldown), 
1973
			    fs->history_menu);
3531
			    fs->history_menu);
1974
  g_free (current_dir);
3532
  g_free (current_dir);
3533
  g_list_free (history_items);
3534
3535
  nav_history = g_object_get_data (G_OBJECT (fs), "__nav_history");
3536
  if (nav_history)
3537
      last_dir = (gchar *) g_list_last (nav_history)->data;
3538
  if (!nav_history || strcmp (last_dir, current_directory) != 0)
3539
      nav_history = g_list_append (nav_history, g_strdup (current_directory));
3540
  g_object_set_data (G_OBJECT (fs), "__nav_history", nav_history);
3541
  update_nav_history_popup (GTK_WIDGET (fs));
3542
3543
  g_object_set_data (G_OBJECT (fs), "__history_busy", GINT_TO_POINTER (FALSE));
1975
}
3544
}
1976
3545
1977
static gchar *
3546
static gchar *
Lines 2090-2095 Link Here
2090
  return g_string_free (result, FALSE);
3659
  return g_string_free (result, FALSE);
2091
}
3660
}
2092
3661
3662
static gchar *
3663
size_to_str (off_t st_size)
3664
{
3665
  if (st_size < 1024)
3666
      return g_strdup_printf ("%u bytes", (guint) st_size);
3667
  else if (st_size < 1024 * 1024)
3668
      return g_strdup_printf ("%.1f K", st_size / 1024.0);
3669
  else if (st_size < 1024 * 1024 * 1024)
3670
      return g_strdup_printf ("%.1f MB", st_size / 1024.0 / 1024.0);
3671
  else
3672
      return g_strdup_printf ("%.1f GB", st_size / 1024.0 / 1024.0 / 1024.0);
3673
}
3674
3675
static GdkPixbuf *
3676
load_icon_theme (GnomeIconTheme *theme, const gchar *icon)
3677
{
3678
  gchar *filename;
3679
  GdkPixbuf *buf;
3680
  static GHashTable *cache = NULL;
3681
3682
  if (!theme || !icon || !vfs_initialized || !icon_theme_initialized)
3683
      return NULL;
3684
3685
  if (g_path_is_absolute (icon))
3686
      filename = g_strdup (icon);
3687
  else
3688
    {
3689
      filename = gnome_icon_theme_lookup_icon (theme, icon, 16, NULL, NULL);
3690
      if (!filename)
3691
          filename = gnome_icon_theme_lookup_icon (theme, icon, 48, NULL, NULL);
3692
      if (!filename && strcmp (icon, "gnome-mime-text-plain") == 0)
3693
          filename = gnome_icon_theme_lookup_icon (theme, "gnome-textfile", 48, NULL, NULL);
3694
    }
3695
3696
  if (!filename)
3697
      return NULL;
3698
3699
  if (!cache)
3700
      cache = g_hash_table_new (g_str_hash, g_str_equal);
3701
  else if ((buf = (GdkPixbuf *) g_hash_table_lookup (cache, filename)))
3702
    {
3703
      g_free (filename);
3704
      return buf;
3705
    }
3706
3707
  buf = gdk_pixbuf_new_from_file (filename, NULL);
3708
  if (buf && (gdk_pixbuf_get_width (buf) != 16 || gdk_pixbuf_get_height (buf) != 16))
3709
    {
3710
      GdkPixbuf *scaled;
3711
3712
      scaled = gdk_pixbuf_scale_simple (buf, 16, 16, GDK_INTERP_TILES);
3713
      g_object_unref (buf);
3714
      buf = scaled;
3715
    }
3716
  if (buf)
3717
      g_hash_table_insert (cache, filename, buf);
3718
  else
3719
      g_free (filename);
3720
  return buf;
3721
}
3722
2093
static void
3723
static void
2094
gtk_file_selection_populate (GtkFileSelection *fs,
3724
gtk_file_selection_populate (GtkFileSelection *fs,
2095
			     gchar            *rel_path,
3725
			     gchar            *rel_path,
Lines 2104-2111 Link Here
2104
  gchar* filename;
3734
  gchar* filename;
2105
  gchar* rem_path = rel_path;
3735
  gchar* rem_path = rel_path;
2106
  gchar* sel_text;
3736
  gchar* sel_text;
3737
  gchar* current_dir;
2107
  gint did_recurse = FALSE;
3738
  gint did_recurse = FALSE;
2108
  gint possible_count = 0;
3739
  gint possible_count = 0;
3740
  static GnomeIconTheme *theme = NULL;
3741
  gboolean do_sort;
3742
  gint sort_id;
3743
  GtkSortType sort_order;
2109
  
3744
  
2110
  g_return_if_fail (GTK_IS_FILE_SELECTION (fs));
3745
  g_return_if_fail (GTK_IS_FILE_SELECTION (fs));
2111
3746
Lines 2118-2123 Link Here
2118
      gtk_file_selection_abort (fs);
3753
      gtk_file_selection_abort (fs);
2119
      return;
3754
      return;
2120
    }
3755
    }
3756
  current_dir = cmpl_reference_position (cmpl_state);
2121
3757
2122
  g_assert (cmpl_state->reference_dir);
3758
  g_assert (cmpl_state->reference_dir);
2123
3759
Lines 2127-2137 Link Here
2127
  gtk_list_store_clear (dir_model);
3763
  gtk_list_store_clear (dir_model);
2128
  gtk_list_store_clear (file_model);
3764
  gtk_list_store_clear (file_model);
2129
3765
2130
  /* Set the dir list to include ./ and ../ */
3766
  do_sort = gtk_tree_sortable_get_sort_column_id (GTK_TREE_SORTABLE (file_model), &sort_id, &sort_order);
2131
  gtk_list_store_append (dir_model, &iter);
3767
  if (do_sort && sort_id >= FILE_COLUMN)
2132
  gtk_list_store_set (dir_model, &iter, DIR_COLUMN, "." G_DIR_SEPARATOR_S, -1);
3768
      gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (file_model),
2133
  gtk_list_store_append (dir_model, &iter);
3769
		GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID, GTK_SORT_DESCENDING);
2134
  gtk_list_store_set (dir_model, &iter, DIR_COLUMN, ".." G_DIR_SEPARATOR_S, -1);
3770
3771
  if (!simple_mode && icon_theme_initialized && !theme)
3772
    {
3773
      GSList *list;
3774
3775
      theme = gnome_icon_theme_new ();
3776
      for (list = icon_theme_paths; list; list = list->next)
3777
          gnome_icon_theme_append_search_path (theme, (const char *) list->data);
3778
    }
2135
3779
2136
  while (poss)
3780
  while (poss)
2137
    {
3781
    {
Lines 2150-2159 Link Here
2150
		  gtk_list_store_set (dir_model, &iter, DIR_COLUMN, filename, -1);
3794
		  gtk_list_store_set (dir_model, &iter, DIR_COLUMN, filename, -1);
2151
		}
3795
		}
2152
	    }
3796
	    }
3797
          else if (simple_mode)
3798
            {
3799
              gtk_list_store_append (file_model, &iter);
3800
	      gtk_list_store_set (file_model, &iter,
3801
	      		FILE_COLUMN, filename,
3802
	      		-1);
3803
            }
2153
          else
3804
          else
2154
	    {
3805
	    {
3806
	      gchar *fullname;
3807
	      gchar *date = NULL;
3808
	      gchar *size_str = g_strdup (_("0 bytes"));
3809
	      gchar *typename = g_strdup (_("Unknown"));
3810
	      const gchar *mime;
3811
	      GdkPixbuf *icon = NULL;
3812
	      struct stat buf;
3813
3814
	      fullname = g_strdup_printf ("%s/%s", current_dir, filename);
3815
	      if (stat (fullname, &buf) == 0)
3816
	        {
3817
	          struct tm *lt;
3818
	          gchar tmp[128];
3819
3820
	          lt = localtime (&buf.st_mtime);;
3821
		  strftime (tmp, sizeof (tmp) - 1, _("%B %d %G at %T"), lt);
3822
		  date = g_locale_to_utf8 (tmp, -1, NULL, NULL, NULL);
3823
		  if (!date)
3824
		      date = g_convert (tmp, -1, "UTF-8", "ISO-8859-1", NULL, NULL, NULL);
3825
3826
		  size_str = size_to_str (buf.st_size);
3827
		}
3828
	      if (!date)
3829
	          date = g_strdup ("Unknown");
3830
3831
	      if (vfs_initialized)
3832
	        {
3833
	          GnomeVFSFileInfo *info;
3834
3835
	          info = gnome_vfs_file_info_new ();
3836
	          g_free (fullname);
3837
	          fullname = g_strdup_printf ("file://%s/%s", current_dir, filename);
3838
3839
	          if (gnome_vfs_get_file_info (fullname, info, GNOME_VFS_FILE_INFO_GET_MIME_TYPE) == 0
3840
	           && (mime = gnome_vfs_file_info_get_mime_type (info)))
3841
	          {
3842
	              const gchar *desc;
3843
3844
	              desc = gnome_vfs_mime_get_description (mime);
3845
	              if (desc)
3846
	                {
3847
	                  g_free (typename);
3848
	                  typename = g_strdup (desc);
3849
	                  typename[0] = (char) toupper (typename[0]);
3850
	                }
3851
3852
	              if (icon_theme_initialized)
3853
	                {
3854
	                  gchar *iconfile = (gchar *) gnome_vfs_mime_get_icon (mime);
3855
3856
	                  if (!iconfile)
3857
	                    {
3858
	                      /* Is gnome-vfs broken or is it just my system?
3859
	                         This works around the problem */
3860
	                      gchar *tmp;
3861
3862
	                      iconfile = g_strdup_printf ("gnome-mime-%s", mime);
3863
	                      while ((tmp = strchr (iconfile, '/')))
3864
	                          *tmp = '-';
3865
	                    }
3866
	                  else
3867
	                      iconfile = g_strdup (iconfile);
3868
3869
	                  icon = load_icon_theme (theme, (const gchar *) iconfile);
3870
	                  g_free (iconfile);
3871
	                }
3872
	          }
3873
	          gnome_vfs_file_info_unref (info);
3874
	        }
3875
2155
	      gtk_list_store_append (file_model, &iter);
3876
	      gtk_list_store_append (file_model, &iter);
2156
	      gtk_list_store_set (file_model, &iter, DIR_COLUMN, filename, -1);
3877
	      gtk_list_store_set (file_model, &iter,
3878
	      		FILE_COLUMN, filename,
3879
	      		ICON_COLUMN, icon,
3880
	      		TYPE_COLUMN, typename,
3881
	      		SIZE_COLUMN, size_str,
3882
	      		SIZE_DATA_COLUMN, (guint) buf.st_size,
3883
	      		DATE_COLUMN, date,
3884
	      		DATE_DATA_COLUMN, (guint) buf.st_mtime,
3885
	      		-1);
3886
	      g_free (size_str);
3887
	      g_free (typename);
3888
	      g_free (date);
3889
	      g_free (fullname);
2157
            }
3890
            }
2158
	}
3891
	}
2159
3892
Lines 2226-2235 Link Here
2226
3959
2227
      if (fs->history_pulldown) 
3960
      if (fs->history_pulldown) 
2228
	{
3961
	{
2229
	  gtk_file_selection_update_history_menu (fs, cmpl_reference_position (cmpl_state));
3962
	  GList *nav_history;
3963
	  GtkWidget *back_button;
3964
3965
	  if (global_last_dir) g_free (global_last_dir);
3966
	  global_last_dir = g_strdup (current_dir);
3967
3968
	  gtk_file_selection_update_history_menu (fs, current_dir);
3969
	  nav_history = g_object_get_data (G_OBJECT (fs), "__nav_history");
3970
	  back_button = GTK_WIDGET (g_object_get_data (G_OBJECT (fs), "__back"));
3971
	  gtk_widget_set_sensitive (back_button, g_list_length (nav_history) >= 2);
3972
	  back_button = GTK_WIDGET (g_object_get_data (G_OBJECT (fs), "__back_dropdown"));
3973
	  gtk_widget_set_sensitive (back_button, g_list_length (nav_history) >= 2);
2230
	}
3974
	}
2231
      
3975
      
2232
    }
3976
    }
3977
3978
  if (do_sort && GTK_WIDGET_MAPPED (fs) && sort_id >= FILE_COLUMN)
3979
      gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (file_model),
3980
  		sort_id, sort_order);
2233
}
3981
}
2234
3982
2235
static void
3983
static void
Lines 2517-2522 Link Here
2517
  return selections;
4265
  return selections;
2518
}
4266
}
2519
4267
4268
/********************* Startup notification *********************/
4269
4270
void
4271
sn_internal_broadcast_xmessage (const char *message_type,
4272
				const char *message_type_begin,
4273
				const char *message)
4274
{
4275
	Atom type_atom;
4276
	Atom type_atom_begin;
4277
	Window xwindow;
4278
	Display *xdisplay;
4279
	int screen;
4280
	XSetWindowAttributes attrs;
4281
4282
	g_return_if_fail (g_utf8_validate (message, -1, NULL));
4283
4284
	xdisplay = gdk_x11_display_get_xdisplay (gdk_display_get_default ());
4285
	screen = gdk_x11_screen_get_screen_number (gdk_screen_get_default ());
4286
4287
	attrs.override_redirect = True;
4288
	attrs.event_mask = PropertyChangeMask | StructureNotifyMask;
4289
	xwindow = XCreateWindow (xdisplay,
4290
		RootWindow (xdisplay, 0),
4291
		-100, -100, 1, 1,
4292
		0,
4293
		CopyFromParent,
4294
		CopyFromParent,
4295
		CopyFromParent,
4296
		CWOverrideRedirect | CWEventMask,
4297
		&attrs);
4298
4299
	type_atom = XInternAtom (xdisplay, message_type, False);
4300
	type_atom_begin = XInternAtom (xdisplay, message_type_begin, False);
4301
4302
	{
4303
		XEvent xevent;
4304
		const char *src;
4305
		const char *src_end;
4306
		char *dest;
4307
		char *dest_end;
4308
4309
		xevent.xclient.type = ClientMessage;
4310
		xevent.xclient.message_type = type_atom_begin;
4311
		xevent.xclient.display = xdisplay;
4312
		xevent.xclient.window = xwindow;
4313
		xevent.xclient.format = 8;
4314
4315
		src = message;
4316
		src_end = message + strlen (message) + 1; /* +1 to include nul byte */
4317
4318
		while (src != src_end)
4319
		{
4320
			dest = &xevent.xclient.data.b[0];
4321
			dest_end = dest + 20;				
4322
4323
			while (dest != dest_end &&
4324
				src != src_end)
4325
			{
4326
				*dest = *src;
4327
				++dest;
4328
				++src;
4329
			}
4330
4331
			XSendEvent (xdisplay,
4332
				RootWindow (xdisplay, screen),
4333
				False,
4334
				PropertyChangeMask,
4335
				&xevent);
4336
4337
			xevent.xclient.message_type = type_atom;
4338
		}
4339
	}
4340
4341
	XDestroyWindow (xdisplay, xwindow);
4342
	XFlush (xdisplay);
4343
}
4344
4345
static void
4346
setup_child (gpointer value)
4347
{
4348
	gchar *env;
4349
4350
	env = g_strdup_printf ("DESKTOP_STARTUP_ID=%s", (gchar *) value);
4351
	putenv (env);
4352
}
4353
4354
4355
static void
4356
sn_replace_all (gchar **str, gchar *from, gchar *to)
4357
{
4358
	GString *newstr;
4359
	gchar *found;
4360
4361
	g_return_if_fail (str != NULL);
4362
	g_return_if_fail (from != NULL);
4363
	g_return_if_fail (to != NULL);
4364
4365
	newstr = g_string_new (*str);
4366
	found = strstr (newstr->str, from);
4367
	while (found != NULL)
4368
	{
4369
		gint pos;
4370
4371
		pos = GPOINTER_TO_INT (found) - GPOINTER_TO_INT (newstr->str);
4372
		g_string_erase (newstr, pos, strlen (from));
4373
		g_string_insert (newstr, pos, to);
4374
		found = GINT_TO_POINTER (GPOINTER_TO_INT (found) + strlen (to));
4375
		found = strstr (found, from);
4376
	}
4377
4378
	g_free (*str);
4379
	*str = newstr->str;
4380
	g_string_free (newstr, FALSE);
4381
}
4382
4383
static void
4384
sn_append_escaped (GString *str, const gchar *name, const gchar *value)
4385
{
4386
	gchar *tmp = g_strdup (value);
4387
	sn_replace_all (&tmp, "\\", "\\\\");
4388
	sn_replace_all (&tmp, "\"", "\\\"");
4389
	sn_replace_all (&tmp, " ", "\\ ");
4390
	g_string_append_printf (str, " %s=%s", name, tmp);
4391
	g_free (tmp);
4392
}
4393
4394
static gboolean
4395
sn_launch_app (const gchar *name, const gchar *description, const gchar *icon, gchar **argv)
4396
{
4397
	static gint sequence_number = 0;
4398
	gchar hostname[255];
4399
	gchar *id, *launchee;
4400
	GString *message;
4401
	gint i, len;
4402
	gboolean result;
4403
4404
	g_return_val_if_fail (argv != NULL, FALSE);
4405
	g_return_val_if_fail (argv[0] != NULL, FALSE);
4406
4407
	launchee = g_strdup (argv[0]);
4408
	len = strlen (launchee);
4409
	for (i = 0; i < len; i++)
4410
		if (launchee[i] == '/') launchee[i] = '|';
4411
4412
	if (gethostname (hostname, sizeof (hostname) - 1) != 0)
4413
		hostname[0] = '\0';
4414
4415
	id = g_strdup_printf ("%s/%s/%lu/%d-%d-%s",
4416
		g_get_prgname (), launchee, (unsigned long) GDK_CURRENT_TIME,
4417
		(int) getpid (), (int) sequence_number, hostname);
4418
	g_free (launchee);
4419
	sequence_number++;
4420
4421
	message = g_string_new ("new: ID=");
4422
	g_string_append_printf (message, "%s SCREEN=%d", id,
4423
		gdk_x11_screen_get_screen_number (gdk_screen_get_default ()));
4424
4425
	if (name)
4426
		sn_append_escaped (message, "NAME", name);
4427
	if (description)
4428
		sn_append_escaped (message, "DESCRIPTION", description);
4429
	if (icon)
4430
		sn_append_escaped (message, "ICON", icon);
4431
4432
	sn_internal_broadcast_xmessage ("_NET_STARTUP_INFO",
4433
		"_NET_STARTUP_INFO_BEGIN",
4434
		message->str);
4435
	g_string_free (message, TRUE);
4436
4437
	result = g_spawn_async (NULL, argv, NULL, G_SPAWN_SEARCH_PATH, setup_child,
4438
		id, NULL, NULL);
4439
	g_free (id);
4440
4441
	return result;
4442
}
4443
2520
/**********************************************************************/
4444
/**********************************************************************/
2521
/*			  External Interface                          */
4445
/*			  External Interface                          */
2522
/**********************************************************************/
4446
/**********************************************************************/
Lines 3171-3176 Link Here
3171
  
5095
  
3172
  g_free (sys_dir_name);
5096
  g_free (sys_dir_name);
3173
  g_string_free (path, TRUE);
5097
  g_string_free (path, TRUE);
5098
  if (simple_mode)
3174
  qsort (sent->entries, sent->entry_count, sizeof (CompletionDirEntry), compare_cmpl_dir);
5099
  qsort (sent->entries, sent->entry_count, sizeof (CompletionDirEntry), compare_cmpl_dir);
3175
5100
3176
  g_dir_close (directory);
5101
  g_dir_close (directory);
Lines 3787-3792 Link Here
3787
    }
5712
    }
3788
}
5713
}
3789
5714
5715
/*
5716
  Patterns is a set of globs of the form: <descriptive text>pattern/pattern/pattern
5717
  The angle bracketed descriptive text is optional.  
5718
  Angle brackets and slashes are used because they are unlikely to appear in filenames.  
5719
  This function returns true if *any* glob matches.
5720
*/
5721
static gboolean
5722
multi_fn_match (const gchar *inpatterns, const gchar *text)
5723
{
5724
  gchar *pattern, *end_of_pattern, patterns[256];
5725
  strcpy(patterns, inpatterns);
5726
  if (patterns[0] == '<' && g_utf8_strchr(patterns,-1,'>'))
5727
    {
5728
      pattern=g_utf8_strchr(patterns,-1,'>')+1;
5729
      while (pattern[0] == ' ')
5730
          pattern++;
5731
    }
5732
  else
5733
    {
5734
      pattern=patterns;
5735
    }
5736
  while(pattern != NULL+1)
5737
    {
5738
      gboolean match;
5739
      end_of_pattern=g_utf8_strchr(pattern,-1,'/');
5740
      if (end_of_pattern != NULL)
5741
	{
5742
	  *end_of_pattern = '\0';
5743
	}
5744
      match = _gtk_fnmatch(pattern,text);
5745
      if (end_of_pattern != NULL)
5746
	{
5747
	  *end_of_pattern = '/';
5748
	}
5749
      if (match)
5750
	return TRUE;
5751
      pattern = end_of_pattern+1;
5752
    }
5753
  return FALSE;
5754
}
5755
3790
static PossibleCompletion*
5756
static PossibleCompletion*
3791
attempt_file_completion (CompletionState *cmpl_state)
5757
attempt_file_completion (CompletionState *cmpl_state)
3792
{
5758
{
Lines 3889-3895 Link Here
3889
      append_completion_text (dir->sent->entries[dir->cmpl_index].entry_name, cmpl_state);
5855
      append_completion_text (dir->sent->entries[dir->cmpl_index].entry_name, cmpl_state);
3890
5856
3891
      cmpl_state->the_completion.is_a_completion =
5857
      cmpl_state->the_completion.is_a_completion =
3892
	_gtk_fnmatch (pat_buf, dir->sent->entries[dir->cmpl_index].entry_name);
5858
	_gtk_fnmatch (pat_buf, dir->sent->entries[dir->cmpl_index].entry_name)
5859
	&& (multi_fn_match (gtk_entry_get_text(cmpl_state->filter_entry),
5860
			  dir->sent->entries[dir->cmpl_index].entry_name)
5861
	    || dir->sent->entries[dir->cmpl_index].is_dir);
3893
5862
3894
      cmpl_state->the_completion.is_directory = dir->sent->entries[dir->cmpl_index].is_dir;
5863
      cmpl_state->the_completion.is_directory = dir->sent->entries[dir->cmpl_index].is_dir;
3895
      if (dir->sent->entries[dir->cmpl_index].is_dir)
5864
      if (dir->sent->entries[dir->cmpl_index].is_dir)
(-)gtk+-2.2.4/gtk/fnmatch.c.old (-1 / +3 lines)
Lines 59-64 Link Here
59
#define DO_ESCAPE 1
59
#define DO_ESCAPE 1
60
#endif  
60
#endif  
61
61
62
gboolean _gtk_fnmatch_show_hidden = FALSE;
63
62
static gunichar
64
static gunichar
63
get_unescaped_char (const char **str,
65
get_unescaped_char (const char **str,
64
		    gboolean    *was_escaped)
66
		    gboolean    *was_escaped)
Lines 106-112 Link Here
106
	    return FALSE;
108
	    return FALSE;
107
	  break;
109
	  break;
108
	case '*':
110
	case '*':
109
	  if (nc == '.' && component_start)
111
	  if (!_gtk_fnmatch_show_hidden && nc == '.' && component_start)
110
	    return FALSE;
112
	    return FALSE;
111
113
112
	  {
114
	  {

Return to bug 39376