⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fm-desktop.c

📁 台湾人开发的Linux下的文件管理器
💻 C
📖 第 1 页 / 共 2 页
字号:
static void remove_filter( GObject* desktop, gpointer screen ){    gdk_window_remove_filter(        gdk_screen_get_root_window( GDK_SCREEN( screen ) ),        on_rootwin_event, desktop );}static gboolean on_desktop_key_press( GtkWidget* desktop,                                      GdkEventKey* evt,                                      gpointer user_data ){    if( evt->keyval == GDK_F4 )    {        PtkFileBrowser* browser = (PtkFileBrowser*)user_data;        fm_main_window_open_terminal( GTK_WINDOW(desktop),                                      ptk_file_browser_get_cwd( browser ));        return TRUE;    }    return FALSE;}static gboolean on_desktop_expose( GtkWidget* desktop,                                   GdkEventExpose* event,                                   gpointer user_data ){    GtkWidget * align, *browser, *view;    GdkPixmap* pix;    align = gtk_bin_get_child( GTK_BIN( desktop ) );    browser = gtk_bin_get_child( GTK_BIN( align ) );    view = ptk_file_browser_get_folder_view( PTK_FILE_BROWSER(browser) );    pix = ptk_icon_view_get_background( PTK_ICON_VIEW(view) );    if ( pix )    {        gdk_draw_drawable( event->window,                           desktop->style->fg_gc[ GTK_STATE_NORMAL ],                           pix, event->area.x, event->area.y,                           event->area.x, event->area.y,                           event->area.width, event->area.height );    }    return TRUE;}static gboolean on_icon_view_button_press( PtkIconView* view,                                           GdkEventButton* evt,                                           GtkWidget* desktop ){    GtkTreePath * tree_path;    GtkWidget* popup = NULL;    tree_path = ptk_icon_view_get_path_at_pos( view, evt->x, evt->y );    if ( tree_path )    {        /* TODO: Do some special processig on mounted devices. */        gtk_tree_path_free( tree_path );    }    else /* pressed on desktop */    {        if( evt->button == 3 ) /* right button */        {            /* g_debug("no item, btn = %d", evt->button); */            /*            popup = gtk_menu_new();            GtkWidget* tmp = gtk_menu_item_new_with_label("Test");            gtk_menu_shell_append( popup, tmp );            gtk_widget_show_all( popup );            */        }    }    if( popup )    {        g_signal_connect( popup, "selection-done",                          G_CALLBACK(gtk_widget_destroy), NULL );        gtk_menu_popup( GTK_MENU(popup), NULL, NULL, NULL, NULL, evt->button, evt->time );        g_signal_stop_emission_by_name( view, "button-press-event" );        return TRUE;    }    return FALSE;}GtkWidget* fm_desktop_new( GdkScreen* screen ){    GtkWidget * desktop;    PtkFileBrowser *browser;    GtkWidget *view;    GtkScrolledWindow *scroll;    GdkWindow *root;    GtkWidget* alignment;    char* desktop_dir;    GdkRectangle area;    int rpad, bpad;    guint32 val;    desktop = gtk_window_new( GTK_WINDOW_TOPLEVEL );    get_working_area( screen, &area );    gtk_window_move( GTK_WINDOW( desktop ), 0, 0 );    gtk_widget_set_size_request( desktop,                                 gdk_screen_get_width( screen ),                                 gdk_screen_get_height( screen ) );    alignment = gtk_alignment_new( 0.5, 0.5, 1, 1 );    gtk_container_add( GTK_CONTAINER(desktop), alignment );    browser = PTK_FILE_BROWSER(ptk_file_browser_new( alignment, FBVM_ICON_VIEW ));    g_signal_connect( browser, "open-item",                      G_CALLBACK( on_open_item ), desktop );    ptk_file_browser_show_hidden_files( browser,                                        appSettings.showHiddenFiles );    ptk_file_browser_show_thumbnails( browser,                                      appSettings.showThumbnail ? appSettings.maxThumbSize : 0 );    desktop_dir = g_build_filename( g_get_home_dir(), "Desktop", NULL );    /* FIXME: add histroy should be true because    current working directory is stored in history list. */    ptk_file_browser_chdir( browser, desktop_dir, TRUE );    g_free( desktop_dir );    gtk_widget_set_size_request( GTK_WIDGET(browser),                                 area.width, area.height );    rpad = gdk_screen_get_width( screen );    rpad -= ( area.x + area.width );    bpad = gdk_screen_get_height( screen );    bpad -= ( area.y + area.height );    gtk_alignment_set_padding( GTK_ALIGNMENT(alignment),                               area.y, bpad, area.x, rpad );    gtk_container_add( GTK_CONTAINER(alignment), GTK_WIDGET(browser) );    gtk_widget_show_all( alignment );    gtk_widget_realize( desktop );    gdk_window_set_type_hint( desktop->window,                              GDK_WINDOW_TYPE_HINT_DESKTOP );    view = ptk_file_browser_get_folder_view( browser );    g_signal_connect( view, "button-press-event",                      G_CALLBACK( on_icon_view_button_press ), desktop );    scroll = GTK_SCROLLED_WINDOW( gtk_widget_get_parent( view ) );    gtk_scrolled_window_set_policy( scroll,                                    GTK_POLICY_NEVER, GTK_POLICY_NEVER );    gtk_scrolled_window_set_shadow_type( scroll, GTK_SHADOW_NONE );    root = gdk_screen_get_root_window( screen );    gdk_window_set_events( root, gdk_window_get_events( root )                           | GDK_PROPERTY_CHANGE_MASK );    gdk_window_add_filter( root, on_rootwin_event, desktop );    g_signal_connect( desktop, "destroy", remove_filter, screen );    g_signal_connect( desktop, "expose-event",                      on_desktop_expose, NULL );    g_signal_connect( desktop, "key-press-event",                      on_desktop_key_press, browser );    gtk_widget_set_double_buffered( desktop, FALSE );    set_bg_pixmap( screen, PTK_ICON_VIEW(view), &area );    gtk_window_set_skip_pager_hint( GTK_WINDOW(desktop), TRUE );    gtk_window_set_skip_taskbar_hint( GTK_WINDOW(desktop), TRUE );    /* This is borrowed from fbpanel */#define WIN_HINTS_SKIP_FOCUS      (1<<0)    /* skip "alt-tab" */    val = WIN_HINTS_SKIP_FOCUS;    XChangeProperty(GDK_DISPLAY(), GDK_WINDOW_XWINDOW(desktop->window),          XInternAtom(GDK_DISPLAY(), "_WIN_HINTS", False), XA_CARDINAL, 32,          PropModeReplace, (unsigned char *) &val, 1);    gdk_rgb_find_color( gtk_widget_get_colormap( view ),                        &appSettings.desktopText );    gdk_rgb_find_color( gtk_widget_get_colormap( view ),                        &appSettings.desktopBg1 );    gdk_rgb_find_color( gtk_widget_get_colormap( view ),                        &appSettings.desktopBg2 );    gtk_widget_modify_text( view,                            GTK_STATE_NORMAL,                            &appSettings.desktopText );    gtk_widget_modify_base( view,                            GTK_STATE_NORMAL,                            &appSettings.desktopBg1 );    gdk_window_set_background( root, &appSettings.desktopBg1 );    return desktop;}GdkPixmap* set_bg_pixmap( GdkScreen* screen,                    PtkIconView* view,                    GdkRectangle* working_area ){    GdkWindow * root;    GdkPixmap* pix = NULL;    GdkPixbuf* img;    root = gdk_screen_get_root_window( screen );    if ( appSettings.showWallpaper )    {        int screenw, screenh;        int imgw, imgh, x = 0, y = 0;        screenw = gdk_screen_get_width( screen );        screenh = gdk_screen_get_height( screen );        img = gdk_pixbuf_new_from_file_at_scale(                  appSettings.wallpaper,                  screenw, screenh,                  TRUE, NULL );        if ( img )        {            GdkGC * gc;            pix = gdk_pixmap_new( root, screenw, screenh, -1 );            imgw = gdk_pixbuf_get_width( img );            imgh = gdk_pixbuf_get_height( img );            if ( imgw == screenw )            {                /* center vertically */                y = ( screenh - imgh ) / 2;            }            else            {                /* center horizontally */                x = ( screenw - imgw ) / 2;            }            /* FIXME: fill the blank area with bg color.*/            gc = gdk_gc_new( pix );            gdk_gc_set_rgb_fg_color( gc, &appSettings.desktopBg1 );            gdk_gc_set_fill( gc, GDK_SOLID );            /* fill the whole pixmap is not efficient at all!!! */            gdk_draw_rectangle( pix, gc, TRUE,                                0, 0, screenw, screenh );            g_object_unref( G_OBJECT( gc ) );            gdk_draw_pixbuf( pix, NULL, img, 0, 0, x, y,                             imgw, imgh,                             GDK_RGB_DITHER_NONE, 0, 0 );            gdk_pixbuf_unref( img );        }    }    ptk_icon_view_set_background( PTK_ICON_VIEW( view ), pix,                                  working_area->x, working_area->y );    gdk_window_set_back_pixmap( root, pix, FALSE );    if ( pix )        g_object_unref( G_OBJECT( pix ) );    gdk_window_clear( root );    return pix;}void resize_desktops(){    int i;    GdkRectangle area;    GdkDisplay* display = gdk_display_get_default();    GdkScreen* screen;    for ( i = 0; i < n_screens; ++i )    {        GtkWidget *view, *alignment, *browser;        GdkPixmap* pix;        int bpad, rpad;        screen = gdk_display_get_screen( display, i );        get_working_area( screen, &area );        gtk_window_move( GTK_WINDOW( desktops[ i ] ), 0, 0 );        gtk_widget_set_size_request( desktops[ i ],                                     gdk_screen_get_width( screen ),                                     gdk_screen_get_height( screen ) );        alignment = gtk_bin_get_child( GTK_BIN( desktops[ i ] ) );        browser = gtk_bin_get_child( GTK_BIN( alignment ) );        view = ptk_file_browser_get_folder_view( PTK_FILE_BROWSER( browser ) );        gtk_widget_set_size_request( browser,                                     area.width, area.height );        rpad = gdk_screen_get_width( screen );        rpad -= ( area.x + area.width );        bpad = gdk_screen_get_height( screen );        bpad -= ( area.y + area.height );        gtk_alignment_set_padding( GTK_ALIGNMENT(alignment),                                   area.y, bpad, area.x, rpad );        set_bg_pixmap( screen, PTK_ICON_VIEW(view), &area );    }}void fm_desktop_update_wallpaper(){    resize_desktops();}void fm_desktop_update_colors(){    int i;    for ( i = 0; i < n_screens; ++i )    {        GdkScreen* screen;        GtkWidget *view, *alignment, *browser;        screen = gdk_display_get_screen( gdk_display_get_default(), i );        alignment = gtk_bin_get_child( GTK_BIN( desktops[ i ] ) );        browser = gtk_bin_get_child( GTK_BIN( alignment ) );        view = ptk_file_browser_get_folder_view( PTK_FILE_BROWSER( browser ) );        gdk_rgb_find_color( gtk_widget_get_colormap( view ),                            &appSettings.desktopText );        gdk_rgb_find_color( gtk_widget_get_colormap( view ),                            &appSettings.desktopBg1 );        gdk_rgb_find_color( gtk_widget_get_colormap( view ),                            &appSettings.desktopBg2 );        gdk_window_set_background(            gdk_screen_get_root_window( screen ),            &appSettings.desktopBg1 );        gtk_widget_modify_text( view,                                GTK_STATE_NORMAL,                                &appSettings.desktopText );        gtk_widget_modify_base( view,                                GTK_STATE_NORMAL,                                &appSettings.desktopBg1 );    }    if ( appSettings.showWallpaper )        fm_desktop_update_wallpaper();}static PtkFileBrowser* fm_desktop_get_browser( GtkWidget* desktop ){    GtkWidget * align;    align = gtk_bin_get_child( ( GtkBin* ) desktop );    return ( PtkFileBrowser* ) gtk_bin_get_child( ( GtkBin* ) align );}void fm_desktop_update_thumbnails(){    int i;    PtkFileBrowser* browser;    for ( i = 0; i < n_screens; ++i )    {        browser = fm_desktop_get_browser( desktops[ i ] );        ptk_file_browser_show_thumbnails( browser,                                          appSettings.showThumbnail ? appSettings.maxThumbSize : 0 );    }}void fm_desktop_update_view(){    int i;    PtkFileBrowser* browser;    for ( i = 0; i < n_screens; ++i )    {        browser = fm_desktop_get_browser( desktops[ i ] );        ptk_file_browser_update_display( browser );    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -