Exemplo n.º 1
0
static char*
get_cwd( GtkEntry* entry )
{
    const char* path = gtk_entry_get_text( entry );    
    if ( path[0] == '/' )
        return g_path_get_dirname( path );
    else if ( path[0] != '$' && path[0] != '+' && path[0] != '&'
                        && path[0] != '!' && path[0] != '\0' && path[0] != ' ' )
    {
        EntryData* edata = (EntryData*)g_object_get_data(
                                                    G_OBJECT( entry ), "edata" );
        if ( edata && edata->browser )
        {
            char* real_path = vfs_file_resolve_path( ptk_file_browser_get_cwd(
                                    edata->browser ), path );
            char* ret = g_path_get_dirname( real_path );
            g_free( real_path );
            return ret;            
        }
    }
    return NULL;
}
Exemplo n.º 2
0
static gboolean
on_key_press( GtkWidget *entry, GdkEventKey* evt, EntryData* edata )
{    
    int keymod = ( evt->state & ( GDK_SHIFT_MASK | GDK_CONTROL_MASK |
                 GDK_MOD1_MASK | GDK_SUPER_MASK | GDK_HYPER_MASK | GDK_META_MASK ) );
                 
    if( evt->keyval == GDK_KEY_Tab && !keymod )
    {
        gtk_entry_completion_insert_prefix( gtk_entry_get_completion(GTK_ENTRY(entry)) );
        gtk_editable_set_position( (GtkEditable*)entry, -1 );
        return TRUE;
    }
    else if ( ( evt->keyval == GDK_KEY_Up || evt->keyval == GDK_KEY_Down ) && !keymod )
    {
        const char* text = gtk_entry_get_text( GTK_ENTRY( entry ) );
        if ( text[0] != '$' && text[0] != '+' && text[0] != '&' && text[0] != '!' 
                                                            && text[0] != '\0' )
            return FALSE;  // pass non-command arrows to completion
        
        char* line = NULL;
        GList* l;
        if ( evt->keyval == GDK_KEY_Up )
        {
            if ( edata->current )
            {
                if ( text[0] != '\0' && strcmp( edata->current->data, text ) )
                {
                    if ( edata->editing )
                        g_free( edata->editing );
                    edata->editing = g_strdup( text );
                    l = g_list_last( edata->history );
                    line = (char*)l->data;
                    edata->current = l;
                }
                else if ( edata->current->prev )
                {
                    line = (char*)edata->current->prev->data;
                    edata->current = edata->current->prev;
                }
            }
            else if ( edata->history )
            {
                if ( edata->editing && ( text[0] == '\0' || !strcmp( text, "$ " ) ) )
                    line = edata->editing;
                else
                {
                    l = g_list_last( edata->history );
                    line = (char*)l->data;
                    edata->current = l;
                    
                    if ( text[0] != '\0' && strcmp( text, "$ " ) )
                    {
                        if ( edata->editing )
                            g_free( edata->editing );
                        edata->editing = g_strdup( text );
                    }
                }
            }
        }
        else  // GDK_Down
        {
            if ( edata->current && edata->current->next )
            {
                if ( strcmp( edata->current->data, text ) )
                {
                    if ( text[0] != '\0' )
                    {
                        if ( edata->editing )
                            g_free( edata->editing );
                        edata->editing = strdup( text );
                    }
                    line = "$ ";
                    edata->current = NULL;
                }
                else
                {
                    line = (char*)edata->current->next->data;
                    edata->current = edata->current->next;
                }
            }
            else if ( !strcmp( text, "$ " ) || text[0] == '\0' )
            {
                if ( edata->editing && strcmp( text, edata->editing ) )
                    line = edata->editing;
                else
                    line = "$ ";
                edata->current = NULL;
            }
            else
            {
                if ( edata->current && !strcmp( text, edata->current->data ) )
                    line = edata->editing ? edata->editing : "$ ";
                else
                {
                    if ( edata->editing )
                        g_free( edata->editing );
                    edata->editing = strdup( text );
                    line = "$ ";
                }
                edata->current = NULL;
            }
        }
        if ( line )
        {
            gtk_entry_set_text( GTK_ENTRY( entry ), line );
            gtk_editable_set_position( (GtkEditable*)entry, -1 );
        }
        return TRUE;
    }
    else if ( evt->keyval == GDK_KEY_Escape && !keymod )
    {
        const char* text = gtk_entry_get_text( GTK_ENTRY( entry ) );
        if ( text[0] == '$' || text[0] == '+' || text[0] == '&'
                    || text[0] == '!' || text[0] == '\0' || text[0] == ' ' )
        {
            const char* line;
            const char* text = gtk_entry_get_text( GTK_ENTRY( entry ) );
            const char* cwd = ptk_file_browser_get_cwd( edata->browser );
            if ( !strcmp( text, "$ " ) || text[0] == '\0' )
                line = cwd;
            /*
            else if ( !strcmp( text, cwd ) )
            {
                if ( edata->editing && strcmp( text, edata->editing ) )
                    line = edata->editing;
                else
                    line = "$ ";
            }
            */
            else
            {
                if ( edata->editing )
                    g_free( edata->editing );
                edata->editing = strdup( text );
                line = "$ ";
            }
            gtk_entry_set_text( GTK_ENTRY( entry ), line );
            gtk_editable_set_position( (GtkEditable*)entry, -1 );
            edata->current = NULL;
            return TRUE;   
        }
    }
    else if ( evt->keyval == GDK_KEY_BackSpace && keymod == 1 ) // shift
    {
        gtk_entry_set_text( GTK_ENTRY( entry ), "" );
        return TRUE;
    }
    return FALSE;
}