Mercurial > pidgin.yaz
annotate finch/libgnt/gntentry.c @ 30349:55913ed2a229
bonjour: Fix a crash-on-disconnect I introduced. Closes #11851
author | Paul Aurich <paul@darkrain42.org> |
---|---|
date | Thu, 13 May 2010 21:01:34 +0000 |
parents | 69decc147e5b |
children | aaec35719201 |
rev | line source |
---|---|
17718
8410511f4dbb
applied changes from 016401bd409e6229fae0ab1e80d9fef9365511b3
Eric Polino <aluink@pidgin.im>
parents:
16910
diff
changeset
|
1 /** |
8410511f4dbb
applied changes from 016401bd409e6229fae0ab1e80d9fef9365511b3
Eric Polino <aluink@pidgin.im>
parents:
16910
diff
changeset
|
2 * GNT - The GLib Ncurses Toolkit |
8410511f4dbb
applied changes from 016401bd409e6229fae0ab1e80d9fef9365511b3
Eric Polino <aluink@pidgin.im>
parents:
16910
diff
changeset
|
3 * |
8410511f4dbb
applied changes from 016401bd409e6229fae0ab1e80d9fef9365511b3
Eric Polino <aluink@pidgin.im>
parents:
16910
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:
16910
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:
16910
diff
changeset
|
6 * source distribution. |
8410511f4dbb
applied changes from 016401bd409e6229fae0ab1e80d9fef9365511b3
Eric Polino <aluink@pidgin.im>
parents:
16910
diff
changeset
|
7 * |
8410511f4dbb
applied changes from 016401bd409e6229fae0ab1e80d9fef9365511b3
Eric Polino <aluink@pidgin.im>
parents:
16910
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:
16910
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:
16910
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:
16910
diff
changeset
|
11 * (at your option) any later version. |
8410511f4dbb
applied changes from 016401bd409e6229fae0ab1e80d9fef9365511b3
Eric Polino <aluink@pidgin.im>
parents:
16910
diff
changeset
|
12 * |
8410511f4dbb
applied changes from 016401bd409e6229fae0ab1e80d9fef9365511b3
Eric Polino <aluink@pidgin.im>
parents:
16910
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:
16910
diff
changeset
|
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
8410511f4dbb
applied changes from 016401bd409e6229fae0ab1e80d9fef9365511b3
Eric Polino <aluink@pidgin.im>
parents:
16910
diff
changeset
|
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
8410511f4dbb
applied changes from 016401bd409e6229fae0ab1e80d9fef9365511b3
Eric Polino <aluink@pidgin.im>
parents:
16910
diff
changeset
|
16 * GNU General Public License for more details. |
8410511f4dbb
applied changes from 016401bd409e6229fae0ab1e80d9fef9365511b3
Eric Polino <aluink@pidgin.im>
parents:
16910
diff
changeset
|
17 * |
8410511f4dbb
applied changes from 016401bd409e6229fae0ab1e80d9fef9365511b3
Eric Polino <aluink@pidgin.im>
parents:
16910
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:
16910
diff
changeset
|
19 * along with this program; if not, write to the Free Software |
19680
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 |
17718
8410511f4dbb
applied changes from 016401bd409e6229fae0ab1e80d9fef9365511b3
Eric Polino <aluink@pidgin.im>
parents:
16910
diff
changeset
|
21 */ |
8410511f4dbb
applied changes from 016401bd409e6229fae0ab1e80d9fef9365511b3
Eric Polino <aluink@pidgin.im>
parents:
16910
diff
changeset
|
22 |
15818 | 23 #include <ctype.h> |
24 #include <string.h> | |
25 | |
28984
a18f421696dc
Fix showing umlauts etc. on non-utf8 locales.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28827
diff
changeset
|
26 #include "gntinternal.h" |
15818 | 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" |
15818 | 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, |
15818 | 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 |
30077
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28984
diff
changeset
|
58 struct _GntEntrySearch |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28984
diff
changeset
|
59 { |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28984
diff
changeset
|
60 char *needle; |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28984
diff
changeset
|
61 }; |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28984
diff
changeset
|
62 |
15818 | 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:
15818
diff
changeset
|
67 static gboolean gnt_entry_key_pressed(GntWidget *widget, const char *text); |
15818 | 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 |
15818 | 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 | |
16900
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 |
16900
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); |
16900
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); |
16900
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; |
16900
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); |
16900
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; |
16900
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:
19680
diff
changeset
|
174 static int |
470feb3084a4
Tab-complete as much as possible when there are multiple suggests.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
19680
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:
19680
diff
changeset
|
176 { |
470feb3084a4
Tab-complete as much as possible when there are multiple suggests.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
19680
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:
19680
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:
19680
diff
changeset
|
179 f++; |
470feb3084a4
Tab-complete as much as possible when there are multiple suggests.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
19680
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:
19680
diff
changeset
|
181 } |
470feb3084a4
Tab-complete as much as possible when there are multiple suggests.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
19680
diff
changeset
|
182 |
16900
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 |
15818 | 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; | |
16900
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; |
16910
6502a3846264
Fix tab-completion.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16900
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:
19680
diff
changeset
|
193 int max = -1; |
15818 | 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:
19680
diff
changeset
|
205 |
15818 | 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 { | |
16900
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; |
15818 | 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:
19680
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:
19680
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:
19680
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:
19680
diff
changeset
|
237 max = MIN(max, max_common_prefix(sgst + len, text + len)); |
16910
6502a3846264
Fix tab-completion.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16900
diff
changeset
|
238 sgst = text; |
15818 | 239 } |
240 } | |
241 g_free(suggest); | |
242 | |
16900
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) { |
15818 | 244 destroy_suggest(entry); |
245 return FALSE; | |
16900
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) { |
22681
4a05b9db0b91
Return FALSE when nothing changes after an attempted tab-completion.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
22423
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:
22423
diff
changeset
|
248 gboolean ret; |
4a05b9db0b91
Return FALSE when nothing changes after an attempted tab-completion.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
22423
diff
changeset
|
249 |
16900
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); |
22681
4a05b9db0b91
Return FALSE when nothing changes after an attempted tab-completion.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
22423
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:
22423
diff
changeset
|
252 |
4a05b9db0b91
Return FALSE when nothing changes after an attempted tab-completion.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
22423
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:
22423
diff
changeset
|
254 g_free(store); |
4a05b9db0b91
Return FALSE when nothing changes after an attempted tab-completion.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
22423
diff
changeset
|
255 return ret; |
16900
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:
19680
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:
19680
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:
19680
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:
19680
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:
19680
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:
19680
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:
19680
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:
19680
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:
19680
diff
changeset
|
265 else |
470feb3084a4
Tab-complete as much as possible when there are multiple suggests.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
19680
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:
19680
diff
changeset
|
267 } |
16900
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); |
15818 | 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; | |
26521
c67d43408daa
Update hardware cursor correctly.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
24532
diff
changeset
|
280 int curpos; |
15818 | 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)); |
15818 | 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)); |
15818 | 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 | |
28984
a18f421696dc
Fix showing umlauts etc. on non-utf8 locales.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28827
diff
changeset
|
293 mvwprintw(widget->window, 0, 0, "%s", C_(entry->scroll)); |
15818 | 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:
17718
diff
changeset
|
297 mvwhline(widget->window, 0, stop, ENTRY_CHAR, widget->priv.width - stop); |
15818 | 298 |
26521
c67d43408daa
Update hardware cursor correctly.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
24532
diff
changeset
|
299 curpos = gnt_util_onscreen_width(entry->scroll, entry->cursor); |
15818 | 300 if (focus) |
26521
c67d43408daa
Update hardware cursor correctly.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
24532
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:
24532
diff
changeset
|
302 wmove(widget->window, 0, curpos); |
15818 | 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); |
15818 | 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); |
15818 | 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 |
15818 | 375 len = entry->cursor - g_utf8_find_prev_char(entry->start, entry->cursor); |
24498
2675fda76ddf
Do not alter the killring on delete-prev or delete-next (char) operations.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
24353
diff
changeset
|
376 update_kill_ring(entry, ENTRY_JAIL, entry->cursor, -len); |
15818 | 377 entry->cursor -= len; |
21266
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
378 |
15818 | 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 |
15818 | 401 len = g_utf8_find_next_char(entry->cursor, NULL) - entry->cursor; |
24498
2675fda76ddf
Do not alter the killring on delete-prev or delete-next (char) operations.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
24353
diff
changeset
|
402 update_kill_ring(entry, ENTRY_JAIL, entry->cursor, len); |
15818 | 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); |
15818 | 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); |
15818 | 433 return TRUE; |
434 } | |
435 | |
436 static gboolean | |
22423
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) |
15818 | 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); |
15818 | 448 return TRUE; |
449 } | |
450 return FALSE; | |
451 } | |
452 | |
453 static gboolean | |
22423
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) |
15818 | 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); |
15818 | 473 return TRUE; |
474 } | |
475 return FALSE; | |
476 } | |
477 | |
478 static gboolean | |
30077
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28984
diff
changeset
|
479 history_search(GntBindable *bind, GList *null) |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28984
diff
changeset
|
480 { |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28984
diff
changeset
|
481 GntEntry *entry = GNT_ENTRY(bind); |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28984
diff
changeset
|
482 GList *iter; |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28984
diff
changeset
|
483 const char *current , *pos; |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28984
diff
changeset
|
484 int len; |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28984
diff
changeset
|
485 |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28984
diff
changeset
|
486 if (entry->history->prev && entry->search->needle) |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28984
diff
changeset
|
487 current = entry->search->needle; |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28984
diff
changeset
|
488 else |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28984
diff
changeset
|
489 current = gnt_entry_get_text(entry); |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28984
diff
changeset
|
490 |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28984
diff
changeset
|
491 if (!entry->histlength || !entry->history->next || !*current) |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28984
diff
changeset
|
492 return FALSE; |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28984
diff
changeset
|
493 |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28984
diff
changeset
|
494 len = g_utf8_strlen(current, -1); |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28984
diff
changeset
|
495 |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28984
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:
28984
diff
changeset
|
497 const char *str = iter->data; |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28984
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:
28984
diff
changeset
|
499 * for now, this will have to do. */ |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28984
diff
changeset
|
500 if ((pos = strstr(str, current))) |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28984
diff
changeset
|
501 break; |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28984
diff
changeset
|
502 } |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28984
diff
changeset
|
503 |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28984
diff
changeset
|
504 if (!iter) |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28984
diff
changeset
|
505 return TRUE; |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28984
diff
changeset
|
506 |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28984
diff
changeset
|
507 if (entry->history->prev == NULL) { |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28984
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:
28984
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:
28984
diff
changeset
|
510 |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28984
diff
changeset
|
511 g_free(entry->search->needle); |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28984
diff
changeset
|
512 entry->search->needle = g_strdup(current); |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28984
diff
changeset
|
513 |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28984
diff
changeset
|
514 g_free(entry->history->data); |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28984
diff
changeset
|
515 entry->history->data = text; |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28984
diff
changeset
|
516 } |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28984
diff
changeset
|
517 |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28984
diff
changeset
|
518 entry->history = iter; |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28984
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:
28984
diff
changeset
|
520 destroy_suggest(entry); |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28984
diff
changeset
|
521 entry_text_changed(entry); |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28984
diff
changeset
|
522 |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28984
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:
28984
diff
changeset
|
524 return TRUE; |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28984
diff
changeset
|
525 } |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28984
diff
changeset
|
526 |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28984
diff
changeset
|
527 static gboolean |
15818 | 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); |
15818 | 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:
15818
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:
15818
diff
changeset
|
552 if (entry->ddown) { |
28704
650ab9eb4b21
Add missing null sentinels, and help the compiler catch such errors.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
26521
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:
15818
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:
15818
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:
15818
diff
changeset
|
556 return show_suggest_dropdown(entry); |
15818 | 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 | |
582 del_to_home(GntBindable *bind, GList *null) | |
583 { | |
584 GntEntry *entry = GNT_ENTRY(bind); | |
585 if (entry->cursor <= entry->start) | |
586 return TRUE; | |
21266
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
587 update_kill_ring(entry, ENTRY_DEL_BOL, entry->start, entry->cursor - entry->start); |
15818 | 588 memmove(entry->start, entry->cursor, entry->end - entry->cursor); |
589 entry->end -= (entry->cursor - entry->start); | |
590 entry->cursor = entry->scroll = entry->start; | |
591 memset(entry->end, '\0', entry->buffer - (entry->end - entry->start)); | |
592 entry_redraw(GNT_WIDGET(bind)); | |
593 entry_text_changed(entry); | |
594 return TRUE; | |
595 } | |
596 | |
597 static gboolean | |
598 del_to_end(GntBindable *bind, GList *null) | |
599 { | |
600 GntEntry *entry = GNT_ENTRY(bind); | |
601 if (entry->end <= entry->cursor) | |
602 return TRUE; | |
21266
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
603 update_kill_ring(entry, ENTRY_DEL_EOL, entry->cursor, entry->end - entry->cursor); |
15818 | 604 entry->end = entry->cursor; |
605 memset(entry->end, '\0', entry->buffer - (entry->end - entry->start)); | |
606 entry_redraw(GNT_WIDGET(bind)); | |
607 entry_text_changed(entry); | |
608 return TRUE; | |
609 } | |
610 | |
23176
f3087936d594
Treat digits and alphabets as the same class of characters when looking
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
22902
diff
changeset
|
611 #define SAME(a,b) ((g_unichar_isalnum(a) && g_unichar_isalnum(b)) || \ |
15818 | 612 (g_unichar_isspace(a) && g_unichar_isspace(b)) || \ |
23176
f3087936d594
Treat digits and alphabets as the same class of characters when looking
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
22902
diff
changeset
|
613 (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:
22902
diff
changeset
|
614 (g_unichar_ispunct(a) && g_unichar_ispunct(b))) |
15818 | 615 |
616 static const char * | |
617 begin_word(const char *text, const char *begin) | |
618 { | |
619 gunichar ch = 0; | |
620 while (text > begin && (!*text || g_unichar_isspace(g_utf8_get_char(text)))) | |
621 text = g_utf8_find_prev_char(begin, text); | |
622 ch = g_utf8_get_char(text); | |
623 while ((text = g_utf8_find_prev_char(begin, text)) >= begin) { | |
624 gunichar cur = g_utf8_get_char(text); | |
625 if (!SAME(ch, cur)) | |
626 break; | |
627 } | |
628 | |
629 return (text ? g_utf8_find_next_char(text, NULL) : begin); | |
630 } | |
631 | |
632 static const char * | |
633 next_begin_word(const char *text, const char *end) | |
634 { | |
635 gunichar ch = 0; | |
21680
65f2a29617a2
Fix cursor-next-word behaviour, noticed by jtb.
Richard Nelson <wabz@pidgin.im>
parents:
21280
diff
changeset
|
636 |
65f2a29617a2
Fix cursor-next-word behaviour, noticed by jtb.
Richard Nelson <wabz@pidgin.im>
parents:
21280
diff
changeset
|
637 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
|
638 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
|
639 |
23296
47492dabcb4a
Fixes a crash when next_begin_word is called on trailing spaces at the
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
23176
diff
changeset
|
640 if (text) { |
47492dabcb4a
Fixes a crash when next_begin_word is called on trailing spaces at the
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
23176
diff
changeset
|
641 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:
23176
diff
changeset
|
642 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:
23176
diff
changeset
|
643 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:
23176
diff
changeset
|
644 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:
23176
diff
changeset
|
645 break; |
47492dabcb4a
Fixes a crash when next_begin_word is called on trailing spaces at the
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
23176
diff
changeset
|
646 } |
15818 | 647 } |
648 return (text ? text : end); | |
649 } | |
650 | |
651 #undef SAME | |
652 static gboolean | |
653 move_back_word(GntBindable *bind, GList *null) | |
654 { | |
655 GntEntry *entry = GNT_ENTRY(bind); | |
656 const char *iter = g_utf8_find_prev_char(entry->start, entry->cursor); | |
657 | |
658 if (iter < entry->start) | |
659 return TRUE; | |
660 iter = begin_word(iter, entry->start); | |
661 entry->cursor = (char*)iter; | |
662 if (entry->cursor < entry->scroll) | |
663 entry->scroll = entry->cursor; | |
21266
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
664 update_kill_ring(entry, ENTRY_JAIL, NULL, 0); |
15818 | 665 entry_redraw(GNT_WIDGET(bind)); |
666 return TRUE; | |
667 } | |
668 | |
669 static gboolean | |
670 del_prev_word(GntBindable *bind, GList *null) | |
671 { | |
672 GntWidget *widget = GNT_WIDGET(bind); | |
673 GntEntry *entry = GNT_ENTRY(bind); | |
674 char *iter = g_utf8_find_prev_char(entry->start, entry->cursor); | |
675 int count; | |
676 | |
677 if (iter < entry->start) | |
678 return TRUE; | |
679 iter = (char*)begin_word(iter, entry->start); | |
680 count = entry->cursor - iter; | |
21266
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
681 update_kill_ring(entry, ENTRY_DEL_BWD_WORD, iter, count); |
15818 | 682 memmove(iter, entry->cursor, entry->end - entry->cursor); |
683 entry->end -= count; | |
684 entry->cursor = iter; | |
685 if (entry->cursor <= entry->scroll) { | |
686 entry->scroll = entry->cursor - widget->priv.width + 2; | |
687 if (entry->scroll < entry->start) | |
688 entry->scroll = entry->start; | |
689 } | |
690 memset(entry->end, '\0', entry->buffer - (entry->end - entry->start)); | |
691 entry_redraw(widget); | |
692 entry_text_changed(entry); | |
693 | |
694 return TRUE; | |
695 } | |
696 | |
697 static gboolean | |
698 move_forward_word(GntBindable *bind, GList *list) | |
699 { | |
700 GntEntry *entry = GNT_ENTRY(bind); | |
701 GntWidget *widget = GNT_WIDGET(bind); | |
702 entry->cursor = (char *)next_begin_word(entry->cursor, entry->end); | |
703 while (gnt_util_onscreen_width(entry->scroll, entry->cursor) >= widget->priv.width) { | |
704 entry->scroll = g_utf8_find_next_char(entry->scroll, NULL); | |
705 } | |
21266
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
706 update_kill_ring(entry, ENTRY_JAIL, NULL, 0); |
15818 | 707 entry_redraw(widget); |
708 return TRUE; | |
709 } | |
710 | |
711 static gboolean | |
712 delete_forward_word(GntBindable *bind, GList *list) | |
713 { | |
714 GntEntry *entry = GNT_ENTRY(bind); | |
715 GntWidget *widget = GNT_WIDGET(bind); | |
716 char *iter = (char *)next_begin_word(entry->cursor, entry->end); | |
717 int len = entry->end - iter + 1; | |
718 if (len <= 0) | |
719 return TRUE; | |
21266
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
720 update_kill_ring(entry, ENTRY_DEL_FWD_WORD, entry->cursor, iter - entry->cursor); |
15818 | 721 memmove(entry->cursor, iter, len); |
722 len = iter - entry->cursor; | |
723 entry->end -= len; | |
724 memset(entry->end, '\0', len); | |
725 entry_redraw(widget); | |
726 entry_text_changed(entry); | |
727 return TRUE; | |
728 } | |
729 | |
730 static gboolean | |
21262
aee0d7fef769
transpose-chars action for the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21250
diff
changeset
|
731 transpose_chars(GntBindable *bind, GList *null) |
aee0d7fef769
transpose-chars action for the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21250
diff
changeset
|
732 { |
aee0d7fef769
transpose-chars action for the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21250
diff
changeset
|
733 GntEntry *entry = GNT_ENTRY(bind); |
aee0d7fef769
transpose-chars action for the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21250
diff
changeset
|
734 char *current, *prev; |
aee0d7fef769
transpose-chars action for the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21250
diff
changeset
|
735 char hold[8]; /* that's right */ |
aee0d7fef769
transpose-chars action for the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21250
diff
changeset
|
736 |
aee0d7fef769
transpose-chars action for the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21250
diff
changeset
|
737 if (entry->cursor <= entry->start) |
aee0d7fef769
transpose-chars action for the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21250
diff
changeset
|
738 return FALSE; |
aee0d7fef769
transpose-chars action for the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21250
diff
changeset
|
739 |
aee0d7fef769
transpose-chars action for the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21250
diff
changeset
|
740 if (!*entry->cursor) |
aee0d7fef769
transpose-chars action for the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21250
diff
changeset
|
741 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
|
742 |
aee0d7fef769
transpose-chars action for the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21250
diff
changeset
|
743 current = entry->cursor; |
aee0d7fef769
transpose-chars action for the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21250
diff
changeset
|
744 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
|
745 move_forward(bind, null); |
aee0d7fef769
transpose-chars action for the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21250
diff
changeset
|
746 |
aee0d7fef769
transpose-chars action for the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21250
diff
changeset
|
747 /* Let's do this dance! */ |
aee0d7fef769
transpose-chars action for the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21250
diff
changeset
|
748 memcpy(hold, prev, current - prev); |
aee0d7fef769
transpose-chars action for the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21250
diff
changeset
|
749 memmove(prev, current, entry->cursor - current); |
aee0d7fef769
transpose-chars action for the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21250
diff
changeset
|
750 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
|
751 |
21266
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
752 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
|
753 entry_redraw(GNT_WIDGET(entry)); |
aee0d7fef769
transpose-chars action for the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21250
diff
changeset
|
754 entry_text_changed(entry); |
aee0d7fef769
transpose-chars action for the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21250
diff
changeset
|
755 return TRUE; |
aee0d7fef769
transpose-chars action for the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21250
diff
changeset
|
756 } |
aee0d7fef769
transpose-chars action for the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21250
diff
changeset
|
757 |
aee0d7fef769
transpose-chars action for the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21250
diff
changeset
|
758 static gboolean |
21266
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
759 entry_yank(GntBindable *bind, GList *null) |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
760 { |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
761 GntEntry *entry = GNT_ENTRY(bind); |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
762 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
|
763 return TRUE; |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
764 } |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
765 |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
766 static gboolean |
15818 | 767 gnt_entry_key_pressed(GntWidget *widget, const char *text) |
768 { | |
769 GntEntry *entry = GNT_ENTRY(widget); | |
770 | |
771 if (text[0] == 27) | |
772 { | |
773 if (text[1] == 0) | |
774 { | |
775 destroy_suggest(entry); | |
776 return TRUE; | |
777 } | |
778 | |
779 return FALSE; | |
780 } | |
21280
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
781 |
22289
0ba0f2804299
'\n' (ctrl-j) should behave similar to '\r' (ctrl-m). Fixes #4833.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
22007
diff
changeset
|
782 if ((text[0] == '\r' || text[0] == ' ' || text[0] == '\n') && entry->ddown) |
15818 | 783 { |
21280
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
784 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
|
785 destroy_suggest(entry); |
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
786 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
|
787 g_free(text); |
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
788 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
|
789 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
|
790 return TRUE; |
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
791 } |
15818 | 792 |
21280
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
793 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
|
794 { |
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
795 const char *str, *next; |
15818 | 796 |
21280
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
797 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
|
798 { |
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
799 int len; |
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
800 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
|
801 len = next - str; |
15818 | 802 |
21280
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
803 /* Valid input? */ |
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
804 /* 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
|
805 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
|
806 continue; |
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
807 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
|
808 continue; |
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
809 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
|
810 continue; |
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
811 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
|
812 continue; |
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
813 |
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
814 /* Reached the max? */ |
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
815 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
|
816 continue; |
15818 | 817 |
21280
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
818 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
|
819 { |
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
820 /* 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
|
821 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
|
822 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
|
823 g_free(tmp); |
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
824 } |
15818 | 825 |
21280
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
826 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
|
827 entry->end += len; |
15818 | 828 |
21280
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
829 while (str < next) |
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
830 { |
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
831 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
|
832 *entry->cursor = ' '; |
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
833 else |
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
834 *entry->cursor = *str; |
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
835 entry->cursor++; |
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
836 str++; |
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
837 } |
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
838 |
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
839 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
|
840 entry->scroll = g_utf8_find_next_char(entry->scroll, NULL); |
15818 | 841 |
21280
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
842 if (entry->ddown) |
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
843 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
|
844 } |
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
845 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
|
846 entry_redraw(widget); |
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
847 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
|
848 return TRUE; |
cfbff4a9b2b6
Hitting Return in the entry will trigger the 'activate' signal.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21266
diff
changeset
|
849 } |
15818 | 850 |
22289
0ba0f2804299
'\n' (ctrl-j) should behave similar to '\r' (ctrl-m). Fixes #4833.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
22007
diff
changeset
|
851 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
|
852 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
|
853 return TRUE; |
15818 | 854 } |
855 | |
856 return FALSE; | |
857 } | |
858 | |
859 static void | |
21266
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
860 jail_killring(GntEntryKillRing *kr) |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
861 { |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
862 g_string_free(kr->buffer, TRUE); |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
863 g_free(kr); |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
864 } |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
865 |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
866 static void |
15818 | 867 gnt_entry_destroy(GntWidget *widget) |
868 { | |
869 GntEntry *entry = GNT_ENTRY(widget); | |
870 g_free(entry->start); | |
871 | |
872 if (entry->history) | |
873 { | |
874 entry->history = g_list_first(entry->history); | |
875 g_list_foreach(entry->history, (GFunc)g_free, NULL); | |
876 g_list_free(entry->history); | |
877 } | |
878 | |
879 if (entry->suggests) | |
880 { | |
881 g_list_foreach(entry->suggests, (GFunc)g_free, NULL); | |
882 g_list_free(entry->suggests); | |
883 } | |
884 | |
885 if (entry->ddown) | |
886 { | |
887 gnt_widget_destroy(entry->ddown->parent); | |
888 } | |
21266
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
889 |
30077
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28984
diff
changeset
|
890 g_free(entry->search->needle); |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28984
diff
changeset
|
891 g_free(entry->search); |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28984
diff
changeset
|
892 |
21266
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
893 jail_killring(entry->killring); |
15818 | 894 } |
895 | |
896 static void | |
897 gnt_entry_lost_focus(GntWidget *widget) | |
898 { | |
899 GntEntry *entry = GNT_ENTRY(widget); | |
900 destroy_suggest(entry); | |
901 entry_redraw(widget); | |
902 } | |
903 | |
22902
c9aebd4762a8
Middle click pastes the internal clipboard
Richard Nelson <wabz@pidgin.im>
parents:
22681
diff
changeset
|
904 static gboolean |
c9aebd4762a8
Middle click pastes the internal clipboard
Richard Nelson <wabz@pidgin.im>
parents:
22681
diff
changeset
|
905 gnt_entry_clicked(GntWidget *widget, GntMouseEvent event, int x, int y) |
c9aebd4762a8
Middle click pastes the internal clipboard
Richard Nelson <wabz@pidgin.im>
parents:
22681
diff
changeset
|
906 { |
c9aebd4762a8
Middle click pastes the internal clipboard
Richard Nelson <wabz@pidgin.im>
parents:
22681
diff
changeset
|
907 if (event == GNT_MIDDLE_MOUSE_DOWN) { |
c9aebd4762a8
Middle click pastes the internal clipboard
Richard Nelson <wabz@pidgin.im>
parents:
22681
diff
changeset
|
908 clipboard_paste(GNT_BINDABLE(widget), NULL); |
c9aebd4762a8
Middle click pastes the internal clipboard
Richard Nelson <wabz@pidgin.im>
parents:
22681
diff
changeset
|
909 return TRUE; |
c9aebd4762a8
Middle click pastes the internal clipboard
Richard Nelson <wabz@pidgin.im>
parents:
22681
diff
changeset
|
910 } |
c9aebd4762a8
Middle click pastes the internal clipboard
Richard Nelson <wabz@pidgin.im>
parents:
22681
diff
changeset
|
911 return FALSE; |
c9aebd4762a8
Middle click pastes the internal clipboard
Richard Nelson <wabz@pidgin.im>
parents:
22681
diff
changeset
|
912 |
c9aebd4762a8
Middle click pastes the internal clipboard
Richard Nelson <wabz@pidgin.im>
parents:
22681
diff
changeset
|
913 } |
c9aebd4762a8
Middle click pastes the internal clipboard
Richard Nelson <wabz@pidgin.im>
parents:
22681
diff
changeset
|
914 |
15818 | 915 static void |
916 gnt_entry_class_init(GntEntryClass *klass) | |
917 { | |
918 GntBindableClass *bindable = GNT_BINDABLE_CLASS(klass); | |
24532 | 919 char s[3] = {'\033', erasechar(), 0}; |
15818 | 920 |
921 parent_class = GNT_WIDGET_CLASS(klass); | |
22902
c9aebd4762a8
Middle click pastes the internal clipboard
Richard Nelson <wabz@pidgin.im>
parents:
22681
diff
changeset
|
922 parent_class->clicked = gnt_entry_clicked; |
15818 | 923 parent_class->destroy = gnt_entry_destroy; |
924 parent_class->draw = gnt_entry_draw; | |
925 parent_class->map = gnt_entry_map; | |
926 parent_class->size_request = gnt_entry_size_request; | |
927 parent_class->key_pressed = gnt_entry_key_pressed; | |
928 parent_class->lost_focus = gnt_entry_lost_focus; | |
929 | |
930 signals[SIG_TEXT_CHANGED] = | |
931 g_signal_new("text_changed", | |
932 G_TYPE_FROM_CLASS(klass), | |
933 G_SIGNAL_RUN_LAST, | |
934 G_STRUCT_OFFSET(GntEntryClass, text_changed), | |
935 NULL, NULL, | |
936 g_cclosure_marshal_VOID__VOID, | |
937 G_TYPE_NONE, 0); | |
938 | |
18382
aa60f5a89286
A 'completion' signal to emit whenever user accepts a completion suggest.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18346
diff
changeset
|
939 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
|
940 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
|
941 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
|
942 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
|
943 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
|
944 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
|
945 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
|
946 |
15818 | 947 gnt_bindable_class_register_action(bindable, "cursor-home", move_start, |
948 GNT_KEY_CTRL_A, NULL); | |
949 gnt_bindable_register_binding(bindable, "cursor-home", GNT_KEY_HOME, NULL); | |
950 gnt_bindable_class_register_action(bindable, "cursor-end", move_end, | |
951 GNT_KEY_CTRL_E, NULL); | |
952 gnt_bindable_register_binding(bindable, "cursor-end", GNT_KEY_END, NULL); | |
953 gnt_bindable_class_register_action(bindable, "delete-prev", backspace, | |
954 GNT_KEY_BACKSPACE, NULL); | |
24532 | 955 gnt_bindable_register_binding(bindable, "delete-prev", s + 1, NULL); |
15818 | 956 gnt_bindable_register_binding(bindable, "delete-prev", GNT_KEY_CTRL_H, NULL); |
957 gnt_bindable_class_register_action(bindable, "delete-next", delkey, | |
958 GNT_KEY_DEL, NULL); | |
959 gnt_bindable_register_binding(bindable, "delete-next", GNT_KEY_CTRL_D, NULL); | |
960 gnt_bindable_class_register_action(bindable, "delete-start", del_to_home, | |
961 GNT_KEY_CTRL_U, NULL); | |
962 gnt_bindable_class_register_action(bindable, "delete-end", del_to_end, | |
963 GNT_KEY_CTRL_K, NULL); | |
964 gnt_bindable_class_register_action(bindable, "delete-prev-word", del_prev_word, | |
965 GNT_KEY_CTRL_W, NULL); | |
24532 | 966 gnt_bindable_register_binding(bindable, "delete-prev-word", s, NULL); |
15818 | 967 gnt_bindable_class_register_action(bindable, "cursor-prev-word", move_back_word, |
968 "\033" "b", NULL); | |
969 gnt_bindable_class_register_action(bindable, "cursor-prev", move_back, | |
970 GNT_KEY_LEFT, NULL); | |
971 gnt_bindable_register_binding(bindable, "cursor-prev", GNT_KEY_CTRL_B, NULL); | |
972 gnt_bindable_class_register_action(bindable, "cursor-next", move_forward, | |
973 GNT_KEY_RIGHT, NULL); | |
974 gnt_bindable_register_binding(bindable, "cursor-next", GNT_KEY_CTRL_F, NULL); | |
975 gnt_bindable_class_register_action(bindable, "cursor-next-word", move_forward_word, | |
976 "\033" "f", NULL); | |
977 gnt_bindable_class_register_action(bindable, "delete-next-word", delete_forward_word, | |
978 "\033" "d", NULL); | |
21262
aee0d7fef769
transpose-chars action for the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21250
diff
changeset
|
979 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
|
980 GNT_KEY_CTRL_T, NULL); |
21266
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
981 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
|
982 GNT_KEY_CTRL_Y, NULL); |
15818 | 983 gnt_bindable_class_register_action(bindable, "suggest-show", suggest_show, |
984 "\t", NULL); | |
985 gnt_bindable_class_register_action(bindable, "suggest-next", suggest_next, | |
986 GNT_KEY_DOWN, NULL); | |
987 gnt_bindable_class_register_action(bindable, "suggest-prev", suggest_prev, | |
988 GNT_KEY_UP, NULL); | |
22423
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
|
989 gnt_bindable_class_register_action(bindable, "history-next", history_next, |
15818 | 990 GNT_KEY_CTRL_DOWN, NULL); |
22423
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
|
991 gnt_bindable_class_register_action(bindable, "history-prev", history_prev, |
15818 | 992 GNT_KEY_CTRL_UP, NULL); |
22423
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
|
993 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
|
994 gnt_bindable_register_binding(bindable, "history-next", GNT_KEY_CTRL_N, NULL); |
30077
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28984
diff
changeset
|
995 gnt_bindable_class_register_action(bindable, "history-search", history_search, |
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28984
diff
changeset
|
996 GNT_KEY_CTRL_R, NULL); |
15818 | 997 gnt_bindable_class_register_action(bindable, "clipboard-paste", clipboard_paste, |
998 GNT_KEY_CTRL_V, NULL); | |
999 | |
1000 gnt_style_read_actions(G_OBJECT_CLASS_TYPE(klass), GNT_BINDABLE_CLASS(klass)); | |
1001 GNTDEBUG; | |
1002 } | |
1003 | |
21266
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
1004 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
|
1005 new_killring(void) |
21266
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
1006 { |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
1007 GntEntryKillRing *kr = g_new0(GntEntryKillRing, 1); |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
1008 kr->buffer = g_string_new(NULL); |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
1009 return kr; |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
1010 } |
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
1011 |
15818 | 1012 static void |
1013 gnt_entry_init(GTypeInstance *instance, gpointer class) | |
1014 { | |
1015 GntWidget *widget = GNT_WIDGET(instance); | |
1016 GntEntry *entry = GNT_ENTRY(instance); | |
1017 | |
1018 entry->flag = GNT_ENTRY_FLAG_ALL; | |
1019 entry->max = 0; | |
21266
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
1020 |
15818 | 1021 entry->histlength = 0; |
1022 entry->history = NULL; | |
1023 | |
1024 entry->word = TRUE; | |
1025 entry->always = FALSE; | |
1026 entry->suggests = NULL; | |
21266
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
1027 entry->killring = new_killring(); |
30077
69decc147e5b
history-search action for text-entries.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28984
diff
changeset
|
1028 entry->search = g_new0(GntEntrySearch, 1); |
15818 | 1029 |
1030 GNT_WIDGET_SET_FLAGS(GNT_WIDGET(entry), | |
1031 GNT_WIDGET_NO_BORDER | GNT_WIDGET_NO_SHADOW | GNT_WIDGET_CAN_TAKE_FOCUS); | |
1032 GNT_WIDGET_SET_FLAGS(GNT_WIDGET(entry), GNT_WIDGET_GROW_X); | |
1033 | |
1034 widget->priv.minw = 3; | |
1035 widget->priv.minh = 1; | |
21266
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
1036 |
15818 | 1037 GNTDEBUG; |
1038 } | |
1039 | |
1040 /****************************************************************************** | |
1041 * GntEntry API | |
1042 *****************************************************************************/ | |
1043 GType | |
1044 gnt_entry_get_gtype(void) | |
1045 { | |
1046 static GType type = 0; | |
1047 | |
1048 if(type == 0) | |
1049 { | |
1050 static const GTypeInfo info = { | |
1051 sizeof(GntEntryClass), | |
1052 NULL, /* base_init */ | |
1053 NULL, /* base_finalize */ | |
1054 (GClassInitFunc)gnt_entry_class_init, | |
1055 NULL, /* class_finalize */ | |
1056 NULL, /* class_data */ | |
1057 sizeof(GntEntry), | |
1058 0, /* n_preallocs */ | |
1059 gnt_entry_init, /* instance_init */ | |
1060 NULL /* value_table */ | |
1061 }; | |
1062 | |
1063 type = g_type_register_static(GNT_TYPE_WIDGET, | |
1064 "GntEntry", | |
1065 &info, 0); | |
1066 } | |
1067 | |
1068 return type; | |
1069 } | |
1070 | |
1071 GntWidget *gnt_entry_new(const char *text) | |
1072 { | |
1073 GntWidget *widget = g_object_new(GNT_TYPE_ENTRY, NULL); | |
1074 GntEntry *entry = GNT_ENTRY(widget); | |
1075 | |
1076 gnt_entry_set_text_internal(entry, text); | |
1077 | |
1078 return widget; | |
1079 } | |
1080 | |
1081 static void | |
1082 gnt_entry_set_text_internal(GntEntry *entry, const char *text) | |
1083 { | |
1084 int len; | |
1085 int scroll, cursor; | |
1086 | |
1087 g_free(entry->start); | |
1088 | |
1089 if (text && text[0]) | |
1090 { | |
1091 len = strlen(text); | |
1092 } | |
1093 else | |
1094 { | |
1095 len = 0; | |
1096 } | |
1097 | |
1098 entry->buffer = len + 128; | |
1099 | |
1100 scroll = entry->scroll - entry->start; | |
1101 cursor = entry->end - entry->cursor; | |
1102 | |
1103 entry->start = g_new0(char, entry->buffer); | |
1104 if (text) | |
1105 snprintf(entry->start, len + 1, "%s", text); | |
1106 entry->end = entry->start + len; | |
1107 | |
28827
f36c4a76a7ac
Fix a couple of invalid reads after clearing the text in an entry box.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28704
diff
changeset
|
1108 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:
28704
diff
changeset
|
1109 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:
28704
diff
changeset
|
1110 |
f36c4a76a7ac
Fix a couple of invalid reads after clearing the text in an entry box.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
28704
diff
changeset
|
1111 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:
28704
diff
changeset
|
1112 entry->cursor = entry->end; |
15818 | 1113 |
1114 if (GNT_WIDGET_IS_FLAG_SET(GNT_WIDGET(entry), GNT_WIDGET_MAPPED)) | |
1115 entry_redraw(GNT_WIDGET(entry)); | |
1116 } | |
1117 | |
1118 void gnt_entry_set_text(GntEntry *entry, const char *text) | |
1119 { | |
1120 gboolean changed = TRUE; | |
1121 if (text == NULL && entry->start == NULL) | |
1122 changed = FALSE; | |
1123 if (text && entry->start && g_utf8_collate(text, entry->start) == 0) | |
1124 changed = FALSE; | |
1125 gnt_entry_set_text_internal(entry, text); | |
1126 if (changed) | |
1127 entry_text_changed(entry); | |
1128 } | |
1129 | |
1130 void gnt_entry_set_max(GntEntry *entry, int max) | |
1131 { | |
1132 entry->max = max; | |
1133 } | |
1134 | |
1135 void gnt_entry_set_flag(GntEntry *entry, GntEntryFlag flag) | |
1136 { | |
1137 entry->flag = flag; | |
1138 /* XXX: Check the existing string to make sure the flags are respected? */ | |
1139 } | |
1140 | |
1141 const char *gnt_entry_get_text(GntEntry *entry) | |
1142 { | |
1143 return entry->start; | |
1144 } | |
1145 | |
1146 void gnt_entry_clear(GntEntry *entry) | |
1147 { | |
1148 gnt_entry_set_text_internal(entry, NULL); | |
1149 entry->scroll = entry->cursor = entry->end = entry->start; | |
1150 entry_redraw(GNT_WIDGET(entry)); | |
1151 destroy_suggest(entry); | |
1152 entry_text_changed(entry); | |
1153 } | |
1154 | |
1155 void gnt_entry_set_masked(GntEntry *entry, gboolean set) | |
1156 { | |
1157 entry->masked = set; | |
1158 } | |
1159 | |
1160 void gnt_entry_add_to_history(GntEntry *entry, const char *text) | |
1161 { | |
1162 g_return_if_fail(entry->history != NULL); /* Need to set_history_length first */ | |
1163 | |
1164 if (g_list_length(entry->history) >= entry->histlength) | |
1165 return; | |
1166 | |
1167 entry->history = g_list_first(entry->history); | |
1168 g_free(entry->history->data); | |
1169 entry->history->data = g_strdup(text); | |
1170 entry->history = g_list_prepend(entry->history, NULL); | |
1171 } | |
1172 | |
1173 void gnt_entry_set_history_length(GntEntry *entry, int num) | |
1174 { | |
1175 if (num == 0) | |
1176 { | |
1177 entry->histlength = num; | |
1178 if (entry->history) | |
1179 { | |
1180 entry->history = g_list_first(entry->history); | |
1181 g_list_foreach(entry->history, (GFunc)g_free, NULL); | |
1182 g_list_free(entry->history); | |
1183 entry->history = NULL; | |
1184 } | |
1185 return; | |
1186 } | |
1187 | |
1188 if (entry->histlength == 0) | |
1189 { | |
1190 entry->histlength = num; | |
1191 entry->history = g_list_append(NULL, NULL); | |
1192 return; | |
1193 } | |
1194 | |
1195 if (num > 0 && num < entry->histlength) | |
1196 { | |
1197 GList *first, *iter; | |
1198 int index = 0; | |
1199 for (first = entry->history, index = 0; first->prev; first = first->prev, index++); | |
1200 while ((iter = g_list_nth(first, num)) != NULL) | |
1201 { | |
1202 g_free(iter->data); | |
1203 first = g_list_delete_link(first, iter); | |
1204 } | |
1205 entry->histlength = num; | |
1206 if (index >= num) | |
1207 entry->history = g_list_last(first); | |
1208 return; | |
1209 } | |
1210 | |
1211 entry->histlength = num; | |
1212 } | |
1213 | |
1214 void gnt_entry_set_word_suggest(GntEntry *entry, gboolean word) | |
1215 { | |
1216 entry->word = word; | |
1217 } | |
1218 | |
1219 void gnt_entry_set_always_suggest(GntEntry *entry, gboolean always) | |
1220 { | |
1221 entry->always = always; | |
1222 } | |
1223 | |
1224 void gnt_entry_add_suggest(GntEntry *entry, const char *text) | |
1225 { | |
1226 GList *find; | |
1227 | |
1228 if (!text || !*text) | |
1229 return; | |
21266
1f59065c606a
Add 'yank' action in the entry boxes.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21262
diff
changeset
|
1230 |
15818 | 1231 find = g_list_find_custom(entry->suggests, text, (GCompareFunc)g_utf8_collate); |
1232 if (find) | |
1233 return; | |
1234 entry->suggests = g_list_append(entry->suggests, g_strdup(text)); | |
1235 } | |
1236 | |
1237 void gnt_entry_remove_suggest(GntEntry *entry, const char *text) | |
1238 { | |
1239 GList *find = g_list_find_custom(entry->suggests, text, (GCompareFunc)g_utf8_collate); | |
1240 if (find) | |
1241 { | |
1242 g_free(find->data); | |
1243 entry->suggests = g_list_delete_link(entry->suggests, find); | |
1244 } | |
1245 } | |
1246 |