annotate src/tabcomp.c @ 8:e0d0593d519e

Sync to GQview 1.5.9 release. ######## DO NOT BASE ENHANCEMENTS OR TRANSLATION UPDATES ON CODE IN THIS CVS! This CVS is never up to date with current development and is provided solely for reference purposes, please use the latest official release package when making any changes or translation updates. ########
author gqview
date Sat, 26 Feb 2005 00:07:07 +0000
parents c0e337a01cb7
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1 /*
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
2 * GQview image viewer
3
gqview
parents: 1
diff changeset
3 * (C)2000 John Ellis
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
4 *
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
5 * Author: John Ellis
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
6 *
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
7 */
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
8
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
9 #include "gqview.h"
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
10 #include <gdk/gdkkeysyms.h> /* for key values */
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
11
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
12 #include "tabcomp.xpm"
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
13
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
14 /* ----------------------------------------------------------------
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
15 Tab completion routines, can be connected to any gtkentry widget
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
16 using the tab_completion_add_to_entry() function.
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
17 Use remove_trailing_slash() to strip the trailing '/'.
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
18 ----------------------------------------------------------------*/
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
19
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
20 typedef struct _TabCompData TabCompData;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
21 struct _TabCompData
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
22 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
23 GtkWidget *entry;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
24 gchar *dir_path;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
25 GList *file_list;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
26 void (*enter_func)(gchar *, gpointer);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
27 void (*tab_func)(gchar *, gpointer);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
28 gpointer enter_data;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
29 gpointer tab_data;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
30
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
31 GtkWidget *combo;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
32 gint has_history;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
33 gchar *history_key;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
34 gint history_levels;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
35 };
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
36
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
37 typedef struct _HistoryData HistoryData;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
38 struct _HistoryData
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
39 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
40 gchar *key;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
41 GList *list;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
42 };
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
43
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
44 static GList *history_list = NULL;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
45
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
46 static void tab_completion_free_list(TabCompData *td);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
47 static void tab_completion_read_dir(TabCompData *td, gchar *path);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
48 static void tab_completion_destroy(GtkWidget *widget, gpointer data);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
49 static void tab_completion_emit_enter_signal(TabCompData *td);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
50 static void tab_completion_emit_tab_signal(TabCompData *td);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
51 static gint tab_completion_do(TabCompData *td);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
52 static gint tab_completion_key_pressed(GtkWidget *widget, GdkEventKey *event, gpointer data);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
53 static void tab_completion_button_pressed(GtkWidget *widget, gpointer data);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
54 static GtkWidget *tab_completion_create_complete_button(GtkWidget *window, GtkWidget *entry);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
55
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
56 static void history_list_free(HistoryData *hd);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
57 static HistoryData *history_list_find_by_key(const gchar* key);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
58 static gchar *history_list_find_last_path_by_key(const gchar* key);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
59 static void history_list_free_key(const gchar *key);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
60 static void history_list_add_to_key(const gchar *key, const gchar *path, gint max);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
61
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
62 static void history_list_free(HistoryData *hd)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
63 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
64 GList *work;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
65
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
66 if (!hd) return;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
67
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
68 work = hd->list;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
69 while(work)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
70 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
71 g_free(work->data);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
72 work = work->next;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
73 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
74
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
75 g_free(hd->key);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
76 g_free(hd);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
77 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
78
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
79 static HistoryData *history_list_find_by_key(const gchar* key)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
80 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
81 GList *work = history_list;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
82 while(work)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
83 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
84 HistoryData *hd = work->data;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
85 if (strcmp(hd->key, key) == 0) return hd;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
86 work = work->next;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
87 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
88 return NULL;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
89 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
90
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
91 static gchar *history_list_find_last_path_by_key(const gchar* key)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
92 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
93 HistoryData *hd;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
94 hd = history_list_find_by_key(key);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
95 if (!hd || !hd->list) return NULL;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
96
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
97 return hd->list->data;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
98 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
99
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
100 static void history_list_free_key(const gchar *key)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
101 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
102 HistoryData *hd;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
103 hd = history_list_find_by_key(key);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
104 if (!hd) return;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
105
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
106 history_list = g_list_remove(history_list, hd);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
107 history_list_free(hd);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
108 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
109
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
110 static void history_list_add_to_key(const gchar *key, const gchar *path, gint max)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
111 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
112 HistoryData *hd;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
113 GList *work;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
114
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
115 hd = history_list_find_by_key(key);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
116 if (!hd)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
117 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
118 hd = g_new(HistoryData, 1);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
119 hd->key = g_strdup(key);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
120 hd->list = NULL;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
121 history_list = g_list_prepend(history_list, hd);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
122 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
123
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
124 /* if already in the list, simply move it to the top */
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
125 work = hd->list;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
126 while(work)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
127 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
128 gchar *buf = work->data;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
129 work = work->next;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
130 if (strcmp(buf, path) == 0)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
131 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
132 hd->list = g_list_remove(hd->list, buf);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
133 hd->list = g_list_prepend(hd->list, buf);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
134 return;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
135 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
136 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
137
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
138 hd->list = g_list_prepend(hd->list, g_strdup(path));
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
139
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
140 if (max > 0)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
141 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
142 while(hd->list && g_list_length(hd->list) > max)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
143 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
144 GList *work = g_list_last(hd->list);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
145 gchar *buf = work->data;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
146 hd->list = g_list_remove(hd->list, buf);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
147 g_free(buf);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
148 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
149 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
150 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
151
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
152 static void tab_completion_free_list(TabCompData *td)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
153 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
154 GList *list;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
155
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
156 g_free(td->dir_path);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
157 td->dir_path = NULL;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
158
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
159 list = td->file_list;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
160
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
161 while(list)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
162 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
163 g_free(list->data);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
164 list = list->next;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
165 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
166
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
167 g_list_free(td->file_list);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
168 td->file_list = NULL;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
169 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
170
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
171 static void tab_completion_read_dir(TabCompData *td, gchar *path)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
172 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
173 DIR *dp;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
174 struct dirent *dir;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
175 GList *list = NULL;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
176
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
177 tab_completion_free_list(td);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
178
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
179 if((dp = opendir(path))==NULL)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
180 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
181 /* dir not found */
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
182 return;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
183 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
184 while ((dir = readdir(dp)) != NULL)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
185 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
186 /* skips removed files */
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
187 if (dir->d_ino > 0)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
188 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
189 gchar *name = dir->d_name;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
190 if (strcmp(name, ".") != 0 && strcmp(name, "..") != 0)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
191 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
192 list = g_list_prepend(list, g_strdup(name));
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
193 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
194 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
195 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
196 closedir(dp);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
197
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
198 td->dir_path = g_strdup(path);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
199 td->file_list = list;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
200 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
201
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
202 static void tab_completion_destroy(GtkWidget *widget, gpointer data)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
203 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
204 TabCompData *td = data;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
205 tab_completion_free_list(td);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
206 g_free(td->history_key);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
207 g_free(td);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
208 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
209
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
210 static void tab_completion_emit_enter_signal(TabCompData *td)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
211 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
212 gchar *text;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
213 if (!td->enter_func) return;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
214
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
215 text = g_strdup(gtk_entry_get_text(GTK_ENTRY(td->entry)));
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
216
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
217 if (text[0] == '~')
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
218 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
219 gchar *t = text;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
220 text = g_strconcat(homedir(), t + 1, NULL);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
221 g_free(t);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
222 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
223
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
224 td->enter_func(text, td->enter_data);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
225 g_free(text);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
226 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
227
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
228 static void tab_completion_emit_tab_signal(TabCompData *td)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
229 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
230 gchar *text;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
231 if (!td->tab_func) return;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
232
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
233 text = g_strdup(gtk_entry_get_text(GTK_ENTRY(td->entry)));
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
234
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
235 if (text[0] == '~')
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
236 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
237 gchar *t = text;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
238 text = g_strconcat(homedir(), t + 1, NULL);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
239 g_free(t);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
240 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
241
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
242 td->tab_func(text, td->tab_data);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
243 g_free(text);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
244 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
245
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
246 static gint tab_completion_do(TabCompData *td)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
247 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
248 gchar *entry_text = gtk_entry_get_text(GTK_ENTRY(td->entry));
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
249 gchar *entry_file;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
250 gchar *entry_dir;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
251 gchar *ptr;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
252 gint home_exp = FALSE;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
253
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
254 /* home dir expansion */
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
255 if (entry_text[0] == '~')
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
256 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
257 entry_dir = g_strconcat(homedir(), entry_text + 1, NULL);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
258 home_exp = TRUE;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
259 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
260 else
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
261 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
262 entry_dir = g_strdup(entry_text);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
263 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
264
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
265 entry_file = filename_from_path(entry_text);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
266
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
267 if (isfile(entry_dir))
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
268 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
269 if (home_exp)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
270 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
271 gtk_entry_set_text(GTK_ENTRY(td->entry), entry_dir);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
272 gtk_entry_set_position(GTK_ENTRY(td->entry), strlen(entry_dir));
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
273 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
274 g_free(entry_dir);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
275 return home_exp;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
276 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
277 if (isdir(entry_dir) && strcmp(entry_file, ".") != 0 && strcmp(entry_file, "..") != 0)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
278 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
279 ptr = entry_dir + strlen(entry_dir) - 1;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
280 if (ptr[0] == '/')
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
281 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
282 if (home_exp)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
283 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
284 gtk_entry_set_text(GTK_ENTRY(td->entry), entry_dir);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
285 gtk_entry_set_position(GTK_ENTRY(td->entry), strlen(entry_dir));
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
286 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
287 g_free(entry_dir);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
288 return home_exp;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
289 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
290 else
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
291 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
292 gchar *buf = g_strconcat(entry_dir, "/", NULL);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
293 gtk_entry_set_text(GTK_ENTRY(td->entry), buf);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
294 gtk_entry_set_position(GTK_ENTRY(td->entry), strlen(buf));
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
295 g_free(buf);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
296 g_free(entry_dir);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
297 return TRUE;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
298 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
299 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
300
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
301 ptr = filename_from_path(entry_dir);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
302 if (ptr > entry_dir) ptr--;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
303 ptr[0] = '\0';
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
304
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
305 if (strlen(entry_dir) == 0)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
306 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
307 g_free(entry_dir);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
308 entry_dir = g_strdup("/");
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
309 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
310
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
311 if (isdir(entry_dir))
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
312 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
313 GList *list;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
314 GList *poss = NULL;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
315 gint l = strlen(entry_file);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
316
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
317 if (!td->dir_path || !td->file_list || strcmp(td->dir_path, entry_dir) != 0)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
318 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
319 tab_completion_read_dir(td, entry_dir);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
320 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
321
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
322 if (strcmp(entry_dir, "/") == 0) entry_dir[0] = '\0';
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
323
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
324 list = td->file_list;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
325 while(list)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
326 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
327 gchar *file = list->data;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
328 if (strncmp(entry_file, file, l) == 0)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
329 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
330 poss = g_list_prepend(poss, file);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
331 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
332 list = list->next;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
333 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
334
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
335 if (poss)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
336 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
337 if (!poss->next)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
338 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
339 gchar *file = poss->data;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
340 gchar *buf;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
341
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
342 buf = g_strconcat(entry_dir, "/", file, NULL);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
343
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
344 if (isdir(buf))
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
345 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
346 g_free(buf);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
347 buf = g_strconcat(entry_dir, "/", file, "/", NULL);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
348 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
349 gtk_entry_set_text(GTK_ENTRY(td->entry), buf);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
350 gtk_entry_set_position(GTK_ENTRY(td->entry), strlen(buf));
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
351 g_free(buf);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
352 g_list_free(poss);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
353 g_free(entry_dir);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
354 return TRUE;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
355 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
356 else
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
357 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
358 gint c = strlen(entry_file);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
359 gint done = FALSE;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
360 gchar *test_file = poss->data;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
361
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
362 while (!done)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
363 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
364 list = poss;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
365 if (!list) done = TRUE;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
366 while(list && !done)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
367 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
368 gchar *file = list->data;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
369 if (strlen(file) < c || strncmp(test_file, file, c) != 0)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
370 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
371 done = TRUE;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
372 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
373 list = list->next;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
374 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
375 c++;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
376 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
377 c -= 2;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
378 if (c > 0)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
379 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
380 gchar *file;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
381 gchar *buf;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
382 file = g_strdup(test_file);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
383 file[c] = '\0';
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
384 buf = g_strconcat(entry_dir, "/", file, NULL);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
385 gtk_entry_set_text(GTK_ENTRY(td->entry), buf);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
386 gtk_entry_set_position(GTK_ENTRY(td->entry), strlen(buf));
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
387 g_free(file);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
388 g_free(buf);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
389 g_list_free(poss);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
390 g_free(entry_dir);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
391 return TRUE;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
392 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
393 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
394 g_list_free(poss);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
395 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
396 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
397
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
398 g_free(entry_dir);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
399
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
400 return FALSE;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
401 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
402
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
403 static gint tab_completion_key_pressed(GtkWidget *widget, GdkEventKey *event, gpointer data)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
404 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
405 TabCompData *td = data;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
406 gint stop_signal = FALSE;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
407
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
408 switch (event->keyval)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
409 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
410 case GDK_Tab:
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
411 if (tab_completion_do(td))
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
412 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
413 tab_completion_emit_tab_signal(td);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
414 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
415 stop_signal = TRUE;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
416 break;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
417 case GDK_Return:
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
418 tab_completion_emit_enter_signal(td);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
419 stop_signal = TRUE;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
420 break;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
421 default:
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
422 break;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
423 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
424
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
425 if (stop_signal)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
426 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
427 if (stop_signal) gtk_signal_emit_stop_by_name(GTK_OBJECT(widget), "key_press_event");
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
428 return TRUE;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
429 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
430
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
431 return FALSE;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
432 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
433
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
434 static void tab_completion_button_pressed(GtkWidget *widget, gpointer data)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
435 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
436 TabCompData *td;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
437 GtkWidget *entry = data;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
438
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
439 td = gtk_object_get_data(GTK_OBJECT(entry), "tab_completion_data");
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
440
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
441 if (!td) return;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
442
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
443 if (!GTK_WIDGET_HAS_FOCUS(entry))
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
444 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
445 gtk_widget_grab_focus(entry);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
446 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
447
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
448 if (tab_completion_do(td))
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
449 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
450 tab_completion_emit_tab_signal(td);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
451 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
452 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
453
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
454 static GtkWidget *tab_completion_create_complete_button(GtkWidget *window, GtkWidget *entry)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
455 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
456 GtkWidget *button;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
457 GtkWidget *icon;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
458 GdkPixmap *pixmap = NULL;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
459 GdkBitmap *mask = NULL;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
460 GtkStyle *style;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
461
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
462 style = gtk_widget_get_style(window);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
463 pixmap = gdk_pixmap_create_from_xpm_d(window->window, &mask,
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
464 &style->bg[GTK_STATE_NORMAL], (gchar **)tabcomp_xpm);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
465
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
466 button = gtk_button_new();
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
467 GTK_WIDGET_UNSET_FLAGS(button, GTK_CAN_FOCUS);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
468 gtk_signal_connect(GTK_OBJECT(button), "clicked", (GtkSignalFunc) tab_completion_button_pressed, entry);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
469
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
470 icon = gtk_pixmap_new(pixmap, mask);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
471 gtk_container_add(GTK_CONTAINER(button), icon);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
472 gtk_widget_show(icon);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
473
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
474 return button;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
475 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
476
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
477 /*
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
478 *----------------------------------------------------------------------------
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
479 * public interface
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
480 *----------------------------------------------------------------------------
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
481 */
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
482
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
483 GtkWidget *tab_completion_new_with_history(GtkWidget **entry, GtkWidget *window, gchar *text,
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
484 const gchar *history_key, gint max_levels,
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
485 void (*enter_func)(gchar *, gpointer), gpointer data)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
486 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
487 GtkWidget *combo;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
488 GtkWidget *button;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
489 HistoryData *hd;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
490 TabCompData *td;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
491
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
492 combo = gtk_combo_new();
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
493 gtk_combo_set_use_arrows(GTK_COMBO(combo), FALSE);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
494
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
495 button = tab_completion_create_complete_button(window, GTK_COMBO(combo)->entry);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
496 gtk_box_pack_start(GTK_BOX(combo), button, FALSE, FALSE, 0);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
497 gtk_box_reorder_child(GTK_BOX(combo), button, 1);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
498 gtk_widget_show(button);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
499
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
500 tab_completion_add_to_entry(GTK_COMBO(combo)->entry, enter_func, data);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
501
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
502 td = gtk_object_get_data(GTK_OBJECT(GTK_COMBO(combo)->entry), "tab_completion_data");
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
503 if (!td) return; /* this should never happen! */
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
504
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
505 td->combo = combo;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
506 td->has_history = TRUE;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
507 td->history_key = g_strdup(history_key);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
508 td->history_levels = max_levels;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
509
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
510 hd = history_list_find_by_key(td->history_key);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
511 if (hd && hd->list)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
512 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
513 gtk_combo_set_popdown_strings(GTK_COMBO(combo), hd->list);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
514 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
515
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
516 if (text) gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(combo)->entry), text);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
517
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
518 if (entry) *entry = GTK_COMBO(combo)->entry;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
519 return combo;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
520 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
521
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
522 gchar *tab_completion_set_to_last_history(GtkWidget *entry)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
523 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
524 TabCompData *td = gtk_object_get_data(GTK_OBJECT(entry), "tab_completion_data");
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
525 gchar *buf;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
526
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
527 if (!td || !td->has_history) return NULL;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
528
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
529 buf = history_list_find_last_path_by_key(td->history_key);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
530 if (buf)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
531 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
532 gtk_entry_set_text(GTK_ENTRY(td->entry), buf);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
533 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
534
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
535 return buf;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
536 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
537
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
538 void tab_completion_append_to_history(GtkWidget *entry, gchar *path)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
539 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
540 TabCompData *td = gtk_object_get_data(GTK_OBJECT(entry), "tab_completion_data");
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
541 HistoryData *hd;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
542
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
543 if (!td || !td->has_history) return;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
544
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
545 history_list_add_to_key(td->history_key, path, td->history_levels);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
546 hd = history_list_find_by_key(td->history_key);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
547 if (hd && hd->list)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
548 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
549 gtk_combo_set_popdown_strings(GTK_COMBO(td->combo), hd->list);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
550 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
551 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
552
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
553 GtkWidget *tab_completion_new(GtkWidget **entry, GtkWidget *window, gchar *text,
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
554 void (*enter_func)(gchar *, gpointer), gpointer data)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
555 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
556 GtkWidget *hbox;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
557 GtkWidget *button;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
558 GtkWidget *newentry;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
559
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
560 hbox = gtk_hbox_new(FALSE, 0);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
561
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
562 newentry = gtk_entry_new();
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
563 if (text) gtk_entry_set_text(GTK_ENTRY(newentry), text);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
564 gtk_box_pack_start(GTK_BOX(hbox), newentry, TRUE, TRUE, 0);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
565 gtk_widget_show(newentry);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
566
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
567 button = tab_completion_create_complete_button(window, newentry);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
568 gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
569 gtk_widget_show(button);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
570
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
571 tab_completion_add_to_entry(newentry, enter_func, data);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
572
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
573 if (entry) *entry = newentry;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
574 return hbox;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
575 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
576
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
577 void tab_completion_add_to_entry(GtkWidget *entry, void (*enter_func)(gchar *, gpointer), gpointer data)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
578 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
579 TabCompData *td;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
580 if (!entry)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
581 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
582 printf("Tab completion error: entry != NULL\n");
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
583 return;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
584 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
585
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
586 td = g_new0(TabCompData, 1);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
587 td->entry = entry;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
588 td->dir_path = NULL;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
589 td->file_list = NULL;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
590 td->enter_func = enter_func;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
591 td->enter_data = data;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
592 td->tab_func = NULL;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
593 td->tab_data = NULL;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
594
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
595 td->has_history = FALSE;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
596 td->history_key = NULL;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
597 td->history_levels = 0;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
598
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
599 gtk_object_set_data(GTK_OBJECT(td->entry), "tab_completion_data", td);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
600
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
601 gtk_signal_connect(GTK_OBJECT(entry), "key_press_event",
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
602 (GtkSignalFunc) tab_completion_key_pressed, td);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
603 gtk_signal_connect(GTK_OBJECT(entry), "destroy",
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
604 (GtkSignalFunc) tab_completion_destroy, td);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
605 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
606
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
607 void tab_completion_add_tab_func(GtkWidget *entry, void (*tab_func)(gchar *, gpointer), gpointer data)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
608 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
609 TabCompData *td = gtk_object_get_data(GTK_OBJECT(entry), "tab_completion_data");
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
610
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
611 if (!td) return;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
612
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
613 td->tab_func = tab_func;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
614 td->tab_data = data;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
615 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
616
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
617 gchar *remove_trailing_slash(gchar *path)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
618 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
619 gchar *ret;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
620 gint l;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
621 if (!path) return NULL;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
622
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
623 ret = g_strdup(path);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
624 l = strlen(ret);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
625 if (l > 1 && ret[l - 1] == '/') ret[l - 1] = '\0';
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
626
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
627 return ret;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
628 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
629