@@ -32,18 +32,24 @@ static Window create_prompt(void);
32
32
static void draw_prompt (void );
33
33
static void close_prompt ();
34
34
static int keycode (XKeyEvent * );
35
- static void open_prompt (const char * , PromptCallback , void * );
35
+ static void open_prompt (const char * , PromptCallback , PromptCallback ,
36
+ void * , int );
36
37
37
38
static void command_callback (const char * , void * );
38
39
static void rename_callback (const char * , void * );
40
+ static void find_callback (const char * , void * );
41
+ static void find_step_callback (const char * , void * );
39
42
40
43
static Window window ;
41
44
static wchar_t prompt [4096 ];
42
45
static size_t nprompt ;
46
+ static size_t pos ;
47
+ static int _want_centered ;
43
48
44
49
static XIC ic ;
45
50
46
51
static PromptCallback callback ;
52
+ static PromptCallback step_callback ;
47
53
static void * callback_udata ;
48
54
49
55
static void
@@ -69,46 +75,95 @@ rename_callback(const char *s, void *udata)
69
75
rename_client_name (client , s );
70
76
}
71
77
78
+ static void
79
+ find_callback (const char * s , void * udata )
80
+ {
81
+ struct client * client ;
82
+
83
+ client = match_client (s );
84
+ if (client != NULL )
85
+ focus_client (client , client -> stack );
86
+ }
87
+
88
+ static void
89
+ find_step_callback (const char * s , void * udata )
90
+ {
91
+ struct client * client ;
92
+ char * q ;
93
+
94
+ client = match_client (s );
95
+ if (client != NULL ) {
96
+ q = client -> renamed_name ;
97
+ if (q == NULL )
98
+ q = client -> name ;
99
+ nprompt = mbstowcs (prompt , q , sizeof (prompt ));
100
+ prompt [nprompt ] = '\0' ;
101
+ } else if (s == NULL || s [0 ] == '\0' ) {
102
+ nprompt = 0 ;
103
+ prompt [nprompt ] = '\0' ;
104
+ }
105
+ }
106
+
107
+ void
108
+ prompt_find ()
109
+ {
110
+ close_menu ();
111
+ open_prompt ("" , find_callback , find_step_callback , NULL , 1 );
112
+ }
113
+
72
114
void
73
115
prompt_command ()
74
116
{
75
117
close_menu ();
76
- open_prompt ("" , command_callback , NULL );
118
+ open_prompt ("" , command_callback , NULL , NULL , 0 );
77
119
}
78
120
79
121
void
80
122
prompt_rename ()
81
123
{
82
124
if (is_menu_visible ())
83
125
select_menu_item ();
84
- open_prompt (client_name (current_client ()), rename_callback ,
85
- current_client ());
126
+ open_prompt (client_name (current_client ()), rename_callback , NULL ,
127
+ current_client (), 0 );
86
128
}
87
129
88
130
static void
89
- open_prompt (const char * initial , PromptCallback _callback , void * udata )
131
+ open_prompt (const char * initial , PromptCallback _callback ,
132
+ PromptCallback _step_callback , void * udata , int center )
90
133
{
91
134
XEvent e ;
92
135
XIM xim ;
93
136
94
137
callback = _callback ;
95
138
callback_udata = udata ;
96
139
140
+ step_callback = _step_callback ;
141
+
142
+ _want_centered = center ;
143
+
97
144
if (initial != NULL ) {
98
145
nprompt = mbstowcs (prompt , initial , sizeof (prompt ));
99
146
prompt [nprompt ] = '\0' ;
147
+ pos = nprompt ;
100
148
} else {
101
149
nprompt = 0 ;
150
+ pos = 0 ;
102
151
prompt [nprompt ] = '\0' ;
103
152
}
104
153
105
154
if (window == 0 )
106
155
window = create_prompt ();
107
156
108
157
set_font (FONT_TITLE );
109
- XMoveResizeWindow (display (), window , STACK_X (current_stack ()),
110
- STACK_Y (current_stack ()), STACK_WIDTH (current_stack ()),
111
- get_font_height ());
158
+
159
+ if (_want_centered )
160
+ XMoveResizeWindow (display (), window , display_width () / 4 ,
161
+ display_height () / 2 , display_width () / 2 ,
162
+ get_font_height ());
163
+ else
164
+ XMoveResizeWindow (display (), window , STACK_X (current_stack ()),
165
+ STACK_Y (current_stack ()), STACK_WIDTH (current_stack ()),
166
+ get_font_height ());
112
167
XRaiseWindow (display (), window );
113
168
XMapWindow (display (), window );
114
169
draw_prompt ();
@@ -174,8 +229,14 @@ keycode(XKeyEvent *e)
174
229
return 0 ;
175
230
case XK_BackSpace :
176
231
case XK_Delete :
177
- if (nprompt > 0 )
178
- prompt [-- nprompt ] = '\0' ;
232
+ if (nprompt > 0 && pos > 0 ) {
233
+ prompt [-- pos ] = '\0' ;
234
+ nprompt -- ;
235
+ }
236
+ if (step_callback != NULL ) {
237
+ wcstombs (s , prompt , sizeof (s ));
238
+ step_callback (s , callback_udata );
239
+ }
179
240
return 1 ;
180
241
}
181
242
@@ -184,15 +245,22 @@ keycode(XKeyEvent *e)
184
245
n = 0 ;
185
246
return 1 ;
186
247
} else {
187
- if ((ret = mbtowc (& prompt [nprompt ], ch , n )) <= 0 ) {
248
+ if ((ret = mbtowc (& prompt [pos ], ch , n )) <= 0 ) {
188
249
TRACE_LOG ("trouble converting..." );
189
- } else
250
+ } else {
190
251
nprompt ++ ;
252
+ pos ++ ;
253
+ }
191
254
192
255
TRACE_LOG ("mbtowc returns %d %zu\n" , ret , MB_CUR_MAX );
193
256
prompt [nprompt ] = '\0' ;
194
257
}
195
258
259
+ if (step_callback != NULL ) {
260
+ wcstombs (s , prompt , sizeof (s ));
261
+ step_callback (s , callback_udata );
262
+ }
263
+
196
264
return 1 ;
197
265
}
198
266
@@ -225,16 +293,32 @@ static void
225
293
draw_prompt ()
226
294
{
227
295
char s [4096 ];
296
+ char s_until_pos [4096 ];
297
+ wchar_t prompt_until_pos [4096 ];
298
+ char ch [4 + 1 ];
299
+ wchar_t prompt_cursor [2 ];
228
300
XGlyphInfo extents ;
229
301
230
302
XClearWindow (display (), window );
231
303
304
+ memcpy (prompt_until_pos , prompt , sizeof (prompt_until_pos ));
305
+ prompt_until_pos [pos ] = '\0' ;
306
+ wcstombs (s_until_pos , prompt_until_pos , sizeof (s_until_pos ));
232
307
wcstombs (s , prompt , sizeof (s ));
233
308
234
309
TRACE_LOG ("s is: %s" , s );
235
310
236
- font_extents (s , strlen (s ), & extents );
311
+ if (pos < nprompt && nprompt > 0 ) {
312
+ font_extents (s , strlen (s_until_pos ), & extents );
313
+
314
+ prompt_cursor [0 ] = prompt [pos ];
315
+ prompt_cursor [1 ] = '\0' ;
316
+ wcstombs (ch , prompt_cursor , sizeof (ch ));
317
+ draw_font (window , extents .xOff , 0 , COLOR_CURSOR , ch );
318
+ } else {
319
+ font_extents (s , strlen (s ), & extents );
320
+ draw_font (window , extents .xOff , 0 , COLOR_CURSOR , " " );
321
+ }
237
322
238
323
draw_font (window , 0 , 0 , -1 , s );
239
- draw_font (window , extents .xOff , 0 , COLOR_CURSOR , " " );
240
324
}
0 commit comments