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) |