📄 fm-desktop.c
字号:
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 + -