annotate src/ui_tabcomp.c @ 1388:2496a345c452

Try to improve tab completion: when a key is pressed while tab completion menu is shown, the number of entries is reduced, dhowing all matching entries but the menu is no more closed after each key pressure. Number of possible entries in this menu was increased from 500 to 1000. Pressing TAB when path entry is empty now adds / (root directory).
author zas_
date Fri, 06 Mar 2009 22:34:38 +0000
parents b4e6fee484f7
children a3d3208b0c50
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1 /*
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
2 * (SLIK) SimpLIstic sKin functions
69
31759d770628 Fri Oct 13 10:27:22 2006 John Ellis <johne@verizon.net>
gqview
parents: 12
diff changeset
3 * (C) 2006 John Ellis
1284
8b89e3ff286b Add year 2009 to copyright info everywhere.
zas_
parents: 1174
diff changeset
4 * Copyright (C) 2008 - 2009 The Geeqie Team
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
5 *
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
6 * Author: John Ellis
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
7 *
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
8 * This software is released under the GNU General Public License (GNU GPL).
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
9 * Please read the included file COPYING for more information.
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
10 * This software comes with no warranty of any kind, use at your own risk!
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
11 */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
12
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
13 #ifdef HAVE_CONFIG_H
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
14 # include "config.h"
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
15 #endif
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
16 #include "intl.h"
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
17
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
18 #include <stdio.h>
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
19 #include <stdlib.h>
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
20 #include <string.h>
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
21 #include <unistd.h>
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
22 #include <sys/types.h>
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
23 #include <dirent.h>
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
24
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
25 #include <gdk/gdk.h>
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
26 #include <gtk/gtk.h>
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
27 #include <gdk-pixbuf/gdk-pixbuf.h>
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
28
281
9995c5fb202a gqview.h -> main.h
zas_
parents: 260
diff changeset
29 #include "main.h"
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
30 #include "ui_tabcomp.h"
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
31
902
c414002a1f27 Move history_list_*() functions to separate files:
zas_
parents: 734
diff changeset
32 #include "history_list.h"
1022
9962b24b6b43 Move miscellaneous functions to their own files (new misc.[ch]).
zas_
parents: 991
diff changeset
33 #include "misc.h" /* expand_tilde() */
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
34 #include "ui_fileops.h"
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
35 #include "ui_spinner.h"
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
36 #include "ui_utildlg.h"
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
37
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
38 #include <gdk/gdkkeysyms.h> /* for key values */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
39
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
40
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
41 /* define this to enable a pop-up menu that shows possible matches
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
42 * #define TAB_COMPLETION_ENABLE_POPUP_MENU
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
43 */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
44 #define TAB_COMPLETION_ENABLE_POPUP_MENU 1
1388
2496a345c452 Try to improve tab completion: when a key is pressed while tab completion menu is shown, the number of entries is reduced, dhowing all matching entries but the menu is no more closed after each key pressure. Number of possible entries in this menu was increased from 500 to 1000. Pressing TAB when path entry is empty now adds / (root directory).
zas_
parents: 1385
diff changeset
45 #define TAB_COMP_POPUP_MAX 1000
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
46
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
47 #ifdef TAB_COMPLETION_ENABLE_POPUP_MENU
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
48 #include "ui_menu.h"
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
49 #endif
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
50
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
51
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
52 /* ----------------------------------------------------------------
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
53 Tab completion routines, can be connected to any gtkentry widget
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
54 using the tab_completion_add_to_entry() function.
726
a1dcef8cd1ae Use G_DIR_SEPARATOR where applicable.
zas_
parents: 722
diff changeset
55 Use remove_trailing_slash() to strip the trailing G_DIR_SEPARATOR.
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
56 ----------------------------------------------------------------*/
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
57
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
58 typedef struct _TabCompData TabCompData;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
59 struct _TabCompData
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
60 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
61 GtkWidget *entry;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
62 gchar *dir_path;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
63 GList *file_list;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
64 void (*enter_func)(const gchar *, gpointer);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
65 void (*tab_func)(const gchar *, gpointer);
1167
e812b1a7adda Add a back button in the toolbar: it allows to go back and forth between two directories. Experimental, please test and comment on ml.
zas_
parents: 1055
diff changeset
66 void (*tab_append_func)(const gchar *, gpointer, gint);
e812b1a7adda Add a back button in the toolbar: it allows to go back and forth between two directories. Experimental, please test and comment on ml.
zas_
parents: 1055
diff changeset
67
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
68 gpointer enter_data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
69 gpointer tab_data;
1167
e812b1a7adda Add a back button in the toolbar: it allows to go back and forth between two directories. Experimental, please test and comment on ml.
zas_
parents: 1055
diff changeset
70 gpointer tab_append_data;
e812b1a7adda Add a back button in the toolbar: it allows to go back and forth between two directories. Experimental, please test and comment on ml.
zas_
parents: 1055
diff changeset
71
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
72 GtkWidget *combo;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
73 gint has_history;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
74 gchar *history_key;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
75 gint history_levels;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
76
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
77 FileDialog *fd;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
78 gchar *fd_title;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
79 gint fd_folders_only;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
80 GtkWidget *fd_button;
1388
2496a345c452 Try to improve tab completion: when a key is pressed while tab completion menu is shown, the number of entries is reduced, dhowing all matching entries but the menu is no more closed after each key pressure. Number of possible entries in this menu was increased from 500 to 1000. Pressing TAB when path entry is empty now adds / (root directory).
zas_
parents: 1385
diff changeset
81
2496a345c452 Try to improve tab completion: when a key is pressed while tab completion menu is shown, the number of entries is reduced, dhowing all matching entries but the menu is no more closed after each key pressure. Number of possible entries in this menu was increased from 500 to 1000. Pressing TAB when path entry is empty now adds / (root directory).
zas_
parents: 1385
diff changeset
82 guint choices;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
83 };
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
84
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
85
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
86 static void tab_completion_select_show(TabCompData *td);
1388
2496a345c452 Try to improve tab completion: when a key is pressed while tab completion menu is shown, the number of entries is reduced, dhowing all matching entries but the menu is no more closed after each key pressure. Number of possible entries in this menu was increased from 500 to 1000. Pressing TAB when path entry is empty now adds / (root directory).
zas_
parents: 1385
diff changeset
87 static gint tab_completion_do(TabCompData *td);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
88
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
89 static void tab_completion_free_list(TabCompData *td)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
90 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
91 GList *list;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
92
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
93 g_free(td->dir_path);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
94 td->dir_path = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
95
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
96 list = td->file_list;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
97
516
b7e99bfeadc9 Convert the minority of while() to while ().
zas_
parents: 475
diff changeset
98 while (list)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
99 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
100 g_free(list->data);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
101 list = list->next;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
102 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
103
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
104 g_list_free(td->file_list);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
105 td->file_list = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
106 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
107
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
108 static void tab_completion_read_dir(TabCompData *td, const gchar *path)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
109 {
442
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 281
diff changeset
110 DIR *dp;
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 281
diff changeset
111 struct dirent *dir;
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 281
diff changeset
112 GList *list = NULL;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
113 gchar *pathl;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
114
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
115 tab_completion_free_list(td);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
116
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
117 pathl = path_from_utf8(path);
442
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 281
diff changeset
118 dp = opendir(pathl);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
119 if (!dp)
442
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 281
diff changeset
120 {
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 281
diff changeset
121 /* dir not found */
1385
b4e6fee484f7 Fix utf8/locale conversion warning: the path passed to isdir() is not in UTF8 (if local fs is not in UFT8) so do not use it (isdir() uses stat_utf8() which calls path_from_utf8()).
zas_
parents: 1382
diff changeset
122 g_free(pathl);
442
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 281
diff changeset
123 return;
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 281
diff changeset
124 }
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 281
diff changeset
125 while ((dir = readdir(dp)) != NULL)
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 281
diff changeset
126 {
69
31759d770628 Fri Oct 13 10:27:22 2006 John Ellis <johne@verizon.net>
gqview
parents: 12
diff changeset
127 gchar *name = dir->d_name;
31759d770628 Fri Oct 13 10:27:22 2006 John Ellis <johne@verizon.net>
gqview
parents: 12
diff changeset
128 if (strcmp(name, ".") != 0 && strcmp(name, "..") != 0)
31759d770628 Fri Oct 13 10:27:22 2006 John Ellis <johne@verizon.net>
gqview
parents: 12
diff changeset
129 {
1385
b4e6fee484f7 Fix utf8/locale conversion warning: the path passed to isdir() is not in UTF8 (if local fs is not in UFT8) so do not use it (isdir() uses stat_utf8() which calls path_from_utf8()).
zas_
parents: 1382
diff changeset
130 gchar *abspath = g_build_filename(pathl, name, NULL);
1370
0011d6859ec5 Add a directory separator at the end of names in tab completion list to indicate directories.
zas_
parents: 1365
diff changeset
131
1385
b4e6fee484f7 Fix utf8/locale conversion warning: the path passed to isdir() is not in UTF8 (if local fs is not in UFT8) so do not use it (isdir() uses stat_utf8() which calls path_from_utf8()).
zas_
parents: 1382
diff changeset
132 if (g_file_test(abspath, G_FILE_TEST_IS_DIR))
1370
0011d6859ec5 Add a directory separator at the end of names in tab completion list to indicate directories.
zas_
parents: 1365
diff changeset
133 {
0011d6859ec5 Add a directory separator at the end of names in tab completion list to indicate directories.
zas_
parents: 1365
diff changeset
134 gchar *dname = g_strconcat(name, G_DIR_SEPARATOR_S, NULL);
0011d6859ec5 Add a directory separator at the end of names in tab completion list to indicate directories.
zas_
parents: 1365
diff changeset
135 list = g_list_prepend(list, path_to_utf8(dname));
1371
2c2f86e30f6c Fix memleak in previous patch.
zas_
parents: 1370
diff changeset
136 g_free(dname);
1370
0011d6859ec5 Add a directory separator at the end of names in tab completion list to indicate directories.
zas_
parents: 1365
diff changeset
137 }
0011d6859ec5 Add a directory separator at the end of names in tab completion list to indicate directories.
zas_
parents: 1365
diff changeset
138 else
0011d6859ec5 Add a directory separator at the end of names in tab completion list to indicate directories.
zas_
parents: 1365
diff changeset
139 {
0011d6859ec5 Add a directory separator at the end of names in tab completion list to indicate directories.
zas_
parents: 1365
diff changeset
140 list = g_list_prepend(list, path_to_utf8(name));
0011d6859ec5 Add a directory separator at the end of names in tab completion list to indicate directories.
zas_
parents: 1365
diff changeset
141 }
0011d6859ec5 Add a directory separator at the end of names in tab completion list to indicate directories.
zas_
parents: 1365
diff changeset
142 g_free(abspath);
69
31759d770628 Fri Oct 13 10:27:22 2006 John Ellis <johne@verizon.net>
gqview
parents: 12
diff changeset
143 }
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
144 }
442
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 281
diff changeset
145 closedir(dp);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
146
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
147 td->dir_path = g_strdup(path);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
148 td->file_list = list;
1385
b4e6fee484f7 Fix utf8/locale conversion warning: the path passed to isdir() is not in UTF8 (if local fs is not in UFT8) so do not use it (isdir() uses stat_utf8() which calls path_from_utf8()).
zas_
parents: 1382
diff changeset
149 g_free(pathl);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
150 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
151
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
152 static void tab_completion_destroy(GtkWidget *widget, gpointer data)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
153 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
154 TabCompData *td = data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
155
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
156 tab_completion_free_list(td);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
157 g_free(td->history_key);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
158
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
159 if (td->fd) file_dialog_close(td->fd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
160 g_free(td->fd_title);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
161
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
162 g_free(td);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
163 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
164
991
185e6a74517d Slight code redundancy reduction.
zas_
parents: 902
diff changeset
165 static gchar *tab_completion_get_text(TabCompData *td)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
166 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
167 gchar *text;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
168
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
169 text = g_strdup(gtk_entry_get_text(GTK_ENTRY(td->entry)));
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
170
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
171 if (text[0] == '~')
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
172 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
173 gchar *t = text;
720
d8a88f279aca Use expand_tilde() instead of simple concatenation, it allows correct expansion
zas_
parents: 673
diff changeset
174 text = expand_tilde(text);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
175 g_free(t);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
176 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
177
991
185e6a74517d Slight code redundancy reduction.
zas_
parents: 902
diff changeset
178 return text;
185e6a74517d Slight code redundancy reduction.
zas_
parents: 902
diff changeset
179 }
185e6a74517d Slight code redundancy reduction.
zas_
parents: 902
diff changeset
180
185e6a74517d Slight code redundancy reduction.
zas_
parents: 902
diff changeset
181 static gint tab_completion_emit_enter_signal(TabCompData *td)
185e6a74517d Slight code redundancy reduction.
zas_
parents: 902
diff changeset
182 {
185e6a74517d Slight code redundancy reduction.
zas_
parents: 902
diff changeset
183 gchar *text;
185e6a74517d Slight code redundancy reduction.
zas_
parents: 902
diff changeset
184 if (!td->enter_func) return FALSE;
185e6a74517d Slight code redundancy reduction.
zas_
parents: 902
diff changeset
185
185e6a74517d Slight code redundancy reduction.
zas_
parents: 902
diff changeset
186 text = tab_completion_get_text(td);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
187 td->enter_func(text, td->enter_data);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
188 g_free(text);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
189
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
190 return TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
191 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
192
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
193 static void tab_completion_emit_tab_signal(TabCompData *td)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
194 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
195 gchar *text;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
196 if (!td->tab_func) return;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
197
991
185e6a74517d Slight code redundancy reduction.
zas_
parents: 902
diff changeset
198 text = tab_completion_get_text(td);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
199 td->tab_func(text, td->tab_data);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
200 g_free(text);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
201 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
202
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
203 #ifdef TAB_COMPLETION_ENABLE_POPUP_MENU
1388
2496a345c452 Try to improve tab completion: when a key is pressed while tab completion menu is shown, the number of entries is reduced, dhowing all matching entries but the menu is no more closed after each key pressure. Number of possible entries in this menu was increased from 500 to 1000. Pressing TAB when path entry is empty now adds / (root directory).
zas_
parents: 1385
diff changeset
204 void tab_completion_iter_menu_items(GtkWidget *widget, gpointer data)
2496a345c452 Try to improve tab completion: when a key is pressed while tab completion menu is shown, the number of entries is reduced, dhowing all matching entries but the menu is no more closed after each key pressure. Number of possible entries in this menu was increased from 500 to 1000. Pressing TAB when path entry is empty now adds / (root directory).
zas_
parents: 1385
diff changeset
205 {
2496a345c452 Try to improve tab completion: when a key is pressed while tab completion menu is shown, the number of entries is reduced, dhowing all matching entries but the menu is no more closed after each key pressure. Number of possible entries in this menu was increased from 500 to 1000. Pressing TAB when path entry is empty now adds / (root directory).
zas_
parents: 1385
diff changeset
206 TabCompData *td = data;
2496a345c452 Try to improve tab completion: when a key is pressed while tab completion menu is shown, the number of entries is reduced, dhowing all matching entries but the menu is no more closed after each key pressure. Number of possible entries in this menu was increased from 500 to 1000. Pressing TAB when path entry is empty now adds / (root directory).
zas_
parents: 1385
diff changeset
207 GtkWidget *child;
2496a345c452 Try to improve tab completion: when a key is pressed while tab completion menu is shown, the number of entries is reduced, dhowing all matching entries but the menu is no more closed after each key pressure. Number of possible entries in this menu was increased from 500 to 1000. Pressing TAB when path entry is empty now adds / (root directory).
zas_
parents: 1385
diff changeset
208
2496a345c452 Try to improve tab completion: when a key is pressed while tab completion menu is shown, the number of entries is reduced, dhowing all matching entries but the menu is no more closed after each key pressure. Number of possible entries in this menu was increased from 500 to 1000. Pressing TAB when path entry is empty now adds / (root directory).
zas_
parents: 1385
diff changeset
209 if (!GTK_WIDGET_VISIBLE(widget)) return;
2496a345c452 Try to improve tab completion: when a key is pressed while tab completion menu is shown, the number of entries is reduced, dhowing all matching entries but the menu is no more closed after each key pressure. Number of possible entries in this menu was increased from 500 to 1000. Pressing TAB when path entry is empty now adds / (root directory).
zas_
parents: 1385
diff changeset
210
2496a345c452 Try to improve tab completion: when a key is pressed while tab completion menu is shown, the number of entries is reduced, dhowing all matching entries but the menu is no more closed after each key pressure. Number of possible entries in this menu was increased from 500 to 1000. Pressing TAB when path entry is empty now adds / (root directory).
zas_
parents: 1385
diff changeset
211 child = gtk_bin_get_child(GTK_BIN(widget));
2496a345c452 Try to improve tab completion: when a key is pressed while tab completion menu is shown, the number of entries is reduced, dhowing all matching entries but the menu is no more closed after each key pressure. Number of possible entries in this menu was increased from 500 to 1000. Pressing TAB when path entry is empty now adds / (root directory).
zas_
parents: 1385
diff changeset
212 if (GTK_IS_LABEL(child)) {
2496a345c452 Try to improve tab completion: when a key is pressed while tab completion menu is shown, the number of entries is reduced, dhowing all matching entries but the menu is no more closed after each key pressure. Number of possible entries in this menu was increased from 500 to 1000. Pressing TAB when path entry is empty now adds / (root directory).
zas_
parents: 1385
diff changeset
213 const gchar *text = gtk_label_get_text(GTK_LABEL(child));
2496a345c452 Try to improve tab completion: when a key is pressed while tab completion menu is shown, the number of entries is reduced, dhowing all matching entries but the menu is no more closed after each key pressure. Number of possible entries in this menu was increased from 500 to 1000. Pressing TAB when path entry is empty now adds / (root directory).
zas_
parents: 1385
diff changeset
214 const gchar *entry_text = gtk_entry_get_text(GTK_ENTRY(td->entry));
2496a345c452 Try to improve tab completion: when a key is pressed while tab completion menu is shown, the number of entries is reduced, dhowing all matching entries but the menu is no more closed after each key pressure. Number of possible entries in this menu was increased from 500 to 1000. Pressing TAB when path entry is empty now adds / (root directory).
zas_
parents: 1385
diff changeset
215 const gchar *prefix = filename_from_path(entry_text);
2496a345c452 Try to improve tab completion: when a key is pressed while tab completion menu is shown, the number of entries is reduced, dhowing all matching entries but the menu is no more closed after each key pressure. Number of possible entries in this menu was increased from 500 to 1000. Pressing TAB when path entry is empty now adds / (root directory).
zas_
parents: 1385
diff changeset
216 guint prefix_len = strlen(prefix);
2496a345c452 Try to improve tab completion: when a key is pressed while tab completion menu is shown, the number of entries is reduced, dhowing all matching entries but the menu is no more closed after each key pressure. Number of possible entries in this menu was increased from 500 to 1000. Pressing TAB when path entry is empty now adds / (root directory).
zas_
parents: 1385
diff changeset
217
2496a345c452 Try to improve tab completion: when a key is pressed while tab completion menu is shown, the number of entries is reduced, dhowing all matching entries but the menu is no more closed after each key pressure. Number of possible entries in this menu was increased from 500 to 1000. Pressing TAB when path entry is empty now adds / (root directory).
zas_
parents: 1385
diff changeset
218 if (strlen(text) < prefix_len || strncmp(text, prefix, prefix_len))
2496a345c452 Try to improve tab completion: when a key is pressed while tab completion menu is shown, the number of entries is reduced, dhowing all matching entries but the menu is no more closed after each key pressure. Number of possible entries in this menu was increased from 500 to 1000. Pressing TAB when path entry is empty now adds / (root directory).
zas_
parents: 1385
diff changeset
219 {
2496a345c452 Try to improve tab completion: when a key is pressed while tab completion menu is shown, the number of entries is reduced, dhowing all matching entries but the menu is no more closed after each key pressure. Number of possible entries in this menu was increased from 500 to 1000. Pressing TAB when path entry is empty now adds / (root directory).
zas_
parents: 1385
diff changeset
220 /* Hide menu items not matching */
2496a345c452 Try to improve tab completion: when a key is pressed while tab completion menu is shown, the number of entries is reduced, dhowing all matching entries but the menu is no more closed after each key pressure. Number of possible entries in this menu was increased from 500 to 1000. Pressing TAB when path entry is empty now adds / (root directory).
zas_
parents: 1385
diff changeset
221 gtk_widget_hide(widget);
2496a345c452 Try to improve tab completion: when a key is pressed while tab completion menu is shown, the number of entries is reduced, dhowing all matching entries but the menu is no more closed after each key pressure. Number of possible entries in this menu was increased from 500 to 1000. Pressing TAB when path entry is empty now adds / (root directory).
zas_
parents: 1385
diff changeset
222 }
2496a345c452 Try to improve tab completion: when a key is pressed while tab completion menu is shown, the number of entries is reduced, dhowing all matching entries but the menu is no more closed after each key pressure. Number of possible entries in this menu was increased from 500 to 1000. Pressing TAB when path entry is empty now adds / (root directory).
zas_
parents: 1385
diff changeset
223 else
2496a345c452 Try to improve tab completion: when a key is pressed while tab completion menu is shown, the number of entries is reduced, dhowing all matching entries but the menu is no more closed after each key pressure. Number of possible entries in this menu was increased from 500 to 1000. Pressing TAB when path entry is empty now adds / (root directory).
zas_
parents: 1385
diff changeset
224 {
2496a345c452 Try to improve tab completion: when a key is pressed while tab completion menu is shown, the number of entries is reduced, dhowing all matching entries but the menu is no more closed after each key pressure. Number of possible entries in this menu was increased from 500 to 1000. Pressing TAB when path entry is empty now adds / (root directory).
zas_
parents: 1385
diff changeset
225 /* Count how many choices are left in the menu */
2496a345c452 Try to improve tab completion: when a key is pressed while tab completion menu is shown, the number of entries is reduced, dhowing all matching entries but the menu is no more closed after each key pressure. Number of possible entries in this menu was increased from 500 to 1000. Pressing TAB when path entry is empty now adds / (root directory).
zas_
parents: 1385
diff changeset
226 td->choices++;
2496a345c452 Try to improve tab completion: when a key is pressed while tab completion menu is shown, the number of entries is reduced, dhowing all matching entries but the menu is no more closed after each key pressure. Number of possible entries in this menu was increased from 500 to 1000. Pressing TAB when path entry is empty now adds / (root directory).
zas_
parents: 1385
diff changeset
227 }
2496a345c452 Try to improve tab completion: when a key is pressed while tab completion menu is shown, the number of entries is reduced, dhowing all matching entries but the menu is no more closed after each key pressure. Number of possible entries in this menu was increased from 500 to 1000. Pressing TAB when path entry is empty now adds / (root directory).
zas_
parents: 1385
diff changeset
228 }
2496a345c452 Try to improve tab completion: when a key is pressed while tab completion menu is shown, the number of entries is reduced, dhowing all matching entries but the menu is no more closed after each key pressure. Number of possible entries in this menu was increased from 500 to 1000. Pressing TAB when path entry is empty now adds / (root directory).
zas_
parents: 1385
diff changeset
229 }
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
230
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
231 static gint tab_completion_popup_key_press(GtkWidget *widget, GdkEventKey *event, gpointer data)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
232 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
233 TabCompData *td = data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
234
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
235 if (event->keyval == GDK_Tab ||
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
236 event->keyval == GDK_BackSpace ||
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
237 (event->keyval >= 0x20 && event->keyval <= 0xFF) )
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
238 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
239 if (event->keyval >= 0x20 && event->keyval <= 0xFF)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
240 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
241 gchar buf[2];
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
242 gint p = -1;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
243
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
244 buf[0] = event->keyval;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
245 buf[1] = '\0';
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
246 gtk_editable_insert_text(GTK_EDITABLE(td->entry), buf, 1, &p);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
247 gtk_editable_set_position(GTK_EDITABLE(td->entry), -1);
1388
2496a345c452 Try to improve tab completion: when a key is pressed while tab completion menu is shown, the number of entries is reduced, dhowing all matching entries but the menu is no more closed after each key pressure. Number of possible entries in this menu was increased from 500 to 1000. Pressing TAB when path entry is empty now adds / (root directory).
zas_
parents: 1385
diff changeset
248
2496a345c452 Try to improve tab completion: when a key is pressed while tab completion menu is shown, the number of entries is reduced, dhowing all matching entries but the menu is no more closed after each key pressure. Number of possible entries in this menu was increased from 500 to 1000. Pressing TAB when path entry is empty now adds / (root directory).
zas_
parents: 1385
diff changeset
249 /* Reduce the number of entries in the menu */
2496a345c452 Try to improve tab completion: when a key is pressed while tab completion menu is shown, the number of entries is reduced, dhowing all matching entries but the menu is no more closed after each key pressure. Number of possible entries in this menu was increased from 500 to 1000. Pressing TAB when path entry is empty now adds / (root directory).
zas_
parents: 1385
diff changeset
250 td->choices = 0;
2496a345c452 Try to improve tab completion: when a key is pressed while tab completion menu is shown, the number of entries is reduced, dhowing all matching entries but the menu is no more closed after each key pressure. Number of possible entries in this menu was increased from 500 to 1000. Pressing TAB when path entry is empty now adds / (root directory).
zas_
parents: 1385
diff changeset
251 gtk_container_foreach(GTK_CONTAINER(widget), tab_completion_iter_menu_items, (gpointer) td);
2496a345c452 Try to improve tab completion: when a key is pressed while tab completion menu is shown, the number of entries is reduced, dhowing all matching entries but the menu is no more closed after each key pressure. Number of possible entries in this menu was increased from 500 to 1000. Pressing TAB when path entry is empty now adds / (root directory).
zas_
parents: 1385
diff changeset
252 if (td->choices > 1) return TRUE; /* multiple choices */
2496a345c452 Try to improve tab completion: when a key is pressed while tab completion menu is shown, the number of entries is reduced, dhowing all matching entries but the menu is no more closed after each key pressure. Number of possible entries in this menu was increased from 500 to 1000. Pressing TAB when path entry is empty now adds / (root directory).
zas_
parents: 1385
diff changeset
253 if (td->choices > 0) tab_completion_do(td); /* one choice */
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
254 }
1388
2496a345c452 Try to improve tab completion: when a key is pressed while tab completion menu is shown, the number of entries is reduced, dhowing all matching entries but the menu is no more closed after each key pressure. Number of possible entries in this menu was increased from 500 to 1000. Pressing TAB when path entry is empty now adds / (root directory).
zas_
parents: 1385
diff changeset
255
2496a345c452 Try to improve tab completion: when a key is pressed while tab completion menu is shown, the number of entries is reduced, dhowing all matching entries but the menu is no more closed after each key pressure. Number of possible entries in this menu was increased from 500 to 1000. Pressing TAB when path entry is empty now adds / (root directory).
zas_
parents: 1385
diff changeset
256 /* close the menu */
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
257 gtk_menu_popdown(GTK_MENU(widget));
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
258 /* doing this does not emit the "selection done" signal, unref it ourselves */
1043
5fc64d6252e7 Replaced gtk depreceated code.
bruclik
parents: 1022
diff changeset
259 #if GTK_CHECK_VERSION(2,12,0)
5fc64d6252e7 Replaced gtk depreceated code.
bruclik
parents: 1022
diff changeset
260 g_object_unref(widget);
5fc64d6252e7 Replaced gtk depreceated code.
bruclik
parents: 1022
diff changeset
261 #else
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
262 gtk_widget_unref(widget);
1043
5fc64d6252e7 Replaced gtk depreceated code.
bruclik
parents: 1022
diff changeset
263 #endif
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
264 return TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
265 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
266
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
267 return FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
268 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
269
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
270 static void tab_completion_popup_cb(GtkWidget *widget, gpointer data)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
271 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
272 gchar *name = data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
273 TabCompData *td;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
274 gchar *buf;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
275
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
276 td = g_object_get_data(G_OBJECT(widget), "tab_completion_data");
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
277 if (!td) return;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
278
721
b736a2e3129b tab_completion_popup_cb(): use g_build_filename() and simplify code.
zas_
parents: 720
diff changeset
279 buf = g_build_filename(td->dir_path, name, NULL);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
280 gtk_entry_set_text(GTK_ENTRY(td->entry), buf);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
281 gtk_editable_set_position(GTK_EDITABLE(td->entry), strlen(buf));
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
282 g_free(buf);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
283
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
284 tab_completion_emit_tab_signal(td);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
285 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
286
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
287 static void tab_completion_popup_pos_cb(GtkMenu *menu, gint *x, gint *y, gboolean *push_in, gpointer data)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
288 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
289 TabCompData *td = data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
290 gint height;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
291 PangoLayout *layout;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
292 PangoRectangle strong_pos, weak_pos;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
293 gint length;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
294 gint xoffset, yoffset;
12
147f4c4b9025 ##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents: 9
diff changeset
295 GtkRequisition req;
147f4c4b9025 ##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents: 9
diff changeset
296 GdkScreen *screen;
147f4c4b9025 ##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents: 9
diff changeset
297 gint monitor_num;
147f4c4b9025 ##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents: 9
diff changeset
298 GdkRectangle monitor;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
299
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
300 gdk_window_get_origin(td->entry->window, x, y);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
301
12
147f4c4b9025 ##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents: 9
diff changeset
302 screen = gtk_widget_get_screen(GTK_WIDGET(menu));
147f4c4b9025 ##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents: 9
diff changeset
303 monitor_num = gdk_screen_get_monitor_at_window(screen, td->entry->window);
147f4c4b9025 ##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents: 9
diff changeset
304 gdk_screen_get_monitor_geometry(screen, monitor_num, &monitor);
147f4c4b9025 ##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents: 9
diff changeset
305
147f4c4b9025 ##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents: 9
diff changeset
306 gtk_widget_size_request(GTK_WIDGET(menu), &req);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
307
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
308 length = strlen(gtk_entry_get_text(GTK_ENTRY(td->entry)));
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
309 gtk_entry_get_layout_offsets(GTK_ENTRY(td->entry), &xoffset, &yoffset);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
310
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
311 layout = gtk_entry_get_layout(GTK_ENTRY(td->entry));
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
312 pango_layout_get_cursor_pos(layout, length, &strong_pos, &weak_pos);
12
147f4c4b9025 ##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents: 9
diff changeset
313
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
314 *x += strong_pos.x / PANGO_SCALE + xoffset;
12
147f4c4b9025 ##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents: 9
diff changeset
315
147f4c4b9025 ##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents: 9
diff changeset
316 height = MIN(td->entry->requisition.height, td->entry->allocation.height);
147f4c4b9025 ##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents: 9
diff changeset
317
147f4c4b9025 ##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents: 9
diff changeset
318 if (req.height > monitor.y + monitor.height - *y - height &&
147f4c4b9025 ##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents: 9
diff changeset
319 *y - monitor.y > monitor.y + monitor.height - *y)
147f4c4b9025 ##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents: 9
diff changeset
320 {
147f4c4b9025 ##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents: 9
diff changeset
321 height = MIN(*y - monitor.y, req.height);
147f4c4b9025 ##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents: 9
diff changeset
322 gtk_widget_set_size_request(GTK_WIDGET(menu), -1, height);
147f4c4b9025 ##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents: 9
diff changeset
323 *y -= height;
147f4c4b9025 ##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents: 9
diff changeset
324 }
147f4c4b9025 ##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents: 9
diff changeset
325 else
147f4c4b9025 ##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents: 9
diff changeset
326 {
147f4c4b9025 ##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents: 9
diff changeset
327 *y += height;
147f4c4b9025 ##### Note: GQview CVS on sourceforge is not always up to date, please use #####
gqview
parents: 9
diff changeset
328 }
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
329 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
330
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
331 static void tab_completion_popup_list(TabCompData *td, GList *list)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
332 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
333 GtkWidget *menu;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
334 GList *work;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
335 GdkEvent *event;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
336 guint32 etime;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
337 gint ebutton;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
338 gint count = 0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
339
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
340 if (!list) return;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
341
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
342 #if 0
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
343 /*
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
344 * well, the menu would be too long anyway...
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
345 * (listing /dev causes gtk+ window allocation errors, -> too big a window)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
346 * this is why menu popups are disabled, this really should be a popup scrollable listview.
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
347 */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
348 if (g_list_length(list) > 200) return;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
349 #endif
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
350
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
351 menu = popup_menu_short_lived();
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
352
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
353 work = list;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
354 while (work && count < TAB_COMP_POPUP_MAX)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
355 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
356 gchar *name = work->data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
357 GtkWidget *item;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
358
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
359 item = menu_item_add_simple(menu, name, G_CALLBACK(tab_completion_popup_cb), name);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
360 g_object_set_data(G_OBJECT(item), "tab_completion_data", td);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
361
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
362 work = work->next;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
363 count++;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
364 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
365
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
366 g_signal_connect(G_OBJECT(menu), "key_press_event",
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
367 G_CALLBACK(tab_completion_popup_key_press), td);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
368
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
369 /* peek at the current event to get the time, etc. */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
370 event = gtk_get_current_event();
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
371
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
372 if (event && event->type == GDK_BUTTON_RELEASE)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
373 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
374 ebutton = event->button.button;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
375 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
376 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
377 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
378 ebutton = 0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
379 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
380
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
381 if (event)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
382 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
383 etime = gdk_event_get_time(event);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
384 gdk_event_free(event);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
385 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
386 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
387 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
388 etime = 0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
389 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
390
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
391 gtk_menu_popup(GTK_MENU(menu), NULL, NULL,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
392 tab_completion_popup_pos_cb, td, ebutton, etime);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
393 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
394
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
395 #ifndef CASE_SORT
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
396 #define CASE_SORT strcmp
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
397 #endif
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
398
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
399 static gint simple_sort(gconstpointer a, gconstpointer b)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
400 {
442
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 281
diff changeset
401 return CASE_SORT((gchar *)a, (gchar *)b);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
402 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
403
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
404 #endif
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
405
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
406 static gint tab_completion_do(TabCompData *td)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
407 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
408 const gchar *entry_text = gtk_entry_get_text(GTK_ENTRY(td->entry));
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
409 const gchar *entry_file;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
410 gchar *entry_dir;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
411 gchar *ptr;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
412 gint home_exp = FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
413
1388
2496a345c452 Try to improve tab completion: when a key is pressed while tab completion menu is shown, the number of entries is reduced, dhowing all matching entries but the menu is no more closed after each key pressure. Number of possible entries in this menu was increased from 500 to 1000. Pressing TAB when path entry is empty now adds / (root directory).
zas_
parents: 1385
diff changeset
414 if (entry_text[0] == '\0')
2496a345c452 Try to improve tab completion: when a key is pressed while tab completion menu is shown, the number of entries is reduced, dhowing all matching entries but the menu is no more closed after each key pressure. Number of possible entries in this menu was increased from 500 to 1000. Pressing TAB when path entry is empty now adds / (root directory).
zas_
parents: 1385
diff changeset
415 {
2496a345c452 Try to improve tab completion: when a key is pressed while tab completion menu is shown, the number of entries is reduced, dhowing all matching entries but the menu is no more closed after each key pressure. Number of possible entries in this menu was increased from 500 to 1000. Pressing TAB when path entry is empty now adds / (root directory).
zas_
parents: 1385
diff changeset
416 entry_dir = g_strdup(G_DIR_SEPARATOR_S); /* FIXME: root directory win32 */
2496a345c452 Try to improve tab completion: when a key is pressed while tab completion menu is shown, the number of entries is reduced, dhowing all matching entries but the menu is no more closed after each key pressure. Number of possible entries in this menu was increased from 500 to 1000. Pressing TAB when path entry is empty now adds / (root directory).
zas_
parents: 1385
diff changeset
417 gtk_entry_set_text(GTK_ENTRY(td->entry), entry_dir);
2496a345c452 Try to improve tab completion: when a key is pressed while tab completion menu is shown, the number of entries is reduced, dhowing all matching entries but the menu is no more closed after each key pressure. Number of possible entries in this menu was increased from 500 to 1000. Pressing TAB when path entry is empty now adds / (root directory).
zas_
parents: 1385
diff changeset
418 gtk_editable_set_position(GTK_EDITABLE(td->entry), strlen(entry_dir));
2496a345c452 Try to improve tab completion: when a key is pressed while tab completion menu is shown, the number of entries is reduced, dhowing all matching entries but the menu is no more closed after each key pressure. Number of possible entries in this menu was increased from 500 to 1000. Pressing TAB when path entry is empty now adds / (root directory).
zas_
parents: 1385
diff changeset
419 g_free(entry_dir);
2496a345c452 Try to improve tab completion: when a key is pressed while tab completion menu is shown, the number of entries is reduced, dhowing all matching entries but the menu is no more closed after each key pressure. Number of possible entries in this menu was increased from 500 to 1000. Pressing TAB when path entry is empty now adds / (root directory).
zas_
parents: 1385
diff changeset
420 return FALSE;
2496a345c452 Try to improve tab completion: when a key is pressed while tab completion menu is shown, the number of entries is reduced, dhowing all matching entries but the menu is no more closed after each key pressure. Number of possible entries in this menu was increased from 500 to 1000. Pressing TAB when path entry is empty now adds / (root directory).
zas_
parents: 1385
diff changeset
421 }
2496a345c452 Try to improve tab completion: when a key is pressed while tab completion menu is shown, the number of entries is reduced, dhowing all matching entries but the menu is no more closed after each key pressure. Number of possible entries in this menu was increased from 500 to 1000. Pressing TAB when path entry is empty now adds / (root directory).
zas_
parents: 1385
diff changeset
422
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
423 /* home dir expansion */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
424 if (entry_text[0] == '~')
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
425 {
720
d8a88f279aca Use expand_tilde() instead of simple concatenation, it allows correct expansion
zas_
parents: 673
diff changeset
426 entry_dir = expand_tilde(entry_text);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
427 home_exp = TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
428 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
429 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
430 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
431 entry_dir = g_strdup(entry_text);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
432 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
433
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
434 if (isfile(entry_dir))
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
435 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
436 if (home_exp)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
437 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
438 gtk_entry_set_text(GTK_ENTRY(td->entry), entry_dir);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
439 gtk_editable_set_position(GTK_EDITABLE(td->entry), strlen(entry_dir));
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
440 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
441 g_free(entry_dir);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
442 return home_exp;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
443 }
722
9a145206ec2c tab_completion_do(): use g_build_filename(), G_DIR_SEPARATOR, G_DIR_SEPARATOR_S.
zas_
parents: 721
diff changeset
444
1382
31a747f9d268 Fix tab completion when entering "/et[TAB]" it was changed to "et", this is fixed.
zas_
parents: 1371
diff changeset
445 entry_file = filename_from_path(entry_text);
31a747f9d268 Fix tab completion when entering "/et[TAB]" it was changed to "et", this is fixed.
zas_
parents: 1371
diff changeset
446
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
447 if (isdir(entry_dir) && strcmp(entry_file, ".") != 0 && strcmp(entry_file, "..") != 0)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
448 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
449 ptr = entry_dir + strlen(entry_dir) - 1;
722
9a145206ec2c tab_completion_do(): use g_build_filename(), G_DIR_SEPARATOR, G_DIR_SEPARATOR_S.
zas_
parents: 721
diff changeset
450 if (ptr[0] == G_DIR_SEPARATOR)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
451 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
452 if (home_exp)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
453 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
454 gtk_entry_set_text(GTK_ENTRY(td->entry), entry_dir);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
455 gtk_editable_set_position(GTK_EDITABLE(td->entry), strlen(entry_dir));
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
456 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
457
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
458 tab_completion_read_dir(td, entry_dir);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
459 td->file_list = g_list_sort(td->file_list, simple_sort);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
460 if (td->file_list && !td->file_list->next)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
461 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
462 gchar *buf;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
463 const gchar *file;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
464
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
465 file = td->file_list->data;
722
9a145206ec2c tab_completion_do(): use g_build_filename(), G_DIR_SEPARATOR, G_DIR_SEPARATOR_S.
zas_
parents: 721
diff changeset
466 buf = g_build_filename(entry_dir, file, NULL);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
467 if (isdir(buf))
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
468 {
722
9a145206ec2c tab_completion_do(): use g_build_filename(), G_DIR_SEPARATOR, G_DIR_SEPARATOR_S.
zas_
parents: 721
diff changeset
469 gchar *tmp = g_strconcat(buf, G_DIR_SEPARATOR_S, NULL);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
470 g_free(buf);
722
9a145206ec2c tab_completion_do(): use g_build_filename(), G_DIR_SEPARATOR, G_DIR_SEPARATOR_S.
zas_
parents: 721
diff changeset
471 buf = tmp;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
472 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
473 gtk_entry_set_text(GTK_ENTRY(td->entry), buf);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
474 gtk_editable_set_position(GTK_EDITABLE(td->entry), strlen(buf));
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
475 g_free(buf);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
476 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
477
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
478 #ifdef TAB_COMPLETION_ENABLE_POPUP_MENU
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
479
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
480 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
481 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
482 tab_completion_popup_list(td, td->file_list);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
483 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
484 #endif
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
485
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
486 g_free(entry_dir);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
487 return home_exp;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
488 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
489 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
490 {
722
9a145206ec2c tab_completion_do(): use g_build_filename(), G_DIR_SEPARATOR, G_DIR_SEPARATOR_S.
zas_
parents: 721
diff changeset
491 gchar *buf = g_strconcat(entry_dir, G_DIR_SEPARATOR_S, NULL);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
492 gtk_entry_set_text(GTK_ENTRY(td->entry), buf);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
493 gtk_editable_set_position(GTK_EDITABLE(td->entry), strlen(buf));
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
494 g_free(buf);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
495 g_free(entry_dir);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
496 return TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
497 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
498 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
499
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
500 ptr = (gchar *)filename_from_path(entry_dir);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
501 if (ptr > entry_dir) ptr--;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
502 ptr[0] = '\0';
1382
31a747f9d268 Fix tab completion when entering "/et[TAB]" it was changed to "et", this is fixed.
zas_
parents: 1371
diff changeset
503
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
504 if (strlen(entry_dir) == 0)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
505 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
506 g_free(entry_dir);
722
9a145206ec2c tab_completion_do(): use g_build_filename(), G_DIR_SEPARATOR, G_DIR_SEPARATOR_S.
zas_
parents: 721
diff changeset
507 entry_dir = g_strdup(G_DIR_SEPARATOR_S); /* FIXME: win32 */
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
508 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
509
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
510 if (isdir(entry_dir))
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
511 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
512 GList *list;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
513 GList *poss = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
514 gint l = strlen(entry_file);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
515
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
516 if (!td->dir_path || !td->file_list || strcmp(td->dir_path, entry_dir) != 0)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
517 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
518 tab_completion_read_dir(td, entry_dir);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
519 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
520
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
521 list = td->file_list;
516
b7e99bfeadc9 Convert the minority of while() to while ().
zas_
parents: 475
diff changeset
522 while (list)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
523 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
524 gchar *file = list->data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
525 if (strncmp(entry_file, file, l) == 0)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
526 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
527 poss = g_list_prepend(poss, file);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
528 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
529 list = list->next;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
530 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
531
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
532 if (poss)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
533 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
534 if (!poss->next)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
535 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
536 gchar *file = poss->data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
537 gchar *buf;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
538
722
9a145206ec2c tab_completion_do(): use g_build_filename(), G_DIR_SEPARATOR, G_DIR_SEPARATOR_S.
zas_
parents: 721
diff changeset
539 buf = g_build_filename(entry_dir, file, NULL);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
540 gtk_entry_set_text(GTK_ENTRY(td->entry), buf);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
541 gtk_editable_set_position(GTK_EDITABLE(td->entry), strlen(buf));
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
542 g_free(buf);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
543 g_list_free(poss);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
544 g_free(entry_dir);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
545 return TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
546 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
547 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
548 {
734
e6ebae313d46 Fix up some types, make some signed vs unsigned warnings quiet.
zas_
parents: 726
diff changeset
549 gsize c = strlen(entry_file);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
550 gint done = FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
551 gchar *test_file = poss->data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
552
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
553 while (!done)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
554 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
555 list = poss;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
556 if (!list) done = TRUE;
516
b7e99bfeadc9 Convert the minority of while() to while ().
zas_
parents: 475
diff changeset
557 while (list && !done)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
558 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
559 gchar *file = list->data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
560 if (strlen(file) < c || strncmp(test_file, file, c) != 0)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
561 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
562 done = TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
563 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
564 list = list->next;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
565 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
566 c++;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
567 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
568 c -= 2;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
569 if (c > 0)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
570 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
571 gchar *file;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
572 gchar *buf;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
573 file = g_strdup(test_file);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
574 file[c] = '\0';
722
9a145206ec2c tab_completion_do(): use g_build_filename(), G_DIR_SEPARATOR, G_DIR_SEPARATOR_S.
zas_
parents: 721
diff changeset
575 buf = g_build_filename(entry_dir, file, NULL);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
576 gtk_entry_set_text(GTK_ENTRY(td->entry), buf);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
577 gtk_editable_set_position(GTK_EDITABLE(td->entry), strlen(buf));
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
578
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
579 #ifdef TAB_COMPLETION_ENABLE_POPUP_MENU
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
580
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
581 poss = g_list_sort(poss, simple_sort);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
582 tab_completion_popup_list(td, poss);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
583
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
584 #endif
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
585
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
586 g_free(file);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
587 g_free(buf);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
588 g_list_free(poss);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
589 g_free(entry_dir);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
590 return TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
591 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
592 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
593 g_list_free(poss);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
594 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
595 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
596
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
597 g_free(entry_dir);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
598
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
599 return FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
600 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
601
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
602 static gint tab_completion_key_pressed(GtkWidget *widget, GdkEventKey *event, gpointer data)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
603 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
604 TabCompData *td = data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
605 gint stop_signal = FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
606
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
607 switch (event->keyval)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
608 {
442
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 281
diff changeset
609 case GDK_Tab:
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
610 if (!(event->state & GDK_CONTROL_MASK))
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
611 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
612 if (tab_completion_do(td))
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
613 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
614 tab_completion_emit_tab_signal(td);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
615 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
616 stop_signal = TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
617 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
618 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
619 case GDK_Return: case GDK_KP_Enter:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
620 if (td->fd_button &&
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
621 (event->state & GDK_CONTROL_MASK))
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
622 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
623 tab_completion_select_show(td);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
624 stop_signal = TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
625 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
626 else if (tab_completion_emit_enter_signal(td))
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
627 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
628 stop_signal = TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
629 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
630 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
631 default:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
632 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
633 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
634
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
635 if (stop_signal) g_signal_stop_emission_by_name(G_OBJECT(widget), "key_press_event");
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
636
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
637 return (stop_signal);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
638 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
639
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
640 static void tab_completion_button_pressed(GtkWidget *widget, gpointer data)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
641 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
642 TabCompData *td;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
643 GtkWidget *entry = data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
644
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
645 td = g_object_get_data(G_OBJECT(entry), "tab_completion_data");
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
646
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
647 if (!td) return;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
648
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
649 if (!GTK_WIDGET_HAS_FOCUS(entry))
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
650 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
651 gtk_widget_grab_focus(entry);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
652 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
653
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
654 if (tab_completion_do(td))
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
655 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
656 tab_completion_emit_tab_signal(td);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
657 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
658 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
659
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
660 static void tab_completion_button_size_allocate(GtkWidget *button, GtkAllocation *allocation, gpointer data)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
661 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
662 GtkWidget *parent = data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
663
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
664 if (allocation->height > parent->allocation.height)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
665 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
666 GtkAllocation button_allocation;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
667
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
668 button_allocation = button->allocation;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
669 button_allocation.height = parent->allocation.height;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
670 button_allocation.y = parent->allocation.y +
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
671 (parent->allocation.height - parent->allocation.height) / 2;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
672 gtk_widget_size_allocate(button, &button_allocation);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
673 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
674 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
675
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
676 static GtkWidget *tab_completion_create_complete_button(GtkWidget *entry, GtkWidget *parent)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
677 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
678 GtkWidget *button;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
679 GtkWidget *icon;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
680 GdkPixbuf *pixbuf;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
681
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
682 button = gtk_button_new();
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
683 GTK_WIDGET_UNSET_FLAGS(button, GTK_CAN_FOCUS);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
684 g_signal_connect(G_OBJECT(button), "size_allocate",
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
685 G_CALLBACK(tab_completion_button_size_allocate), parent);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
686 g_signal_connect(G_OBJECT(button), "clicked",
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
687 G_CALLBACK(tab_completion_button_pressed), entry);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
688
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
689 pixbuf = gdk_pixbuf_new_from_inline(-1, icon_tabcomp, FALSE, NULL);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
690 icon = gtk_image_new_from_pixbuf(pixbuf);
1043
5fc64d6252e7 Replaced gtk depreceated code.
bruclik
parents: 1022
diff changeset
691 g_object_unref(pixbuf);
5fc64d6252e7 Replaced gtk depreceated code.
bruclik
parents: 1022
diff changeset
692
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
693 gtk_container_add(GTK_CONTAINER(button), icon);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
694 gtk_widget_show(icon);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
695
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
696 return button;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
697 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
698
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
699 /*
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
700 *----------------------------------------------------------------------------
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
701 * public interface
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
702 *----------------------------------------------------------------------------
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
703 */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
704
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
705 GtkWidget *tab_completion_new_with_history(GtkWidget **entry, const gchar *text,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
706 const gchar *history_key, gint max_levels,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
707 void (*enter_func)(const gchar *, gpointer), gpointer data)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
708 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
709 GtkWidget *box;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
710 GtkWidget *combo;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
711 GtkWidget *combo_entry;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
712 GtkWidget *button;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
713 GList *work;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
714 TabCompData *td;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
715 gint n = 0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
716
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
717 box = gtk_hbox_new(FALSE, 0);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
718
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
719 combo = gtk_combo_box_entry_new_text();
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
720 gtk_box_pack_start(GTK_BOX(box), combo, TRUE, TRUE, 0);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
721 gtk_widget_show(combo);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
722
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
723 combo_entry = GTK_BIN(combo)->child;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
724 #if 0
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
725 gtk_combo_set_case_sensitive(GTK_COMBO(combo), TRUE);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
726 gtk_combo_set_use_arrows(GTK_COMBO(combo), FALSE);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
727 #endif
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
728
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
729 button = tab_completion_create_complete_button(combo_entry, combo);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
730 gtk_box_pack_start(GTK_BOX(box), button, FALSE, FALSE, 0);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
731 gtk_widget_show(button);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
732
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
733 tab_completion_add_to_entry(combo_entry, enter_func, data);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
734
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
735 td = g_object_get_data(G_OBJECT(combo_entry), "tab_completion_data");
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
736 if (!td) return NULL; /* this should never happen! */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
737
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
738 td->combo = combo;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
739 td->has_history = TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
740 td->history_key = g_strdup(history_key);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
741 td->history_levels = max_levels;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
742
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
743 work = history_list_get_by_key(td->history_key);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
744
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
745 work = history_list_get_by_key(history_key);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
746 while (work)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
747 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
748 gtk_combo_box_append_text(GTK_COMBO_BOX(combo), (gchar *)work->data);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
749 work = work->next;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
750 n++;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
751 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
752
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
753 if (text)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
754 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
755 gtk_entry_set_text(GTK_ENTRY(combo_entry), text);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
756 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
757 else if (n > 0)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
758 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
759 gtk_combo_box_set_active(GTK_COMBO_BOX(combo), 0);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
760 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
761
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
762 if (entry) *entry = combo_entry;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
763 return box;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
764 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
765
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
766 const gchar *tab_completion_set_to_last_history(GtkWidget *entry)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
767 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
768 TabCompData *td = g_object_get_data(G_OBJECT(entry), "tab_completion_data");
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
769 const gchar *buf;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
770
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
771 if (!td || !td->has_history) return NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
772
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
773 buf = history_list_find_last_path_by_key(td->history_key);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
774 if (buf)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
775 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
776 gtk_entry_set_text(GTK_ENTRY(td->entry), buf);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
777 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
778
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
779 return buf;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
780 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
781
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
782 void tab_completion_append_to_history(GtkWidget *entry, const gchar *path)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
783 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
784 TabCompData *td;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
785 GtkTreeModel *store;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
786 GList *work;
1167
e812b1a7adda Add a back button in the toolbar: it allows to go back and forth between two directories. Experimental, please test and comment on ml.
zas_
parents: 1055
diff changeset
787 gint n = 0;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
788
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
789 td = g_object_get_data(G_OBJECT(entry), "tab_completion_data");
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
790
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
791 if (!path) return;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
792
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
793 if (!td || !td->has_history) return;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
794
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
795 history_list_add_to_key(td->history_key, path, td->history_levels);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
796
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
797 gtk_combo_box_set_active(GTK_COMBO_BOX(td->combo), -1);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
798
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
799 store = gtk_combo_box_get_model(GTK_COMBO_BOX(td->combo));
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
800 gtk_list_store_clear(GTK_LIST_STORE(store));
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
801
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
802 work = history_list_get_by_key(td->history_key);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
803 while (work)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
804 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
805 gtk_combo_box_append_text(GTK_COMBO_BOX(td->combo), (gchar *)work->data);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
806 work = work->next;
1167
e812b1a7adda Add a back button in the toolbar: it allows to go back and forth between two directories. Experimental, please test and comment on ml.
zas_
parents: 1055
diff changeset
807 n++;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
808 }
1167
e812b1a7adda Add a back button in the toolbar: it allows to go back and forth between two directories. Experimental, please test and comment on ml.
zas_
parents: 1055
diff changeset
809
e812b1a7adda Add a back button in the toolbar: it allows to go back and forth between two directories. Experimental, please test and comment on ml.
zas_
parents: 1055
diff changeset
810 if (td->tab_append_func) {
e812b1a7adda Add a back button in the toolbar: it allows to go back and forth between two directories. Experimental, please test and comment on ml.
zas_
parents: 1055
diff changeset
811 td->tab_append_func(path, td->tab_append_data, n);
e812b1a7adda Add a back button in the toolbar: it allows to go back and forth between two directories. Experimental, please test and comment on ml.
zas_
parents: 1055
diff changeset
812 }
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
813 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
814
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
815 GtkWidget *tab_completion_new(GtkWidget **entry, const gchar *text,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
816 void (*enter_func)(const gchar *, gpointer), gpointer data)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
817 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
818 GtkWidget *hbox;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
819 GtkWidget *button;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
820 GtkWidget *newentry;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
821
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
822 hbox = gtk_hbox_new(FALSE, 0);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
823
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
824 newentry = gtk_entry_new();
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
825 if (text) gtk_entry_set_text(GTK_ENTRY(newentry), text);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
826 gtk_box_pack_start(GTK_BOX(hbox), newentry, TRUE, TRUE, 0);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
827 gtk_widget_show(newentry);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
828
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
829 button = tab_completion_create_complete_button(newentry, newentry);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
830 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
831 gtk_widget_show(button);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
832
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
833 tab_completion_add_to_entry(newentry, enter_func, data);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
834
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
835 if (entry) *entry = newentry;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
836 return hbox;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
837 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
838
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
839 void tab_completion_add_to_entry(GtkWidget *entry, void (*enter_func)(const gchar *, gpointer), gpointer data)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
840 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
841 TabCompData *td;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
842 if (!entry)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
843 {
673
fbebf5cf4a55 Do not use printf() directly but use new wrapper function log_printf() instead.
zas_
parents: 516
diff changeset
844 log_printf("Tab completion error: entry != NULL\n");
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
845 return;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
846 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
847
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
848 td = g_new0(TabCompData, 1);
1365
249bf204004a When g_new0() is used, drop redundant initializations to NULL, FALSE or 0.
zas_
parents: 1284
diff changeset
849
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
850 td->entry = entry;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
851 td->enter_func = enter_func;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
852 td->enter_data = data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
853
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
854 g_object_set_data(G_OBJECT(td->entry), "tab_completion_data", td);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
855
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
856 g_signal_connect(G_OBJECT(entry), "key_press_event",
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
857 G_CALLBACK(tab_completion_key_pressed), td);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
858 g_signal_connect(G_OBJECT(entry), "destroy",
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
859 G_CALLBACK(tab_completion_destroy), td);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
860 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
861
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
862 void tab_completion_add_tab_func(GtkWidget *entry, void (*tab_func)(const gchar *, gpointer), gpointer data)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
863 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
864 TabCompData *td = g_object_get_data(G_OBJECT(entry), "tab_completion_data");
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
865
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
866 if (!td) return;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
867
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
868 td->tab_func = tab_func;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
869 td->tab_data = data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
870 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
871
1167
e812b1a7adda Add a back button in the toolbar: it allows to go back and forth between two directories. Experimental, please test and comment on ml.
zas_
parents: 1055
diff changeset
872 /* Add a callback function called when a new entry is appended to the list */
e812b1a7adda Add a back button in the toolbar: it allows to go back and forth between two directories. Experimental, please test and comment on ml.
zas_
parents: 1055
diff changeset
873 void tab_completion_add_append_func(GtkWidget *entry, void (*tab_append_func)(const gchar *, gpointer, gint), gpointer data)
e812b1a7adda Add a back button in the toolbar: it allows to go back and forth between two directories. Experimental, please test and comment on ml.
zas_
parents: 1055
diff changeset
874 {
e812b1a7adda Add a back button in the toolbar: it allows to go back and forth between two directories. Experimental, please test and comment on ml.
zas_
parents: 1055
diff changeset
875 TabCompData *td = g_object_get_data(G_OBJECT(entry), "tab_completion_data");
e812b1a7adda Add a back button in the toolbar: it allows to go back and forth between two directories. Experimental, please test and comment on ml.
zas_
parents: 1055
diff changeset
876
e812b1a7adda Add a back button in the toolbar: it allows to go back and forth between two directories. Experimental, please test and comment on ml.
zas_
parents: 1055
diff changeset
877 if (!td) return;
e812b1a7adda Add a back button in the toolbar: it allows to go back and forth between two directories. Experimental, please test and comment on ml.
zas_
parents: 1055
diff changeset
878
e812b1a7adda Add a back button in the toolbar: it allows to go back and forth between two directories. Experimental, please test and comment on ml.
zas_
parents: 1055
diff changeset
879 td->tab_append_func = tab_append_func;
e812b1a7adda Add a back button in the toolbar: it allows to go back and forth between two directories. Experimental, please test and comment on ml.
zas_
parents: 1055
diff changeset
880 td->tab_append_data = data;
e812b1a7adda Add a back button in the toolbar: it allows to go back and forth between two directories. Experimental, please test and comment on ml.
zas_
parents: 1055
diff changeset
881 }
e812b1a7adda Add a back button in the toolbar: it allows to go back and forth between two directories. Experimental, please test and comment on ml.
zas_
parents: 1055
diff changeset
882
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
883 gchar *remove_trailing_slash(const gchar *path)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
884 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
885 gint l;
260
249a9a6cd27f Improve remove_trailing_slash() so it allocates no more than
zas_
parents: 254
diff changeset
886
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
887 if (!path) return NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
888
260
249a9a6cd27f Improve remove_trailing_slash() so it allocates no more than
zas_
parents: 254
diff changeset
889 l = strlen(path);
726
a1dcef8cd1ae Use G_DIR_SEPARATOR where applicable.
zas_
parents: 722
diff changeset
890 while (l > 1 && path[l - 1] == G_DIR_SEPARATOR) l--;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
891
260
249a9a6cd27f Improve remove_trailing_slash() so it allocates no more than
zas_
parents: 254
diff changeset
892 return g_strndup(path, l);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
893 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
894
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
895 static void tab_completion_select_cancel_cb(FileDialog *fd, gpointer data)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
896 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
897 TabCompData *td = data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
898
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
899 td->fd = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
900 file_dialog_close(fd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
901 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
902
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
903 static void tab_completion_select_ok_cb(FileDialog *fd, gpointer data)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
904 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
905 TabCompData *td = data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
906
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
907 gtk_entry_set_text(GTK_ENTRY(td->entry), gtk_entry_get_text(GTK_ENTRY(fd->entry)));
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
908
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
909 tab_completion_select_cancel_cb(fd, data);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
910
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
911 tab_completion_emit_enter_signal(td);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
912 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
913
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
914 static void tab_completion_select_show(TabCompData *td)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
915 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
916 const gchar *title;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
917 const gchar *path;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
918
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
919 if (td->fd)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
920 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
921 gtk_window_present(GTK_WINDOW(GENERIC_DIALOG(td->fd)->dialog));
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
922 return;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
923 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
924
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
925 title = (td->fd_title) ? td->fd_title : _("Select path");
1174
0bea79d87065 Drop useless wmclass stuff. Gtk will take care of it and as said in the documentation using gtk_window_set_wmclass() is sort of pointless.
zas_
parents: 1167
diff changeset
926 td->fd = file_dialog_new(title, "select_path", td->entry,
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
927 tab_completion_select_cancel_cb, td);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
928 file_dialog_add_button(td->fd, GTK_STOCK_OK, NULL,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
929 tab_completion_select_ok_cb, TRUE);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
930
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
931 generic_dialog_add_message(GENERIC_DIALOG(td->fd), NULL, title, NULL);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
932
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
933 path = gtk_entry_get_text(GTK_ENTRY(td->entry));
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
934 if (strlen(path) == 0) path = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
935 if (td->fd_folders_only)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
936 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
937 file_dialog_add_path_widgets(td->fd, NULL, path, td->history_key, NULL, NULL);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
938 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
939 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
940 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
941 file_dialog_add_path_widgets(td->fd, NULL, path, td->history_key, "*", _("All files"));
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
942 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
943
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
944 gtk_widget_show(GENERIC_DIALOG(td->fd)->dialog);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
945 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
946
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
947 static void tab_completion_select_pressed(GtkWidget *widget, gpointer data)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
948 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
949 TabCompData *td = data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
950
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
951 tab_completion_select_show(td);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
952 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
953
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
954 void tab_completion_add_select_button(GtkWidget *entry, const gchar *title, gint folders_only)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
955 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
956 TabCompData *td;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
957 GtkWidget *parent;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
958 GtkWidget *hbox;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
959
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
960 td = g_object_get_data(G_OBJECT(entry), "tab_completion_data");
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
961
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
962 if (!td) return;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
963
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
964 g_free(td->fd_title);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
965 td->fd_title = g_strdup(title);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
966 td->fd_folders_only = folders_only;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
967
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
968 if (td->fd_button) return;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
969
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
970 parent = (td->combo) ? td->combo : td->entry;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
971
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
972 hbox = gtk_widget_get_parent(parent);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
973 if (!GTK_IS_BOX(hbox)) return;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
974
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
975 td->fd_button = gtk_button_new_with_label("...");
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
976 g_signal_connect(G_OBJECT(td->fd_button), "size_allocate",
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
977 G_CALLBACK(tab_completion_button_size_allocate), parent);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
978 g_signal_connect(G_OBJECT(td->fd_button), "clicked",
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
979 G_CALLBACK(tab_completion_select_pressed), td);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
980
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
981 gtk_box_pack_start(GTK_BOX(hbox), td->fd_button, FALSE, FALSE, 0);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
982
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
983 gtk_widget_show(td->fd_button);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
984 }
1055
1646720364cf Adding a vim modeline to all files - patch by Klaus Ethgen
nadvornik
parents: 1043
diff changeset
985 /* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */