29 #define G_LOG_DOMAIN "Dialogs.Combi"
39 #include <pango/pango.h>
70 const char *
const sep =
",#";
72 for (
char *token = strtok_r ( switcher_str, sep, &savept ); token != NULL;
73 token = strtok_r ( NULL, sep, &savept ) ) {
92 g_warning (
"Invalid script switcher: %s", token );
98 g_free ( switcher_str );
107 pd->starts = g_malloc0 (
sizeof (
int ) * pd->num_switchers );
108 pd->lengths = g_malloc0 (
sizeof (
int ) * pd->num_switchers );
109 for (
unsigned int i = 0; i < pd->num_switchers; i++ ) {
110 if ( !
mode_init ( pd->switchers[i].mode ) ) {
114 if ( pd->cmd_list_length == 0 ) {
115 pd->cmd_list_length = 0;
116 for (
unsigned int i = 0; i < pd->num_switchers; i++ ) {
118 pd->starts[i] = pd->cmd_list_length;
119 pd->lengths[i] = length;
120 pd->cmd_list_length += length;
129 unsigned int length = 0;
157 if ( input[0][0] ==
'!' ) {
160 char *eob = g_utf8_strchr ( input[0], -1,
' ' );
162 eob = &( input[0][strlen ( input[0] )] );
164 ssize_t bang_len = g_utf8_pointer_to_offset ( input[0], eob ) - 1;
165 if ( bang_len > 0 ) {
166 for (
unsigned i = 0; switcher == -1 && i < pd->
num_switchers; i++ ) {
168 size_t mode_name_len = g_utf8_strlen ( mode_name, -1 );
169 if ( (
size_t) bang_len <= mode_name_len &&
utf8_strncmp ( &input[0][1], mode_name, bang_len ) == 0 ) {
174 if ( switcher >= 0 ) {
175 if ( eob[0] ==
' ' ) {
178 selected_line - pd->
starts[switcher] );
188 if ( selected_line >= pd->
starts[i] &&
208 static char *
combi_mgrv (
const Mode *sw,
unsigned int selected_line,
int *state, GList **attr_list,
int get_entry )
213 if ( selected_line >= pd->
starts[i] && selected_line < ( pd->
starts[i] + pd->
lengths[i] ) ) {
221 if ( selected_line >= pd->
starts[i] && selected_line < ( pd->
starts[i] + pd->
lengths[i] ) ) {
226 retv = g_strdup_printf (
"%s %s", dname, str );
230 if ( attr_list != NULL ) {
234 PangoAttribute *pa = pango_attr_foreground_new (
238 pa->start_index = PANGO_ATTR_INDEX_FROM_TEXT_BEGINNING;
239 pa->end_index = strlen ( dname );
240 *attr_list = g_list_append ( *attr_list, pa );
261 g_assert_not_reached ();
283 if ( input != NULL && input[0] ==
'!' ) {
285 const char *eob = g_utf8_strchr ( input, -1,
' ' );
288 eob = &( input[strlen ( input )] );
290 ssize_t bang_len = g_utf8_pointer_to_offset ( input, eob ) - 1;
291 if ( bang_len > 0 ) {
294 size_t mode_name_len = g_utf8_strlen ( mode_name, -1 );
295 if ( !( (
size_t) bang_len <= mode_name_len &&
utf8_strncmp ( &input[1], mode_name, bang_len ) == 0 ) ) {
300 if ( eob[0] ==
'\0' || eob[1] ==
'\0' ) {
303 return g_strdup ( eob + 1 );
306 return g_strdup ( input );
312 .cfg_name_key =
"display-combi",
322 .private_data = NULL,