Mercurial > pidgin
annotate finch/libgnt/gntentry.c @ 30246:3fdb8ef0fec7
Whoops.
author | Sadrul Habib Chowdhury <imadil@gmail.com> |
---|---|
date | Mon, 05 Jul 2010 15:03:28 +0000 |
parents | aaec35719201 |
children | 7c871249318b |
rev | line source |
---|---|
17928
8410511f4dbb
applied changes from 016401bd409e6229fae0ab1e80d9fef9365511b3
Eric Polino <aluink@pidgin.im>
parents:
16899
diff
changeset
|
1 /** |
8410511f4dbb
applied changes from 016401bd409e6229fae0ab1e80d9fef9365511b3
Eric Polino <aluink@pidgin.im>
parents:
16899
diff
changeset
|
2 * GNT - The GLib Ncurses Toolkit |
8410511f4dbb
applied changes from 016401bd409e6229fae0ab1e80d9fef9365511b3
Eric Polino <aluink@pidgin.im>
parents:
16899
diff
changeset
|
3 * |
8410511f4dbb
applied changes from 016401bd409e6229fae0ab1e80d9fef9365511b3
Eric Polino <aluink@pidgin.im>
parents:
16899
diff
changeset
|
4 * GNT is the legal property of its developers, whose names are too numerous |
8410511f4dbb
applied changes from 016401bd409e6229fae0ab1e80d9fef9365511b3
Eric Polino <aluink@pidgin.im>
parents:
16899
diff
changeset
|
5 * to list here. Please refer to the COPYRIGHT file distributed with this |
8410511f4dbb
applied changes from 016401bd409e6229fae0ab1e80d9fef9365511b3
Eric Polino <aluink@pidgin.im>
parents:
16899
diff
changeset
|
6 * source distribution. |
8410511f4dbb
applied changes from 016401bd409e6229fae0ab1e80d9fef9365511b3
Eric Polino <aluink@pidgin.im>
parents:
16899
diff
changeset
|
7 * |
8410511f4dbb
applied changes from 016401bd409e6229fae0ab1e80d9fef9365511b3
Eric Polino <aluink@pidgin.im>
parents:
16899
diff
changeset
|
8 * This library is free software; you can redistribute it and/or modify |
8410511f4dbb
applied changes from 016401bd409e6229fae0ab1e80d9fef9365511b3
Eric Polino <aluink@pidgin.im>
parents:
16899
diff
changeset
|
9 * it under the terms of the GNU General Public License as published by |
8410511f4dbb
applied changes from 016401bd409e6229fae0ab1e80d9fef9365511b3
Eric Polino <aluink@pidgin.im>
parents:
16899
diff
changeset
|
10 * the Free Software Foundation; either version 2 of the License, or |
8410511f4dbb
applied changes from 016401bd409e6229fae0ab1e80d9fef9365511b3
Eric Polino <aluink@pidgin.im>
parents:
16899
diff
changeset
|
11 * (at your option) any later version. |
8410511f4dbb
applied changes from 016401bd409e6229fae0ab1e80d9fef9365511b3
Eric Polino <aluink@pidgin.im>
parents:
16899
diff
changeset
|
12 * |
8410511f4dbb
applied changes from 016401bd409e6229fae0ab1e80d9fef9365511b3
Eric Polino <aluink@pidgin.im>
parents:
16899
diff
changeset
|
13 * This program is distributed in the hope that it will be useful, |
8410511f4dbb
applied changes from 016401bd409e6229fae0ab1e80d9fef9365511b3
Eric Polino <aluink@pidgin.im>
parents:
16899
diff
changeset
|
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
8410511f4dbb
applied changes from 016401bd409e6229fae0ab1e80d9fef9365511b3
Eric Polino <aluink@pidgin.im>
parents:
16899
diff
changeset
|
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
8410511f4dbb
applied changes from 016401bd409e6229fae0ab1e80d9fef9365511b3
Eric Polino <aluink@pidgin.im>
parents:
16899
diff
changeset
|
16 * GNU General Public License for more details. |
8410511f4dbb
applied changes from 016401bd409e6229fae0ab1e80d9fef9365511b3
Eric Polino <aluink@pidgin.im>
parents:
16899
diff
changeset
|
17 * |
8410511f4dbb
applied changes from 016401bd409e6229fae0ab1e80d9fef9365511b3
Eric Polino <aluink@pidgin.im>
parents:
16899
diff
changeset
|
18 * You should have received a copy of the GNU General Public License |
8410511f4dbb
applied changes from 016401bd409e6229fae0ab1e80d9fef9365511b3
Eric Polino <aluink@pidgin.im>
parents:
16899
diff
changeset
|
19 * along with this program; if not, write to the Free Software |
19681
44b4e8bd759b
The FSF changed its address a while ago; our files were out of date.
John Bailey <rekkanoryo@rekkanoryo.org>
parents:
18873
diff
changeset
|
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA |
17928
8410511f4dbb
applied changes from 016401bd409e6229fae0ab1e80d9fef9365511b3
Eric Polino <aluink@pidgin.im>
parents:
16899
diff
changeset
|
21 */ |
8410511f4dbb
applied changes from 016401bd409e6229fae0ab1e80d9fef9365511b3
Eric Polino <aluink@pidgin.im>
parents:
16899
diff
changeset
|
22 |
15817 | 23 #include <ctype.h> |
24 #include <string.h> | |
25 | |
28604
a18f421696dc
Fix showing umlauts etc. on non-utf8 locales.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28454
diff
changeset
|
26 #include "gntinternal.h" |
15817 | 27 #include "gntbox.h" |
28 #include "gntentry.h" | |
18382
aa60f5a89286
A 'completion' signal to emit whenever user accepts a completion suggest.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18346
diff
changeset
|
29 #include "gntmarshal.h" |
15817 | 30 #include "gntstyle.h" |
31 #include "gnttree.h" | |
32 #include "gntutils.h" | |
33 | |
34 enum | |
35 { | |
36 SIG_TEXT_CHANGED, | |
18382
aa60f5a89286
A 'completion' signal to emit whenever user accepts a completion suggest.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18346
diff
changeset
|
37 SIG_COMPLETION, |
15817 | 38 SIGS, |
39 }; | |
21266
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
40 |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
41 typedef enum |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
42 { |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
43 ENTRY_JAIL = -1, /* Suspend the kill ring. */ |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
44 ENTRY_DEL_BWD_WORD = 1, |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
45 ENTRY_DEL_BWD_CHAR, |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
46 ENTRY_DEL_FWD_WORD, |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
47 ENTRY_DEL_FWD_CHAR, |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
48 ENTRY_DEL_EOL, |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
49 ENTRY_DEL_BOL, |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
50 } GntEntryAction; |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
51 |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
52 struct _GntEntryKillRing |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
53 { |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
54 GString *buffer; |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
55 GntEntryAction last; |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
56 }; |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
57 |
29671
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28604
diff
changeset
|
58 struct _GntEntrySearch |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28604
diff
changeset
|
59 { |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28604
diff
changeset
|
60 char *needle; |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28604
diff
changeset
|
61 }; |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28604
diff
changeset
|
62 |
15817 | 63 static guint signals[SIGS] = { 0 }; |
64 | |
65 static GntWidgetClass *parent_class = NULL; | |
66 | |
15959
efbced3f38ac
Update the tab completion a little bit. The binding for suggest-show will perform suggest-next if the suggest-dropdown is already showing. If there's just one suggestion, then complete with that suggestion.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15817
diff
changeset
|
67 static gboolean gnt_entry_key_pressed(GntWidget *widget, const char *text); |
15817 | 68 static void gnt_entry_set_text_internal(GntEntry *entry, const char *text); |
69 | |
21266
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
70 static gboolean |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
71 update_kill_ring(GntEntry *entry, GntEntryAction action, const char *text, int len) |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
72 { |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
73 if (action < 0) { |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
74 entry->killring->last = action; |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
75 return FALSE; |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
76 } |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
77 |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
78 if (len == 0) |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
79 len = strlen(text); |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
80 else if (len < 0) { |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
81 text += len; |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
82 len = -len; |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
83 } |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
84 |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
85 if (action != entry->killring->last) { |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
86 struct { |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
87 GntEntryAction one; |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
88 GntEntryAction two; |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
89 } merges[] = { |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
90 {ENTRY_DEL_BWD_WORD, ENTRY_DEL_FWD_WORD}, |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
91 {ENTRY_DEL_BWD_CHAR, ENTRY_DEL_FWD_CHAR}, |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
92 {ENTRY_DEL_BOL, ENTRY_DEL_EOL}, |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
93 {ENTRY_JAIL, ENTRY_JAIL}, |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
94 }; |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
95 int i; |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
96 |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
97 for (i = 0; merges[i].one != ENTRY_JAIL; i++) { |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
98 if (merges[i].one == entry->killring->last && |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
99 merges[i].two == action) { |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
100 g_string_append_len(entry->killring->buffer, text, len); |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
101 break; |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
102 } else if (merges[i].one == action && |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
103 merges[i].two == entry->killring->last) { |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
104 g_string_prepend_len(entry->killring->buffer, text, len); |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
105 break; |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
106 } |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
107 } |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
108 if (merges[i].one == ENTRY_JAIL) { |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
109 g_string_assign(entry->killring->buffer, text); |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
110 g_string_truncate(entry->killring->buffer, len); |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
111 } |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
112 entry->killring->last = action; |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
113 } else { |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
114 if (action == ENTRY_DEL_BWD_CHAR || action == ENTRY_DEL_BWD_WORD) |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
115 g_string_prepend_len(entry->killring->buffer, text, len); |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
116 else |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
117 g_string_append_len(entry->killring->buffer, text, len); |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
118 } |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
119 return TRUE; |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
120 } |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
121 |
15817 | 122 static void |
123 destroy_suggest(GntEntry *entry) | |
124 { | |
125 if (entry->ddown) | |
126 { | |
127 gnt_widget_destroy(entry->ddown->parent); | |
128 entry->ddown = NULL; | |
129 } | |
130 } | |
131 | |
132 static char * | |
133 get_beginning_of_word(GntEntry *entry) | |
134 { | |
135 char *s = entry->cursor; | |
136 while (s > entry->start) | |
137 { | |
138 char *t = g_utf8_find_prev_char(entry->start, s); | |
139 if (isspace(*t)) | |
140 break; | |
141 s = t; | |
142 } | |
143 return s; | |
144 } | |
145 | |
146 static gboolean | |
16889
c31328dba5c2
Fix some ickyness in the tab-completion. Now, if there's only one suggest word, then the first tab will just complete the suggestion. If there's only one suggest word, and it's already completed, then tab will take focus to the next widget. If there is a dropdown, then you can select a suggest word by pressing tabs to move to it, then either space or enter to accept it.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15959
diff
changeset
|
147 complete_suggest(GntEntry *entry, const char *text) |
c31328dba5c2
Fix some ickyness in the tab-completion. Now, if there's only one suggest word, then the first tab will just complete the suggestion. If there's only one suggest word, and it's already completed, then tab will take focus to the next widget. If there is a dropdown, then you can select a suggest word by pressing tabs to move to it, then either space or enter to accept it.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15959
diff
changeset
|
148 { |
18382
aa60f5a89286
A 'completion' signal to emit whenever user accepts a completion suggest.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18346
diff
changeset
|
149 int offstart = 0, offend = 0; |
aa60f5a89286
A 'completion' signal to emit whenever user accepts a completion suggest.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18346
diff
changeset
|
150 |
16889
c31328dba5c2
Fix some ickyness in the tab-completion. Now, if there's only one suggest word, then the first tab will just complete the suggestion. If there's only one suggest word, and it's already completed, then tab will take focus to the next widget. If there is a dropdown, then you can select a suggest word by pressing tabs to move to it, then either space or enter to accept it.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15959
diff
changeset
|
151 if (entry->word) { |
c31328dba5c2
Fix some ickyness in the tab-completion. Now, if there's only one suggest word, then the first tab will just complete the suggestion. If there's only one suggest word, and it's already completed, then tab will take focus to the next widget. If there is a dropdown, then you can select a suggest word by pressing tabs to move to it, then either space or enter to accept it.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15959
diff
changeset
|
152 char *s = get_beginning_of_word(entry); |
c31328dba5c2
Fix some ickyness in the tab-completion. Now, if there's only one suggest word, then the first tab will just complete the suggestion. If there's only one suggest word, and it's already completed, then tab will take focus to the next widget. If there is a dropdown, then you can select a suggest word by pressing tabs to move to it, then either space or enter to accept it.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15959
diff
changeset
|
153 const char *iter = text; |
18382
aa60f5a89286
A 'completion' signal to emit whenever user accepts a completion suggest.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18346
diff
changeset
|
154 offstart = g_utf8_pointer_to_offset(entry->start, s); |
16889
c31328dba5c2
Fix some ickyness in the tab-completion. Now, if there's only one suggest word, then the first tab will just complete the suggestion. If there's only one suggest word, and it's already completed, then tab will take focus to the next widget. If there is a dropdown, then you can select a suggest word by pressing tabs to move to it, then either space or enter to accept it.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15959
diff
changeset
|
155 while (*iter && toupper(*s) == toupper(*iter)) { |
c31328dba5c2
Fix some ickyness in the tab-completion. Now, if there's only one suggest word, then the first tab will just complete the suggestion. If there's only one suggest word, and it's already completed, then tab will take focus to the next widget. If there is a dropdown, then you can select a suggest word by pressing tabs to move to it, then either space or enter to accept it.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15959
diff
changeset
|
156 *s++ = *iter++; |
c31328dba5c2
Fix some ickyness in the tab-completion. Now, if there's only one suggest word, then the first tab will just complete the suggestion. If there's only one suggest word, and it's already completed, then tab will take focus to the next widget. If there is a dropdown, then you can select a suggest word by pressing tabs to move to it, then either space or enter to accept it.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15959
diff
changeset
|
157 } |
c31328dba5c2
Fix some ickyness in the tab-completion. Now, if there's only one suggest word, then the first tab will just complete the suggestion. If there's only one suggest word, and it's already completed, then tab will take focus to the next widget. If there is a dropdown, then you can select a suggest word by pressing tabs to move to it, then either space or enter to accept it.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15959
diff
changeset
|
158 if (*iter) { |
c31328dba5c2
Fix some ickyness in the tab-completion. Now, if there's only one suggest word, then the first tab will just complete the suggestion. If there's only one suggest word, and it's already completed, then tab will take focus to the next widget. If there is a dropdown, then you can select a suggest word by pressing tabs to move to it, then either space or enter to accept it.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15959
diff
changeset
|
159 gnt_entry_key_pressed(GNT_WIDGET(entry), iter); |
c31328dba5c2
Fix some ickyness in the tab-completion. Now, if there's only one suggest word, then the first tab will just complete the suggestion. If there's only one suggest word, and it's already completed, then tab will take focus to the next widget. If there is a dropdown, then you can select a suggest word by pressing tabs to move to it, then either space or enter to accept it.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15959
diff
changeset
|
160 } |
18382
aa60f5a89286
A 'completion' signal to emit whenever user accepts a completion suggest.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18346
diff
changeset
|
161 offend = g_utf8_pointer_to_offset(entry->start, entry->cursor); |
16889
c31328dba5c2
Fix some ickyness in the tab-completion. Now, if there's only one suggest word, then the first tab will just complete the suggestion. If there's only one suggest word, and it's already completed, then tab will take focus to the next widget. If there is a dropdown, then you can select a suggest word by pressing tabs to move to it, then either space or enter to accept it.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15959
diff
changeset
|
162 } else { |
18382
aa60f5a89286
A 'completion' signal to emit whenever user accepts a completion suggest.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18346
diff
changeset
|
163 offstart = 0; |
16889
c31328dba5c2
Fix some ickyness in the tab-completion. Now, if there's only one suggest word, then the first tab will just complete the suggestion. If there's only one suggest word, and it's already completed, then tab will take focus to the next widget. If there is a dropdown, then you can select a suggest word by pressing tabs to move to it, then either space or enter to accept it.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15959
diff
changeset
|
164 gnt_entry_set_text_internal(entry, text); |
18382
aa60f5a89286
A 'completion' signal to emit whenever user accepts a completion suggest.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18346
diff
changeset
|
165 offend = g_utf8_strlen(text, -1); |
16889
c31328dba5c2
Fix some ickyness in the tab-completion. Now, if there's only one suggest word, then the first tab will just complete the suggestion. If there's only one suggest word, and it's already completed, then tab will take focus to the next widget. If there is a dropdown, then you can select a suggest word by pressing tabs to move to it, then either space or enter to accept it.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15959
diff
changeset
|
166 } |
18382
aa60f5a89286
A 'completion' signal to emit whenever user accepts a completion suggest.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18346
diff
changeset
|
167 |
21699
760a8e024142
Emit the 'completion' signal when tab is pressed from a suggest word.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21680
diff
changeset
|
168 g_signal_emit(G_OBJECT(entry), signals[SIG_COMPLETION], 0, |
760a8e024142
Emit the 'completion' signal when tab is pressed from a suggest word.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21680
diff
changeset
|
169 entry->start + offstart, entry->start + offend); |
21266
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
170 update_kill_ring(entry, ENTRY_JAIL, NULL, 0); |
21699
760a8e024142
Emit the 'completion' signal when tab is pressed from a suggest word.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21680
diff
changeset
|
171 return TRUE; |
16889
c31328dba5c2
Fix some ickyness in the tab-completion. Now, if there's only one suggest word, then the first tab will just complete the suggestion. If there's only one suggest word, and it's already completed, then tab will take focus to the next widget. If there is a dropdown, then you can select a suggest word by pressing tabs to move to it, then either space or enter to accept it.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15959
diff
changeset
|
172 } |
c31328dba5c2
Fix some ickyness in the tab-completion. Now, if there's only one suggest word, then the first tab will just complete the suggestion. If there's only one suggest word, and it's already completed, then tab will take focus to the next widget. If there is a dropdown, then you can select a suggest word by pressing tabs to move to it, then either space or enter to accept it.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15959
diff
changeset
|
173 |
20088
470feb3084a4
Tab-complete as much as possible when there are multiple suggests.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
19681
diff
changeset
|
174 static int |
470feb3084a4
Tab-complete as much as possible when there are multiple suggests.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
19681
diff
changeset
|
175 max_common_prefix(const char *s, const char *t) |
470feb3084a4
Tab-complete as much as possible when there are multiple suggests.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
19681
diff
changeset
|
176 { |
470feb3084a4
Tab-complete as much as possible when there are multiple suggests.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
19681
diff
changeset
|
177 const char *f = s; |
470feb3084a4
Tab-complete as much as possible when there are multiple suggests.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
19681
diff
changeset
|
178 while (*f && *t && *f == *t++) |
470feb3084a4
Tab-complete as much as possible when there are multiple suggests.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
19681
diff
changeset
|
179 f++; |
470feb3084a4
Tab-complete as much as possible when there are multiple suggests.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
19681
diff
changeset
|
180 return f - s; |
470feb3084a4
Tab-complete as much as possible when there are multiple suggests.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
19681
diff
changeset
|
181 } |
470feb3084a4
Tab-complete as much as possible when there are multiple suggests.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
19681
diff
changeset
|
182 |
16889
c31328dba5c2
Fix some ickyness in the tab-completion. Now, if there's only one suggest word, then the first tab will just complete the suggestion. If there's only one suggest word, and it's already completed, then tab will take focus to the next widget. If there is a dropdown, then you can select a suggest word by pressing tabs to move to it, then either space or enter to accept it.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15959
diff
changeset
|
183 static gboolean |
15817 | 184 show_suggest_dropdown(GntEntry *entry) |
185 { | |
186 char *suggest = NULL; | |
187 int len; | |
188 int offset = 0, x, y; | |
189 int count = 0; | |
190 GList *iter; | |
16889
c31328dba5c2
Fix some ickyness in the tab-completion. Now, if there's only one suggest word, then the first tab will just complete the suggestion. If there's only one suggest word, and it's already completed, then tab will take focus to the next widget. If there is a dropdown, then you can select a suggest word by pressing tabs to move to it, then either space or enter to accept it.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15959
diff
changeset
|
191 const char *text = NULL; |
16899
6502a3846264
Fix tab-completion.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16889
diff
changeset
|
192 const char *sgst = NULL; |
20088
470feb3084a4
Tab-complete as much as possible when there are multiple suggests.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
19681
diff
changeset
|
193 int max = -1; |
15817 | 194 |
195 if (entry->word) | |
196 { | |
197 char *s = get_beginning_of_word(entry); | |
198 suggest = g_strndup(s, entry->cursor - s); | |
199 if (entry->scroll < s) | |
200 offset = gnt_util_onscreen_width(entry->scroll, s); | |
201 } | |
202 else | |
203 suggest = g_strdup(entry->start); | |
204 len = strlen(suggest); /* Don't need to use the utf8-function here */ | |
20088
470feb3084a4
Tab-complete as much as possible when there are multiple suggests.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
19681
diff
changeset
|
205 |
15817 | 206 if (entry->ddown == NULL) |
207 { | |
208 GntWidget *box = gnt_vbox_new(FALSE); | |
209 entry->ddown = gnt_tree_new(); | |
210 gnt_tree_set_compare_func(GNT_TREE(entry->ddown), (GCompareFunc)g_utf8_collate); | |
211 gnt_box_add_widget(GNT_BOX(box), entry->ddown); | |
212 | |
213 GNT_WIDGET_SET_FLAGS(box, GNT_WIDGET_TRANSIENT); | |
214 | |
215 gnt_widget_get_position(GNT_WIDGET(entry), &x, &y); | |
216 x += offset; | |
217 y++; | |
218 if (y + 10 >= getmaxy(stdscr)) | |
219 y -= 11; | |
220 gnt_widget_set_position(box, x, y); | |
221 } | |
222 else | |
223 gnt_tree_remove_all(GNT_TREE(entry->ddown)); | |
224 | |
225 for (count = 0, iter = entry->suggests; iter; iter = iter->next) | |
226 { | |
16889
c31328dba5c2
Fix some ickyness in the tab-completion. Now, if there's only one suggest word, then the first tab will just complete the suggestion. If there's only one suggest word, and it's already completed, then tab will take focus to the next widget. If there is a dropdown, then you can select a suggest word by pressing tabs to move to it, then either space or enter to accept it.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15959
diff
changeset
|
227 text = iter->data; |
15817 | 228 if (g_ascii_strncasecmp(suggest, text, len) == 0 && strlen(text) >= len) |
229 { | |
230 gnt_tree_add_row_after(GNT_TREE(entry->ddown), (gpointer)text, | |
231 gnt_tree_create_row(GNT_TREE(entry->ddown), text), | |
232 NULL, NULL); | |
233 count++; | |
20088
470feb3084a4
Tab-complete as much as possible when there are multiple suggests.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
19681
diff
changeset
|
234 if (max == -1) |
470feb3084a4
Tab-complete as much as possible when there are multiple suggests.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
19681
diff
changeset
|
235 max = strlen(text) - len; |
470feb3084a4
Tab-complete as much as possible when there are multiple suggests.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
19681
diff
changeset
|
236 else if (max) |
470feb3084a4
Tab-complete as much as possible when there are multiple suggests.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
19681
diff
changeset
|
237 max = MIN(max, max_common_prefix(sgst + len, text + len)); |
16899
6502a3846264
Fix tab-completion.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16889
diff
changeset
|
238 sgst = text; |
15817 | 239 } |
240 } | |
241 g_free(suggest); | |
242 | |
16889
c31328dba5c2
Fix some ickyness in the tab-completion. Now, if there's only one suggest word, then the first tab will just complete the suggestion. If there's only one suggest word, and it's already completed, then tab will take focus to the next widget. If there is a dropdown, then you can select a suggest word by pressing tabs to move to it, then either space or enter to accept it.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15959
diff
changeset
|
243 if (count == 0) { |
15817 | 244 destroy_suggest(entry); |
245 return FALSE; | |
16889
c31328dba5c2
Fix some ickyness in the tab-completion. Now, if there's only one suggest word, then the first tab will just complete the suggestion. If there's only one suggest word, and it's already completed, then tab will take focus to the next widget. If there is a dropdown, then you can select a suggest word by pressing tabs to move to it, then either space or enter to accept it.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15959
diff
changeset
|
246 } else if (count == 1) { |
22698
4a05b9db0b91
Return FALSE when nothing changes after an attempted tab-completion.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
22434
diff
changeset
|
247 char *store = g_strndup(entry->start, entry->end - entry->start); |
4a05b9db0b91
Return FALSE when nothing changes after an attempted tab-completion.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
22434
diff
changeset
|
248 gboolean ret; |
4a05b9db0b91
Return FALSE when nothing changes after an attempted tab-completion.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
22434
diff
changeset
|
249 |
16889
c31328dba5c2
Fix some ickyness in the tab-completion. Now, if there's only one suggest word, then the first tab will just complete the suggestion. If there's only one suggest word, and it's already completed, then tab will take focus to the next widget. If there is a dropdown, then you can select a suggest word by pressing tabs to move to it, then either space or enter to accept it.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15959
diff
changeset
|
250 destroy_suggest(entry); |
22698
4a05b9db0b91
Return FALSE when nothing changes after an attempted tab-completion.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
22434
diff
changeset
|
251 complete_suggest(entry, sgst); |
4a05b9db0b91
Return FALSE when nothing changes after an attempted tab-completion.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
22434
diff
changeset
|
252 |
4a05b9db0b91
Return FALSE when nothing changes after an attempted tab-completion.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
22434
diff
changeset
|
253 ret = (strncmp(store, entry->start, entry->end - entry->start) != 0); |
4a05b9db0b91
Return FALSE when nothing changes after an attempted tab-completion.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
22434
diff
changeset
|
254 g_free(store); |
4a05b9db0b91
Return FALSE when nothing changes after an attempted tab-completion.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
22434
diff
changeset
|
255 return ret; |
16889
c31328dba5c2
Fix some ickyness in the tab-completion. Now, if there's only one suggest word, then the first tab will just complete the suggestion. If there's only one suggest word, and it's already completed, then tab will take focus to the next widget. If there is a dropdown, then you can select a suggest word by pressing tabs to move to it, then either space or enter to accept it.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15959
diff
changeset
|
256 } else { |
20088
470feb3084a4
Tab-complete as much as possible when there are multiple suggests.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
19681
diff
changeset
|
257 if (max > 0) { |
470feb3084a4
Tab-complete as much as possible when there are multiple suggests.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
19681
diff
changeset
|
258 GntWidget *ddown = entry->ddown; |
470feb3084a4
Tab-complete as much as possible when there are multiple suggests.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
19681
diff
changeset
|
259 char *match = g_strndup(sgst + len, max); |
470feb3084a4
Tab-complete as much as possible when there are multiple suggests.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
19681
diff
changeset
|
260 entry->ddown = NULL; |
470feb3084a4
Tab-complete as much as possible when there are multiple suggests.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
19681
diff
changeset
|
261 gnt_entry_key_pressed(GNT_WIDGET(entry), match); |
470feb3084a4
Tab-complete as much as possible when there are multiple suggests.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
19681
diff
changeset
|
262 g_free(match); |
470feb3084a4
Tab-complete as much as possible when there are multiple suggests.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
19681
diff
changeset
|
263 if (entry->ddown) |
470feb3084a4
Tab-complete as much as possible when there are multiple suggests.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
19681
diff
changeset
|
264 gnt_widget_destroy(ddown); |
470feb3084a4
Tab-complete as much as possible when there are multiple suggests.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
19681
diff
changeset
|
265 else |
470feb3084a4
Tab-complete as much as possible when there are multiple suggests.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
19681
diff
changeset
|
266 entry->ddown = ddown; |
470feb3084a4
Tab-complete as much as possible when there are multiple suggests.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
19681
diff
changeset
|
267 } |
16889
c31328dba5c2
Fix some ickyness in the tab-completion. Now, if there's only one suggest word, then the first tab will just complete the suggestion. If there's only one suggest word, and it's already completed, then tab will take focus to the next widget. If there is a dropdown, then you can select a suggest word by pressing tabs to move to it, then either space or enter to accept it.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15959
diff
changeset
|
268 gnt_widget_draw(entry->ddown->parent); |
15817 | 269 } |
270 | |
271 return TRUE; | |
272 } | |
273 | |
274 static void | |
275 gnt_entry_draw(GntWidget *widget) | |
276 { | |
277 GntEntry *entry = GNT_ENTRY(widget); | |
278 int stop; | |
279 gboolean focus; | |
26439
c67d43408daa
Update hardware cursor correctly.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
24586
diff
changeset
|
280 int curpos; |
15817 | 281 |
282 if ((focus = gnt_widget_has_focus(widget))) | |
21250
9187d331aebe
Add gnt_color_pair, which will replace color codes with 'appropriate' text
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
20088
diff
changeset
|
283 wbkgdset(widget->window, '\0' | gnt_color_pair(GNT_COLOR_TEXT_NORMAL)); |
15817 | 284 else |
21250
9187d331aebe
Add gnt_color_pair, which will replace color codes with 'appropriate' text
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
20088
diff
changeset
|
285 wbkgdset(widget->window, '\0' | gnt_color_pair(GNT_COLOR_HIGHLIGHT_D)); |
15817 | 286 |
287 if (entry->masked) | |
288 { | |
289 mvwhline(widget->window, 0, 0, gnt_ascii_only() ? '*' : ACS_BULLET, | |
290 g_utf8_pointer_to_offset(entry->scroll, entry->end)); | |
291 } | |
292 else | |
28604
a18f421696dc
Fix showing umlauts etc. on non-utf8 locales.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28454
diff
changeset
|
293 mvwprintw(widget->window, 0, 0, "%s", C_(entry->scroll)); |
15817 | 294 |
295 stop = gnt_util_onscreen_width(entry->scroll, entry->end); | |
296 if (stop < widget->priv.width) | |
18346
72a52cff76f3
Draw the password entries correctly.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17928
diff
changeset
|
297 mvwhline(widget->window, 0, stop, ENTRY_CHAR, widget->priv.width - stop); |
15817 | 298 |
26439
c67d43408daa
Update hardware cursor correctly.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
24586
diff
changeset
|
299 curpos = gnt_util_onscreen_width(entry->scroll, entry->cursor); |
15817 | 300 if (focus) |
26439
c67d43408daa
Update hardware cursor correctly.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
24586
diff
changeset
|
301 mvwchgat(widget->window, 0, curpos, 1, A_REVERSE, GNT_COLOR_TEXT_NORMAL, NULL); |
c67d43408daa
Update hardware cursor correctly.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
24586
diff
changeset
|
302 wmove(widget->window, 0, curpos); |
15817 | 303 |
304 GNTDEBUG; | |
305 } | |
306 | |
307 static void | |
308 gnt_entry_size_request(GntWidget *widget) | |
309 { | |
310 if (!GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_MAPPED)) | |
311 { | |
312 widget->priv.height = 1; | |
313 widget->priv.width = 20; | |
314 } | |
315 } | |
316 | |
317 static void | |
318 gnt_entry_map(GntWidget *widget) | |
319 { | |
320 if (widget->priv.width == 0 || widget->priv.height == 0) | |
321 gnt_widget_size_request(widget); | |
322 GNTDEBUG; | |
323 } | |
324 | |
325 static void | |
326 entry_redraw(GntWidget *widget) | |
327 { | |
328 gnt_entry_draw(widget); | |
329 gnt_widget_queue_update(widget); | |
330 } | |
331 | |
332 static void | |
333 entry_text_changed(GntEntry *entry) | |
334 { | |
335 g_signal_emit(entry, signals[SIG_TEXT_CHANGED], 0); | |
336 } | |
337 | |
338 static gboolean | |
339 move_back(GntBindable *bind, GList *null) | |
340 { | |
341 GntEntry *entry = GNT_ENTRY(bind); | |
342 if (entry->cursor <= entry->start) | |
343 return FALSE; | |
344 entry->cursor = g_utf8_find_prev_char(entry->start, entry->cursor); | |
345 if (entry->cursor < entry->scroll) | |
346 entry->scroll = entry->cursor; | |
21266
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
347 update_kill_ring(entry, ENTRY_JAIL, NULL, 0); |
15817 | 348 entry_redraw(GNT_WIDGET(entry)); |
349 return TRUE; | |
350 } | |
351 | |
352 static gboolean | |
353 move_forward(GntBindable *bind, GList *list) | |
354 { | |
355 GntEntry *entry = GNT_ENTRY(bind); | |
356 if (entry->cursor >= entry->end) | |
357 return FALSE; | |
358 entry->cursor = g_utf8_find_next_char(entry->cursor, NULL); | |
359 while (gnt_util_onscreen_width(entry->scroll, entry->cursor) >= GNT_WIDGET(entry)->priv.width) | |
360 entry->scroll = g_utf8_find_next_char(entry->scroll, NULL); | |
21266
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
361 update_kill_ring(entry, ENTRY_JAIL, NULL, 0); |
15817 | 362 entry_redraw(GNT_WIDGET(entry)); |
363 return TRUE; | |
364 } | |
365 | |
366 static gboolean | |
367 backspace(GntBindable *bind, GList *null) | |
368 { | |
369 int len; | |
370 GntEntry *entry = GNT_ENTRY(bind); | |
371 | |
372 if (entry->cursor <= entry->start) | |
373 return TRUE; | |
21266
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
374 |
15817 | 375 len = entry->cursor - g_utf8_find_prev_char(entry->start, entry->cursor); |
24553
2675fda76ddf
Do not alter the killring on delete-prev or delete-next (char) operations.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
24410
diff
changeset
|
376 update_kill_ring(entry, ENTRY_JAIL, entry->cursor, -len); |
15817 | 377 entry->cursor -= len; |
21266
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
378 |
15817 | 379 memmove(entry->cursor, entry->cursor + len, entry->end - entry->cursor); |
380 entry->end -= len; | |
381 | |
382 if (entry->scroll > entry->start) | |
383 entry->scroll = g_utf8_find_prev_char(entry->start, entry->scroll); | |
384 | |
385 entry_redraw(GNT_WIDGET(entry)); | |
386 if (entry->ddown) | |
387 show_suggest_dropdown(entry); | |
388 entry_text_changed(entry); | |
389 return TRUE; | |
390 } | |
391 | |
392 static gboolean | |
393 delkey(GntBindable *bind, GList *null) | |
394 { | |
395 int len; | |
396 GntEntry *entry = GNT_ENTRY(bind); | |
397 | |
398 if (entry->cursor >= entry->end) | |
399 return FALSE; | |
21266
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
400 |
15817 | 401 len = g_utf8_find_next_char(entry->cursor, NULL) - entry->cursor; |
24553
2675fda76ddf
Do not alter the killring on delete-prev or delete-next (char) operations.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
24410
diff
changeset
|
402 update_kill_ring(entry, ENTRY_JAIL, entry->cursor, len); |
15817 | 403 memmove(entry->cursor, entry->cursor + len, entry->end - entry->cursor - len + 1); |
404 entry->end -= len; | |
405 entry_redraw(GNT_WIDGET(entry)); | |
406 | |
407 if (entry->ddown) | |
408 show_suggest_dropdown(entry); | |
409 entry_text_changed(entry); | |
410 return TRUE; | |
411 } | |
412 | |
413 static gboolean | |
414 move_start(GntBindable *bind, GList *null) | |
415 { | |
416 GntEntry *entry = GNT_ENTRY(bind); | |
417 entry->scroll = entry->cursor = entry->start; | |
418 entry_redraw(GNT_WIDGET(entry)); | |
21266
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
419 update_kill_ring(entry, ENTRY_JAIL, NULL, 0); |
15817 | 420 return TRUE; |
421 } | |
422 | |
423 static gboolean | |
424 move_end(GntBindable *bind, GList *null) | |
425 { | |
426 GntEntry *entry = GNT_ENTRY(bind); | |
427 entry->cursor = entry->end; | |
428 /* This should be better than this */ | |
429 while (gnt_util_onscreen_width(entry->scroll, entry->cursor) >= GNT_WIDGET(entry)->priv.width) | |
430 entry->scroll = g_utf8_find_next_char(entry->scroll, NULL); | |
431 entry_redraw(GNT_WIDGET(entry)); | |
21266
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
432 update_kill_ring(entry, ENTRY_JAIL, NULL, 0); |
15817 | 433 return TRUE; |
434 } | |
435 | |
436 static gboolean | |
22434
77737a3526f1
The names history-next and history-prev were backwards! Make them right, and add c-n/c-p bindings as the default bindings. Thanks to shofixti for reporting the bug. Fixes #4593.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
22289
diff
changeset
|
437 history_next(GntBindable *bind, GList *null) |
15817 | 438 { |
439 GntEntry *entry = GNT_ENTRY(bind); | |
440 if (entry->histlength && entry->history->prev) | |
441 { | |
442 entry->history = entry->history->prev; | |
443 gnt_entry_set_text_internal(entry, entry->history->data); | |
444 destroy_suggest(entry); | |
445 entry_text_changed(entry); | |
446 | |
21266
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
447 update_kill_ring(entry, ENTRY_JAIL, NULL, 0); |
15817 | 448 return TRUE; |
449 } | |
450 return FALSE; | |
451 } | |
452 | |
453 static gboolean | |
22434
77737a3526f1
The names history-next and history-prev were backwards! Make them right, and add c-n/c-p bindings as the default bindings. Thanks to shofixti for reporting the bug. Fixes #4593.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
22289
diff
changeset
|
454 history_prev(GntBindable *bind, GList *null) |
15817 | 455 { |
456 GntEntry *entry = GNT_ENTRY(bind); | |
457 if (entry->histlength && entry->history->next) | |
458 { | |
459 if (entry->history->prev == NULL) | |
460 { | |
461 /* Save the current contents */ | |
462 char *text = g_strdup(gnt_entry_get_text(entry)); | |
463 g_free(entry->history->data); | |
464 entry->history->data = text; | |
465 } | |
466 | |
467 entry->history = entry->history->next; | |
468 gnt_entry_set_text_internal(entry, entry->history->data); | |
469 destroy_suggest(entry); | |
470 entry_text_changed(entry); | |
471 | |
21266
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
472 update_kill_ring(entry, ENTRY_JAIL, NULL, 0); |
15817 | 473 return TRUE; |
474 } | |
475 return FALSE; | |
476 } | |
477 | |
478 static gboolean | |
29671
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28604
diff
changeset
|
479 history_search(GntBindable *bind, GList *null) |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28604
diff
changeset
|
480 { |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28604
diff
changeset
|
481 GntEntry *entry = GNT_ENTRY(bind); |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28604
diff
changeset
|
482 GList *iter; |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28604
diff
changeset
|
483 const char *current , *pos; |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28604
diff
changeset
|
484 int len; |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28604
diff
changeset
|
485 |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28604
diff
changeset
|
486 if (entry->history->prev && entry->search->needle) |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28604
diff
changeset
|
487 current = entry->search->needle; |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28604
diff
changeset
|
488 else |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28604
diff
changeset
|
489 current = gnt_entry_get_text(entry); |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28604
diff
changeset
|
490 |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28604
diff
changeset
|
491 if (!entry->histlength || !entry->history->next || !*current) |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28604
diff
changeset
|
492 return FALSE; |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28604
diff
changeset
|
493 |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28604
diff
changeset
|
494 len = g_utf8_strlen(current, -1); |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28604
diff
changeset
|
495 |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28604
diff
changeset
|
496 for (iter = entry->history->next; iter; iter = iter->next) { |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28604
diff
changeset
|
497 const char *str = iter->data; |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28604
diff
changeset
|
498 /* A more utf8-friendly version of strstr would have been better, but |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28604
diff
changeset
|
499 * for now, this will have to do. */ |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28604
diff
changeset
|
500 if ((pos = strstr(str, current))) |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28604
diff
changeset
|
501 break; |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28604
diff
changeset
|
502 } |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28604
diff
changeset
|
503 |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28604
diff
changeset
|
504 if (!iter) |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28604
diff
changeset
|
505 return TRUE; |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28604
diff
changeset
|
506 |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28604
diff
changeset
|
507 if (entry->history->prev == NULL) { |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28604
diff
changeset
|
508 /* We are doing it for the first time. Save the current contents */ |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28604
diff
changeset
|
509 char *text = g_strdup(gnt_entry_get_text(entry)); |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28604
diff
changeset
|
510 |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28604
diff
changeset
|
511 g_free(entry->search->needle); |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28604
diff
changeset
|
512 entry->search->needle = g_strdup(current); |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28604
diff
changeset
|
513 |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28604
diff
changeset
|
514 g_free(entry->history->data); |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28604
diff
changeset
|
515 entry->history->data = text; |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28604
diff
changeset
|
516 } |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28604
diff
changeset
|
517 |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28604
diff
changeset
|
518 entry->history = iter; |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28604
diff
changeset
|
519 gnt_entry_set_text_internal(entry, entry->history->data); |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28604
diff
changeset
|
520 destroy_suggest(entry); |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28604
diff
changeset
|
521 entry_text_changed(entry); |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28604
diff
changeset
|
522 |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28604
diff
changeset
|
523 update_kill_ring(entry, ENTRY_JAIL, NULL, 0); |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28604
diff
changeset
|
524 return TRUE; |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28604
diff
changeset
|
525 } |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28604
diff
changeset
|
526 |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28604
diff
changeset
|
527 static gboolean |
15817 | 528 clipboard_paste(GntBindable *bind, GList *n) |
529 { | |
530 GntEntry *entry = GNT_ENTRY(bind); | |
531 gchar *i, *text, *a, *all; | |
532 text = i = gnt_get_clipboard_string(); | |
533 while (*i != '\0') { | |
534 i = g_utf8_next_char(i); | |
535 if (*i == '\r' || *i == '\n') | |
536 *i = ' '; | |
537 } | |
538 a = g_strndup(entry->start, entry->cursor - entry->start); | |
539 all = g_strconcat(a, text, entry->cursor, NULL); | |
540 gnt_entry_set_text_internal(entry, all); | |
21266
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
541 update_kill_ring(entry, ENTRY_JAIL, NULL, 0); |
15817 | 542 g_free(a); |
543 g_free(text); | |
544 g_free(all); | |
545 return TRUE; | |
546 } | |
547 | |
548 static gboolean | |
549 suggest_show(GntBindable *bind, GList *null) | |
550 { | |
15959
efbced3f38ac
Update the tab completion a little bit. The binding for suggest-show will perform suggest-next if the suggest-dropdown is already showing. If there's just one suggestion, then complete with that suggestion.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15817
diff
changeset
|
551 GntEntry *entry = GNT_ENTRY(bind); |
efbced3f38ac
Update the tab completion a little bit. The binding for suggest-show will perform suggest-next if the suggest-dropdown is already showing. If there's just one suggestion, then complete with that suggestion.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15817
diff
changeset
|
552 if (entry->ddown) { |
28337
650ab9eb4b21
Add missing null sentinels, and help the compiler catch such errors.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
26439
diff
changeset
|
553 gnt_bindable_perform_action_named(GNT_BINDABLE(entry->ddown), "move-down", NULL); |
15959
efbced3f38ac
Update the tab completion a little bit. The binding for suggest-show will perform suggest-next if the suggest-dropdown is already showing. If there's just one suggestion, then complete with that suggestion.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15817
diff
changeset
|
554 return TRUE; |
efbced3f38ac
Update the tab completion a little bit. The binding for suggest-show will perform suggest-next if the suggest-dropdown is already showing. If there's just one suggestion, then complete with that suggestion.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15817
diff
changeset
|
555 } |
efbced3f38ac
Update the tab completion a little bit. The binding for suggest-show will perform suggest-next if the suggest-dropdown is already showing. If there's just one suggestion, then complete with that suggestion.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15817
diff
changeset
|
556 return show_suggest_dropdown(entry); |
15817 | 557 } |
558 | |
559 static gboolean | |
560 suggest_next(GntBindable *bind, GList *null) | |
561 { | |
562 GntEntry *entry = GNT_ENTRY(bind); | |
563 if (entry->ddown) { | |
564 gnt_bindable_perform_action_named(GNT_BINDABLE(entry->ddown), "move-down", NULL); | |
565 return TRUE; | |
566 } | |
567 return FALSE; | |
568 } | |
569 | |
570 static gboolean | |
571 suggest_prev(GntBindable *bind, GList *null) | |
572 { | |
573 GntEntry *entry = GNT_ENTRY(bind); | |
574 if (entry->ddown) { | |
575 gnt_bindable_perform_action_named(GNT_BINDABLE(entry->ddown), "move-up", NULL); | |
576 return TRUE; | |
577 } | |
578 return FALSE; | |
579 } | |
580 | |
581 static gboolean | |
30171
aaec35719201
Allow page-up/downing in the suggestion list.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
29671
diff
changeset
|
582 suggest_next_page(GntBindable *bind, GList *null) |
aaec35719201
Allow page-up/downing in the suggestion list.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
29671
diff
changeset
|
583 { |
aaec35719201
Allow page-up/downing in the suggestion list.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
29671
diff
changeset
|
584 GntEntry *entry = GNT_ENTRY(bind); |
aaec35719201
Allow page-up/downing in the suggestion list.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
29671
diff
changeset
|
585 if (entry->ddown) { |
aaec35719201
Allow page-up/downing in the suggestion list.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
29671
diff
changeset
|
586 gnt_bindable_perform_action_named(GNT_BINDABLE(entry->ddown), "page-down", NULL); |
aaec35719201
Allow page-up/downing in the suggestion list.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
29671
diff
changeset
|
587 return TRUE; |
aaec35719201
Allow page-up/downing in the suggestion list.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
29671
diff
changeset
|
588 } |
aaec35719201
Allow page-up/downing in the suggestion list.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
29671
diff
changeset
|
589 return FALSE; |
aaec35719201
Allow page-up/downing in the suggestion list.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
29671
diff
changeset
|
590 } |
aaec35719201
Allow page-up/downing in the suggestion list.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
29671
diff
changeset
|
591 |
aaec35719201
Allow page-up/downing in the suggestion list.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
29671
diff
changeset
|
592 static gboolean |
aaec35719201
Allow page-up/downing in the suggestion list.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
29671
diff
changeset
|
593 suggest_prev_page(GntBindable *bind, GList *null) |
aaec35719201
Allow page-up/downing in the suggestion list.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
29671
diff
changeset
|
594 { |
aaec35719201
Allow page-up/downing in the suggestion list.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
29671
diff
changeset
|
595 GntEntry *entry = GNT_ENTRY(bind); |
aaec35719201
Allow page-up/downing in the suggestion list.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
29671
diff
changeset
|
596 if (entry->ddown) { |
aaec35719201
Allow page-up/downing in the suggestion list.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
29671
diff
changeset
|
597 gnt_bindable_perform_action_named(GNT_BINDABLE(entry->ddown), "page-up", NULL); |
aaec35719201
Allow page-up/downing in the suggestion list.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
29671
diff
changeset
|
598 return TRUE; |
aaec35719201
Allow page-up/downing in the suggestion list.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
29671
diff
changeset
|
599 } |
aaec35719201
Allow page-up/downing in the suggestion list.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
29671
diff
changeset
|
600 return FALSE; |
aaec35719201
Allow page-up/downing in the suggestion list.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
29671
diff
changeset
|
601 } |
aaec35719201
Allow page-up/downing in the suggestion list.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
29671
diff
changeset
|
602 |
aaec35719201
Allow page-up/downing in the suggestion list.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
29671
diff
changeset
|
603 static gboolean |
15817 | 604 del_to_home(GntBindable *bind, GList *null) |
605 { | |
606 GntEntry *entry = GNT_ENTRY(bind); | |
607 if (entry->cursor <= entry->start) | |
608 return TRUE; | |
21266
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
609 update_kill_ring(entry, ENTRY_DEL_BOL, entry->start, entry->cursor - entry->start); |
15817 | 610 memmove(entry->start, entry->cursor, entry->end - entry->cursor); |
611 entry->end -= (entry->cursor - entry->start); | |
612 entry->cursor = entry->scroll = entry->start; | |
613 memset(entry->end, '\0', entry->buffer - (entry->end - entry->start)); | |
614 entry_redraw(GNT_WIDGET(bind)); | |
615 entry_text_changed(entry); | |
616 return TRUE; | |
617 } | |
618 | |
619 static gboolean | |
620 del_to_end(GntBindable *bind, GList *null) | |
621 { | |
622 GntEntry *entry = GNT_ENTRY(bind); | |
623 if (entry->end <= entry->cursor) | |
624 return TRUE; | |
21266
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
625 update_kill_ring(entry, ENTRY_DEL_EOL, entry->cursor, entry->end - entry->cursor); |
15817 | 626 entry->end = entry->cursor; |
627 memset(entry->end, '\0', entry->buffer - (entry->end - entry->start)); | |
628 entry_redraw(GNT_WIDGET(bind)); | |
629 entry_text_changed(entry); | |
630 return TRUE; | |
631 } | |
632 | |
23174
f3087936d594
Treat digits and alphabets as the same class of characters when looking
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
22900
diff
changeset
|
633 #define SAME(a,b) ((g_unichar_isalnum(a) && g_unichar_isalnum(b)) || \ |
15817 | 634 (g_unichar_isspace(a) && g_unichar_isspace(b)) || \ |
23174
f3087936d594
Treat digits and alphabets as the same class of characters when looking
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
22900
diff
changeset
|
635 (g_unichar_iswide(a) && g_unichar_iswide(b)) || \ |
f3087936d594
Treat digits and alphabets as the same class of characters when looking
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
22900
diff
changeset
|
636 (g_unichar_ispunct(a) && g_unichar_ispunct(b))) |
15817 | 637 |
638 static const char * | |
639 begin_word(const char *text, const char *begin) | |
640 { | |
641 gunichar ch = 0; | |
642 while (text > begin && (!*text || g_unichar_isspace(g_utf8_get_char(text)))) | |
643 text = g_utf8_find_prev_char(begin, text); | |
644 ch = g_utf8_get_char(text); | |
645 while ((text = g_utf8_find_prev_char(begin, text)) >= begin) { | |
646 gunichar cur = g_utf8_get_char(text); | |
647 if (!SAME(ch, cur)) | |
648 break; | |
649 } | |
650 | |
651 return (text ? g_utf8_find_next_char(text, NULL) : begin); | |
652 } | |
653 | |
654 static const char * | |
655 next_begin_word(const char *text, const char *end) | |
656 { | |
657 gunichar ch = 0; | |
21680
65f2a29617a2
Fix cursor-next-word behaviour, noticed by jtb.
Richard Nelson <wabz@pidgin.im>
parents:
21280
diff
changeset
|
658 |
65f2a29617a2
Fix cursor-next-word behaviour, noticed by jtb.
Richard Nelson <wabz@pidgin.im>
parents:
21280
diff
changeset
|
659 while (text && text < end && g_unichar_isspace(g_utf8_get_char(text))) |
65f2a29617a2
Fix cursor-next-word behaviour, noticed by jtb.
Richard Nelson <wabz@pidgin.im>
parents:
21280
diff
changeset
|
660 text = g_utf8_find_next_char(text, end); |
65f2a29617a2
Fix cursor-next-word behaviour, noticed by jtb.
Richard Nelson <wabz@pidgin.im>
parents:
21280
diff
changeset
|
661 |
23294
47492dabcb4a
Fixes a crash when next_begin_word is called on trailing spaces at the
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
23174
diff
changeset
|
662 if (text) { |
47492dabcb4a
Fixes a crash when next_begin_word is called on trailing spaces at the
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
23174
diff
changeset
|
663 ch = g_utf8_get_char(text); |
47492dabcb4a
Fixes a crash when next_begin_word is called on trailing spaces at the
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
23174
diff
changeset
|
664 while ((text = g_utf8_find_next_char(text, end)) != NULL && text <= end) { |
47492dabcb4a
Fixes a crash when next_begin_word is called on trailing spaces at the
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
23174
diff
changeset
|
665 gunichar cur = g_utf8_get_char(text); |
47492dabcb4a
Fixes a crash when next_begin_word is called on trailing spaces at the
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
23174
diff
changeset
|
666 if (!SAME(ch, cur)) |
47492dabcb4a
Fixes a crash when next_begin_word is called on trailing spaces at the
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
23174
diff
changeset
|
667 break; |
47492dabcb4a
Fixes a crash when next_begin_word is called on trailing spaces at the
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
23174
diff
changeset
|
668 } |
15817 | 669 } |
670 return (text ? text : end); | |
671 } | |
672 | |
673 #undef SAME | |
674 static gboolean | |
675 move_back_word(GntBindable *bind, GList *null) | |
676 { | |
677 GntEntry *entry = GNT_ENTRY(bind); | |
678 const char *iter = g_utf8_find_prev_char(entry->start, entry->cursor); | |
679 | |
680 if (iter < entry->start) | |
681 return TRUE; | |
682 iter = begin_word(iter, entry->start); | |
683 entry->cursor = (char*)iter; | |
684 if (entry->cursor < entry->scroll) | |
685 entry->scroll = entry->cursor; | |
21266
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
686 update_kill_ring(entry, ENTRY_JAIL, NULL, 0); |
15817 | 687 entry_redraw(GNT_WIDGET(bind)); |
688 return TRUE; | |
689 } | |
690 | |
691 static gboolean | |
692 del_prev_word(GntBindable *bind, GList *null) | |
693 { | |
694 GntWidget *widget = GNT_WIDGET(bind); | |
695 GntEntry *entry = GNT_ENTRY(bind); | |
696 char *iter = g_utf8_find_prev_char(entry->start, entry->cursor); | |
697 int count; | |
698 | |
699 if (iter < entry->start) | |
700 return TRUE; | |
701 iter = (char*)begin_word(iter, entry->start); | |
702 count = entry->cursor - iter; | |
21266
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
703 update_kill_ring(entry, ENTRY_DEL_BWD_WORD, iter, count); |
15817 | 704 memmove(iter, entry->cursor, entry->end - entry->cursor); |
705 entry->end -= count; | |
706 entry->cursor = iter; | |
707 if (entry->cursor <= entry->scroll) { | |
708 entry->scroll = entry->cursor - widget->priv.width + 2; | |
709 if (entry->scroll < entry->start) | |
710 entry->scroll = entry->start; | |
711 } | |
712 memset(entry->end, '\0', entry->buffer - (entry->end - entry->start)); | |
713 entry_redraw(widget); | |
714 entry_text_changed(entry); | |
715 | |
716 return TRUE; | |
717 } | |
718 | |
719 static gboolean | |
720 move_forward_word(GntBindable *bind, GList *list) | |
721 { | |
722 GntEntry *entry = GNT_ENTRY(bind); | |
723 GntWidget *widget = GNT_WIDGET(bind); | |
724 entry->cursor = (char *)next_begin_word(entry->cursor, entry->end); | |
725 while (gnt_util_onscreen_width(entry->scroll, entry->cursor) >= widget->priv.width) { | |
726 entry->scroll = g_utf8_find_next_char(entry->scroll, NULL); | |
727 } | |
21266
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
728 update_kill_ring(entry, ENTRY_JAIL, NULL, 0); |
15817 | 729 entry_redraw(widget); |
730 return TRUE; | |
731 } | |
732 | |
733 static gboolean | |
734 delete_forward_word(GntBindable *bind, GList *list) | |
735 { | |
736 GntEntry *entry = GNT_ENTRY(bind); | |
737 GntWidget *widget = GNT_WIDGET(bind); | |
738 char *iter = (char *)next_begin_word(entry->cursor, entry->end); | |
739 int len = entry->end - iter + 1; | |
740 if (len <= 0) | |
741 return TRUE; | |
21266
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
742 update_kill_ring(entry, ENTRY_DEL_FWD_WORD, entry->cursor, iter - entry->cursor); |
15817 | 743 memmove(entry->cursor, iter, len); |
744 len = iter - entry->cursor; | |
745 entry->end -= len; | |
746 memset(entry->end, '\0', len); | |
747 entry_redraw(widget); | |
748 entry_text_changed(entry); | |
749 return TRUE; | |
750 } | |
751 | |
752 static gboolean | |
21262
aee0d7fef769
transpose-chars action for the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21250
diff
changeset
|
753 transpose_chars(GntBindable *bind, GList *null) |
aee0d7fef769
transpose-chars action for the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21250
diff
changeset
|
754 { |
aee0d7fef769
transpose-chars action for the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21250
diff
changeset
|
755 GntEntry *entry = GNT_ENTRY(bind); |
aee0d7fef769
transpose-chars action for the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21250
diff
changeset
|
756 char *current, *prev; |
aee0d7fef769
transpose-chars action for the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21250
diff
changeset
|
757 char hold[8]; /* that's right */ |
aee0d7fef769
transpose-chars action for the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21250
diff
changeset
|
758 |
aee0d7fef769
transpose-chars action for the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21250
diff
changeset
|
759 if (entry->cursor <= entry->start) |
aee0d7fef769
transpose-chars action for the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21250
diff
changeset
|
760 return FALSE; |
aee0d7fef769
transpose-chars action for the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21250
diff
changeset
|
761 |
aee0d7fef769
transpose-chars action for the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21250
diff
changeset
|
762 if (!*entry->cursor) |
aee0d7fef769
transpose-chars action for the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21250
diff
changeset
|
763 entry->cursor = g_utf8_find_prev_char(entry->start, entry->cursor); |
aee0d7fef769
transpose-chars action for the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21250
diff
changeset
|
764 |
aee0d7fef769
transpose-chars action for the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21250
diff
changeset
|
765 current = entry->cursor; |
aee0d7fef769
transpose-chars action for the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21250
diff
changeset
|
766 prev = g_utf8_find_prev_char(entry->start, entry->cursor); |
aee0d7fef769
transpose-chars action for the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21250
diff
changeset
|
767 move_forward(bind, null); |
aee0d7fef769
transpose-chars action for the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21250
diff
changeset
|
768 |
aee0d7fef769
transpose-chars action for the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21250
diff
changeset
|
769 /* Let's do this dance! */ |
aee0d7fef769
transpose-chars action for the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21250
diff
changeset
|
770 memcpy(hold, prev, current - prev); |
aee0d7fef769
transpose-chars action for the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21250
diff
changeset
|
771 memmove(prev, current, entry->cursor - current); |
aee0d7fef769
transpose-chars action for the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21250
diff
changeset
|
772 memcpy(prev + (entry->cursor - current), hold, current - prev); |
aee0d7fef769
transpose-chars action for the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21250
diff
changeset
|
773 |
21266
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
774 update_kill_ring(entry, ENTRY_JAIL, NULL, 0); |
21262
aee0d7fef769
transpose-chars action for the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21250
diff
changeset
|
775 entry_redraw(GNT_WIDGET(entry)); |
aee0d7fef769
transpose-chars action for the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21250
diff
changeset
|
776 entry_text_changed(entry); |
aee0d7fef769
transpose-chars action for the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21250
diff
changeset
|
777 return TRUE; |
aee0d7fef769
transpose-chars action for the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21250
diff
changeset
|
778 } |
aee0d7fef769
transpose-chars action for the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21250
diff
changeset
|
779 |
aee0d7fef769
transpose-chars action for the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21250
diff
changeset
|
780 static gboolean |
21266
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
781 entry_yank(GntBindable *bind, GList *null) |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
782 { |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
783 GntEntry *entry = GNT_ENTRY(bind); |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
784 gnt_entry_key_pressed(GNT_WIDGET(entry), entry->killring->buffer->str); |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
785 return TRUE; |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
786 } |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
787 |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
788 static gboolean |
15817 | 789 gnt_entry_key_pressed(GntWidget *widget, const char *text) |
790 { | |
791 GntEntry *entry = GNT_ENTRY(widget); | |
792 | |
793 if (text[0] == 27) | |
794 { | |
795 if (text[1] == 0) | |
796 { | |
797 destroy_suggest(entry); | |
798 return TRUE; | |
799 } | |
800 | |
801 return FALSE; | |
802 } | |
21280
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
803 |
22289
0ba0f2804299
'\n' (ctrl-j) should behave similar to '\r' (ctrl-m). Fixes #4833.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
22007
diff
changeset
|
804 if ((text[0] == '\r' || text[0] == ' ' || text[0] == '\n') && entry->ddown) |
15817 | 805 { |
21280
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
806 char *text = g_strdup(gnt_tree_get_selection_data(GNT_TREE(entry->ddown))); |
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
807 destroy_suggest(entry); |
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
808 complete_suggest(entry, text); |
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
809 g_free(text); |
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
810 update_kill_ring(entry, ENTRY_JAIL, NULL, 0); |
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
811 entry_text_changed(entry); |
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
812 return TRUE; |
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
813 } |
15817 | 814 |
21280
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
815 if (!iscntrl(text[0])) |
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
816 { |
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
817 const char *str, *next; |
15817 | 818 |
21280
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
819 for (str = text; *str; str = next) |
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
820 { |
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
821 int len; |
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
822 next = g_utf8_find_next_char(str, NULL); |
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
823 len = next - str; |
15817 | 824 |
21280
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
825 /* Valid input? */ |
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
826 /* XXX: Is it necessary to use _unichar_ variants here? */ |
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
827 if (ispunct(*str) && (entry->flag & GNT_ENTRY_FLAG_NO_PUNCT)) |
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
828 continue; |
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
829 if (isspace(*str) && (entry->flag & GNT_ENTRY_FLAG_NO_SPACE)) |
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
830 continue; |
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
831 if (isalpha(*str) && !(entry->flag & GNT_ENTRY_FLAG_ALPHA)) |
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
832 continue; |
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
833 if (isdigit(*str) && !(entry->flag & GNT_ENTRY_FLAG_INT)) |
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
834 continue; |
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
835 |
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
836 /* Reached the max? */ |
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
837 if (entry->max && g_utf8_pointer_to_offset(entry->start, entry->end) >= entry->max) |
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
838 continue; |
15817 | 839 |
21280
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
840 if (entry->end + len - entry->start >= entry->buffer) |
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
841 { |
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
842 /* This will cause the buffer to grow */ |
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
843 char *tmp = g_strdup(entry->start); |
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
844 gnt_entry_set_text_internal(entry, tmp); |
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
845 g_free(tmp); |
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
846 } |
15817 | 847 |
21280
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
848 memmove(entry->cursor + len, entry->cursor, entry->end - entry->cursor + 1); |
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
849 entry->end += len; |
15817 | 850 |
21280
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
851 while (str < next) |
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
852 { |
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
853 if (*str == '\r' || *str == '\n') |
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
854 *entry->cursor = ' '; |
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
855 else |
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
856 *entry->cursor = *str; |
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
857 entry->cursor++; |
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
858 str++; |
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
859 } |
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
860 |
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
861 while (gnt_util_onscreen_width(entry->scroll, entry->cursor) >= widget->priv.width) |
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
862 entry->scroll = g_utf8_find_next_char(entry->scroll, NULL); |
15817 | 863 |
21280
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
864 if (entry->ddown) |
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
865 show_suggest_dropdown(entry); |
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
866 } |
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
867 update_kill_ring(entry, ENTRY_JAIL, NULL, 0); |
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
868 entry_redraw(widget); |
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
869 entry_text_changed(entry); |
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
870 return TRUE; |
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
871 } |
15817 | 872 |
22289
0ba0f2804299
'\n' (ctrl-j) should behave similar to '\r' (ctrl-m). Fixes #4833.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
22007
diff
changeset
|
873 if (text[0] == '\r' || text[0] == '\n') { |
21280
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
874 gnt_widget_activate(widget); |
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
875 return TRUE; |
15817 | 876 } |
877 | |
878 return FALSE; | |
879 } | |
880 | |
881 static void | |
21266
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
882 jail_killring(GntEntryKillRing *kr) |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
883 { |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
884 g_string_free(kr->buffer, TRUE); |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
885 g_free(kr); |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
886 } |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
887 |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
888 static void |
15817 | 889 gnt_entry_destroy(GntWidget *widget) |
890 { | |
891 GntEntry *entry = GNT_ENTRY(widget); | |
892 g_free(entry->start); | |
893 | |
894 if (entry->history) | |
895 { | |
896 entry->history = g_list_first(entry->history); | |
897 g_list_foreach(entry->history, (GFunc)g_free, NULL); | |
898 g_list_free(entry->history); | |
899 } | |
900 | |
901 if (entry->suggests) | |
902 { | |
903 g_list_foreach(entry->suggests, (GFunc)g_free, NULL); | |
904 g_list_free(entry->suggests); | |
905 } | |
906 | |
907 if (entry->ddown) | |
908 { | |
909 gnt_widget_destroy(entry->ddown->parent); | |
910 } | |
21266
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
911 |
29671
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28604
diff
changeset
|
912 g_free(entry->search->needle); |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28604
diff
changeset
|
913 g_free(entry->search); |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28604
diff
changeset
|
914 |
21266
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
915 jail_killring(entry->killring); |
15817 | 916 } |
917 | |
918 static void | |
919 gnt_entry_lost_focus(GntWidget *widget) | |
920 { | |
921 GntEntry *entry = GNT_ENTRY(widget); | |
922 destroy_suggest(entry); | |
923 entry_redraw(widget); | |
924 } | |
925 | |
22900
c9aebd4762a8
Middle click pastes the internal clipboard
Richard Nelson <wabz@pidgin.im>
parents:
22698
diff
changeset
|
926 static gboolean |
c9aebd4762a8
Middle click pastes the internal clipboard
Richard Nelson <wabz@pidgin.im>
parents:
22698
diff
changeset
|
927 gnt_entry_clicked(GntWidget *widget, GntMouseEvent event, int x, int y) |
c9aebd4762a8
Middle click pastes the internal clipboard
Richard Nelson <wabz@pidgin.im>
parents:
22698
diff
changeset
|
928 { |
c9aebd4762a8
Middle click pastes the internal clipboard
Richard Nelson <wabz@pidgin.im>
parents:
22698
diff
changeset
|
929 if (event == GNT_MIDDLE_MOUSE_DOWN) { |
c9aebd4762a8
Middle click pastes the internal clipboard
Richard Nelson <wabz@pidgin.im>
parents:
22698
diff
changeset
|
930 clipboard_paste(GNT_BINDABLE(widget), NULL); |
c9aebd4762a8
Middle click pastes the internal clipboard
Richard Nelson <wabz@pidgin.im>
parents:
22698
diff
changeset
|
931 return TRUE; |
c9aebd4762a8
Middle click pastes the internal clipboard
Richard Nelson <wabz@pidgin.im>
parents:
22698
diff
changeset
|
932 } |
c9aebd4762a8
Middle click pastes the internal clipboard
Richard Nelson <wabz@pidgin.im>
parents:
22698
diff
changeset
|
933 return FALSE; |
c9aebd4762a8
Middle click pastes the internal clipboard
Richard Nelson <wabz@pidgin.im>
parents:
22698
diff
changeset
|
934 |
c9aebd4762a8
Middle click pastes the internal clipboard
Richard Nelson <wabz@pidgin.im>
parents:
22698
diff
changeset
|
935 } |
c9aebd4762a8
Middle click pastes the internal clipboard
Richard Nelson <wabz@pidgin.im>
parents:
22698
diff
changeset
|
936 |
15817 | 937 static void |
938 gnt_entry_class_init(GntEntryClass *klass) | |
939 { | |
940 GntBindableClass *bindable = GNT_BINDABLE_CLASS(klass); | |
24586 | 941 char s[3] = {'\033', erasechar(), 0}; |
15817 | 942 |
943 parent_class = GNT_WIDGET_CLASS(klass); | |
22900
c9aebd4762a8
Middle click pastes the internal clipboard
Richard Nelson <wabz@pidgin.im>
parents:
22698
diff
changeset
|
944 parent_class->clicked = gnt_entry_clicked; |
15817 | 945 parent_class->destroy = gnt_entry_destroy; |
946 parent_class->draw = gnt_entry_draw; | |
947 parent_class->map = gnt_entry_map; | |
948 parent_class->size_request = gnt_entry_size_request; | |
949 parent_class->key_pressed = gnt_entry_key_pressed; | |
950 parent_class->lost_focus = gnt_entry_lost_focus; | |
951 | |
952 signals[SIG_TEXT_CHANGED] = | |
953 g_signal_new("text_changed", | |
954 G_TYPE_FROM_CLASS(klass), | |
955 G_SIGNAL_RUN_LAST, | |
956 G_STRUCT_OFFSET(GntEntryClass, text_changed), | |
957 NULL, NULL, | |
958 g_cclosure_marshal_VOID__VOID, | |
959 G_TYPE_NONE, 0); | |
960 | |
18382
aa60f5a89286
A 'completion' signal to emit whenever user accepts a completion suggest.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18346
diff
changeset
|
961 signals[SIG_COMPLETION] = |
aa60f5a89286
A 'completion' signal to emit whenever user accepts a completion suggest.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18346
diff
changeset
|
962 g_signal_new("completion", |
aa60f5a89286
A 'completion' signal to emit whenever user accepts a completion suggest.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18346
diff
changeset
|
963 G_TYPE_FROM_CLASS(klass), |
aa60f5a89286
A 'completion' signal to emit whenever user accepts a completion suggest.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18346
diff
changeset
|
964 G_SIGNAL_RUN_LAST, |
aa60f5a89286
A 'completion' signal to emit whenever user accepts a completion suggest.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18346
diff
changeset
|
965 0, NULL, NULL, |
aa60f5a89286
A 'completion' signal to emit whenever user accepts a completion suggest.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18346
diff
changeset
|
966 gnt_closure_marshal_VOID__POINTER_POINTER, |
aa60f5a89286
A 'completion' signal to emit whenever user accepts a completion suggest.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18346
diff
changeset
|
967 G_TYPE_NONE, 2, G_TYPE_POINTER, G_TYPE_POINTER); |
aa60f5a89286
A 'completion' signal to emit whenever user accepts a completion suggest.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18346
diff
changeset
|
968 |
15817 | 969 gnt_bindable_class_register_action(bindable, "cursor-home", move_start, |
970 GNT_KEY_CTRL_A, NULL); | |
971 gnt_bindable_register_binding(bindable, "cursor-home", GNT_KEY_HOME, NULL); | |
972 gnt_bindable_class_register_action(bindable, "cursor-end", move_end, | |
973 GNT_KEY_CTRL_E, NULL); | |
974 gnt_bindable_register_binding(bindable, "cursor-end", GNT_KEY_END, NULL); | |
975 gnt_bindable_class_register_action(bindable, "delete-prev", backspace, | |
976 GNT_KEY_BACKSPACE, NULL); | |
24586 | 977 gnt_bindable_register_binding(bindable, "delete-prev", s + 1, NULL); |
15817 | 978 gnt_bindable_register_binding(bindable, "delete-prev", GNT_KEY_CTRL_H, NULL); |
979 gnt_bindable_class_register_action(bindable, "delete-next", delkey, | |
980 GNT_KEY_DEL, NULL); | |
981 gnt_bindable_register_binding(bindable, "delete-next", GNT_KEY_CTRL_D, NULL); | |
982 gnt_bindable_class_register_action(bindable, "delete-start", del_to_home, | |
983 GNT_KEY_CTRL_U, NULL); | |
984 gnt_bindable_class_register_action(bindable, "delete-end", del_to_end, | |
985 GNT_KEY_CTRL_K, NULL); | |
986 gnt_bindable_class_register_action(bindable, "delete-prev-word", del_prev_word, | |
987 GNT_KEY_CTRL_W, NULL); | |
24586 | 988 gnt_bindable_register_binding(bindable, "delete-prev-word", s, NULL); |
15817 | 989 gnt_bindable_class_register_action(bindable, "cursor-prev-word", move_back_word, |
990 "\033" "b", NULL); | |
991 gnt_bindable_class_register_action(bindable, "cursor-prev", move_back, | |
992 GNT_KEY_LEFT, NULL); | |
993 gnt_bindable_register_binding(bindable, "cursor-prev", GNT_KEY_CTRL_B, NULL); | |
994 gnt_bindable_class_register_action(bindable, "cursor-next", move_forward, | |
995 GNT_KEY_RIGHT, NULL); | |
996 gnt_bindable_register_binding(bindable, "cursor-next", GNT_KEY_CTRL_F, NULL); | |
997 gnt_bindable_class_register_action(bindable, "cursor-next-word", move_forward_word, | |
998 "\033" "f", NULL); | |
999 gnt_bindable_class_register_action(bindable, "delete-next-word", delete_forward_word, | |
1000 "\033" "d", NULL); | |
21262
aee0d7fef769
transpose-chars action for the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21250
diff
changeset
|
1001 gnt_bindable_class_register_action(bindable, "transpose-chars", transpose_chars, |
aee0d7fef769
transpose-chars action for the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21250
diff
changeset
|
1002 GNT_KEY_CTRL_T, NULL); |
21266
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
1003 gnt_bindable_class_register_action(bindable, "yank", entry_yank, |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
1004 GNT_KEY_CTRL_Y, NULL); |
15817 | 1005 gnt_bindable_class_register_action(bindable, "suggest-show", suggest_show, |
1006 "\t", NULL); | |
1007 gnt_bindable_class_register_action(bindable, "suggest-next", suggest_next, | |
1008 GNT_KEY_DOWN, NULL); | |
1009 gnt_bindable_class_register_action(bindable, "suggest-prev", suggest_prev, | |
1010 GNT_KEY_UP, NULL); | |
30171
aaec35719201
Allow page-up/downing in the suggestion list.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
29671
diff
changeset
|
1011 gnt_bindable_class_register_action(bindable, "suggest-next-page", suggest_next_page, |
aaec35719201
Allow page-up/downing in the suggestion list.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
29671
diff
changeset
|
1012 GNT_KEY_PGDOWN, NULL); |
aaec35719201
Allow page-up/downing in the suggestion list.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
29671
diff
changeset
|
1013 gnt_bindable_class_register_action(bindable, "suggest-prev-page", suggest_prev_page, |
aaec35719201
Allow page-up/downing in the suggestion list.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
29671
diff
changeset
|
1014 GNT_KEY_PGUP, NULL); |
22434
77737a3526f1
The names history-next and history-prev were backwards! Make them right, and add c-n/c-p bindings as the default bindings. Thanks to shofixti for reporting the bug. Fixes #4593.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
22289
diff
changeset
|
1015 gnt_bindable_class_register_action(bindable, "history-next", history_next, |
15817 | 1016 GNT_KEY_CTRL_DOWN, NULL); |
22434
77737a3526f1
The names history-next and history-prev were backwards! Make them right, and add c-n/c-p bindings as the default bindings. Thanks to shofixti for reporting the bug. Fixes #4593.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
22289
diff
changeset
|
1017 gnt_bindable_class_register_action(bindable, "history-prev", history_prev, |
15817 | 1018 GNT_KEY_CTRL_UP, NULL); |
22434
77737a3526f1
The names history-next and history-prev were backwards! Make them right, and add c-n/c-p bindings as the default bindings. Thanks to shofixti for reporting the bug. Fixes #4593.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
22289
diff
changeset
|
1019 gnt_bindable_register_binding(bindable, "history-prev", GNT_KEY_CTRL_P, NULL); |
77737a3526f1
The names history-next and history-prev were backwards! Make them right, and add c-n/c-p bindings as the default bindings. Thanks to shofixti for reporting the bug. Fixes #4593.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
22289
diff
changeset
|
1020 gnt_bindable_register_binding(bindable, "history-next", GNT_KEY_CTRL_N, NULL); |
29671
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28604
diff
changeset
|
1021 gnt_bindable_class_register_action(bindable, "history-search", history_search, |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28604
diff
changeset
|
1022 GNT_KEY_CTRL_R, NULL); |
15817 | 1023 gnt_bindable_class_register_action(bindable, "clipboard-paste", clipboard_paste, |
1024 GNT_KEY_CTRL_V, NULL); | |
1025 | |
1026 gnt_style_read_actions(G_OBJECT_CLASS_TYPE(klass), GNT_BINDABLE_CLASS(klass)); | |
1027 GNTDEBUG; | |
1028 } | |
1029 | |
21266
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
1030 static GntEntryKillRing * |
22007
c38d72677c8a
Probe for -Wstrict-prototypes to get some more warnings. I then cleaned up
Richard Laager <rlaager@wiktel.com>
parents:
21699
diff
changeset
|
1031 new_killring(void) |
21266
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
1032 { |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
1033 GntEntryKillRing *kr = g_new0(GntEntryKillRing, 1); |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
1034 kr->buffer = g_string_new(NULL); |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
1035 return kr; |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
1036 } |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
1037 |
15817 | 1038 static void |
1039 gnt_entry_init(GTypeInstance *instance, gpointer class) | |
1040 { | |
1041 GntWidget *widget = GNT_WIDGET(instance); | |
1042 GntEntry *entry = GNT_ENTRY(instance); | |
1043 | |
1044 entry->flag = GNT_ENTRY_FLAG_ALL; | |
1045 entry->max = 0; | |
21266
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
1046 |
15817 | 1047 entry->histlength = 0; |
1048 entry->history = NULL; | |
1049 | |
1050 entry->word = TRUE; | |
1051 entry->always = FALSE; | |
1052 entry->suggests = NULL; | |
21266
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
1053 entry->killring = new_killring(); |
29671
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28604
diff
changeset
|
1054 entry->search = g_new0(GntEntrySearch, 1); |
15817 | 1055 |
1056 GNT_WIDGET_SET_FLAGS(GNT_WIDGET(entry), | |
1057 GNT_WIDGET_NO_BORDER | GNT_WIDGET_NO_SHADOW | GNT_WIDGET_CAN_TAKE_FOCUS); | |
1058 GNT_WIDGET_SET_FLAGS(GNT_WIDGET(entry), GNT_WIDGET_GROW_X); | |
1059 | |
1060 widget->priv.minw = 3; | |
1061 widget->priv.minh = 1; | |
21266
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
1062 |
15817 | 1063 GNTDEBUG; |
1064 } | |
1065 | |
1066 /****************************************************************************** | |
1067 * GntEntry API | |
1068 *****************************************************************************/ | |
1069 GType | |
1070 gnt_entry_get_gtype(void) | |
1071 { | |
1072 static GType type = 0; | |
1073 | |
1074 if(type == 0) | |
1075 { | |
1076 static const GTypeInfo info = { | |
1077 sizeof(GntEntryClass), | |
1078 NULL, /* base_init */ | |
1079 NULL, /* base_finalize */ | |
1080 (GClassInitFunc)gnt_entry_class_init, | |
1081 NULL, /* class_finalize */ | |
1082 NULL, /* class_data */ | |
1083 sizeof(GntEntry), | |
1084 0, /* n_preallocs */ | |
1085 gnt_entry_init, /* instance_init */ | |
1086 NULL /* value_table */ | |
1087 }; | |
1088 | |
1089 type = g_type_register_static(GNT_TYPE_WIDGET, | |
1090 "GntEntry", | |
1091 &info, 0); | |
1092 } | |
1093 | |
1094 return type; | |
1095 } | |
1096 | |
1097 GntWidget *gnt_entry_new(const char *text) | |
1098 { | |
1099 GntWidget *widget = g_object_new(GNT_TYPE_ENTRY, NULL); | |
1100 GntEntry *entry = GNT_ENTRY(widget); | |
1101 | |
1102 gnt_entry_set_text_internal(entry, text); | |
1103 | |
1104 return widget; | |
1105 } | |
1106 | |
1107 static void | |
1108 gnt_entry_set_text_internal(GntEntry *entry, const char *text) | |
1109 { | |
1110 int len; | |
1111 int scroll, cursor; | |
1112 | |
1113 g_free(entry->start); | |
1114 | |
1115 if (text && text[0]) | |
1116 { | |
1117 len = strlen(text); | |
1118 } | |
1119 else | |
1120 { | |
1121 len = 0; | |
1122 } | |
1123 | |
1124 entry->buffer = len + 128; | |
1125 | |
1126 scroll = entry->scroll - entry->start; | |
1127 cursor = entry->end - entry->cursor; | |
1128 | |
1129 entry->start = g_new0(char, entry->buffer); | |
1130 if (text) | |
1131 snprintf(entry->start, len + 1, "%s", text); | |
1132 entry->end = entry->start + len; | |
1133 | |
28454
f36c4a76a7ac
Fix a couple of invalid reads after clearing the text in an entry box.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28337
diff
changeset
|
1134 if ((entry->scroll = entry->start + scroll) > entry->end) |
f36c4a76a7ac
Fix a couple of invalid reads after clearing the text in an entry box.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28337
diff
changeset
|
1135 entry->scroll = entry->end; |
f36c4a76a7ac
Fix a couple of invalid reads after clearing the text in an entry box.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28337
diff
changeset
|
1136 |
f36c4a76a7ac
Fix a couple of invalid reads after clearing the text in an entry box.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28337
diff
changeset
|
1137 if ((entry->cursor = entry->end - cursor) > entry->end) |
f36c4a76a7ac
Fix a couple of invalid reads after clearing the text in an entry box.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28337
diff
changeset
|
1138 entry->cursor = entry->end; |
15817 | 1139 |
1140 if (GNT_WIDGET_IS_FLAG_SET(GNT_WIDGET(entry), GNT_WIDGET_MAPPED)) | |
1141 entry_redraw(GNT_WIDGET(entry)); | |
1142 } | |
1143 | |
1144 void gnt_entry_set_text(GntEntry *entry, const char *text) | |
1145 { | |
1146 gboolean changed = TRUE; | |
1147 if (text == NULL && entry->start == NULL) | |
1148 changed = FALSE; | |
1149 if (text && entry->start && g_utf8_collate(text, entry->start) == 0) | |
1150 changed = FALSE; | |
1151 gnt_entry_set_text_internal(entry, text); | |
1152 if (changed) | |
1153 entry_text_changed(entry); | |
1154 } | |
1155 | |
1156 void gnt_entry_set_max(GntEntry *entry, int max) | |
1157 { | |
1158 entry->max = max; | |
1159 } | |
1160 | |
1161 void gnt_entry_set_flag(GntEntry *entry, GntEntryFlag flag) | |
1162 { | |
1163 entry->flag = flag; | |
1164 /* XXX: Check the existing string to make sure the flags are respected? */ | |
1165 } | |
1166 | |
1167 const char *gnt_entry_get_text(GntEntry *entry) | |
1168 { | |
1169 return entry->start; | |
1170 } | |
1171 | |
1172 void gnt_entry_clear(GntEntry *entry) | |
1173 { | |
1174 gnt_entry_set_text_internal(entry, NULL); | |
1175 entry->scroll = entry->cursor = entry->end = entry->start; | |
1176 entry_redraw(GNT_WIDGET(entry)); | |
1177 destroy_suggest(entry); | |
1178 entry_text_changed(entry); | |
1179 } | |
1180 | |
1181 void gnt_entry_set_masked(GntEntry *entry, gboolean set) | |
1182 { | |
1183 entry->masked = set; | |
1184 } | |
1185 | |
1186 void gnt_entry_add_to_history(GntEntry *entry, const char *text) | |
1187 { | |
1188 g_return_if_fail(entry->history != NULL); /* Need to set_history_length first */ | |
1189 | |
1190 if (g_list_length(entry->history) >= entry->histlength) | |
1191 return; | |
1192 | |
1193 entry->history = g_list_first(entry->history); | |
1194 g_free(entry->history->data); | |
1195 entry->history->data = g_strdup(text); | |
1196 entry->history = g_list_prepend(entry->history, NULL); | |
1197 } | |
1198 | |
1199 void gnt_entry_set_history_length(GntEntry *entry, int num) | |
1200 { | |
1201 if (num == 0) | |
1202 { | |
1203 entry->histlength = num; | |
1204 if (entry->history) | |
1205 { | |
1206 entry->history = g_list_first(entry->history); | |
1207 g_list_foreach(entry->history, (GFunc)g_free, NULL); | |
1208 g_list_free(entry->history); | |
1209 entry->history = NULL; | |
1210 } | |
1211 return; | |
1212 } | |
1213 | |
1214 if (entry->histlength == 0) | |
1215 { | |
1216 entry->histlength = num; | |
1217 entry->history = g_list_append(NULL, NULL); | |
1218 return; | |
1219 } | |
1220 | |
1221 if (num > 0 && num < entry->histlength) | |
1222 { | |
1223 GList *first, *iter; | |
1224 int index = 0; | |
1225 for (first = entry->history, index = 0; first->prev; first = first->prev, index++); | |
1226 while ((iter = g_list_nth(first, num)) != NULL) | |
1227 { | |
1228 g_free(iter->data); | |
1229 first = g_list_delete_link(first, iter); | |
1230 } | |
1231 entry->histlength = num; | |
1232 if (index >= num) | |
1233 entry->history = g_list_last(first); | |
1234 return; | |
1235 } | |
1236 | |
1237 entry->histlength = num; | |
1238 } | |
1239 | |
1240 void gnt_entry_set_word_suggest(GntEntry *entry, gboolean word) | |
1241 { | |
1242 entry->word = word; | |
1243 } | |
1244 | |
1245 void gnt_entry_set_always_suggest(GntEntry *entry, gboolean always) | |
1246 { | |
1247 entry->always = always; | |
1248 } | |
1249 | |
1250 void gnt_entry_add_suggest(GntEntry *entry, const char *text) | |
1251 { | |
1252 GList *find; | |
1253 | |
1254 if (!text || !*text) | |
1255 return; | |
21266
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
1256 |
15817 | 1257 find = g_list_find_custom(entry->suggests, text, (GCompareFunc)g_utf8_collate); |
1258 if (find) | |
1259 return; | |
1260 entry->suggests = g_list_append(entry->suggests, g_strdup(text)); | |
1261 } | |
1262 | |
1263 void gnt_entry_remove_suggest(GntEntry *entry, const char *text) | |
1264 { | |
1265 GList *find = g_list_find_custom(entry->suggests, text, (GCompareFunc)g_utf8_collate); | |
1266 if (find) | |
1267 { | |
1268 g_free(find->data); | |
1269 entry->suggests = g_list_delete_link(entry->suggests, find); | |
1270 } | |
1271 } | |
1272 |