📄 main-window.c
字号:
PTK_RADIO_MENU_ITEM( N_( "Sort by _Owner" ), on_sort_by_owner_activate, 0, 0 ), PTK_SEPARATOR_MENU_ITEM, PTK_RADIO_MENU_ITEM( N_( "Ascending" ), on_sort_ascending_activate, 0, 0 ), PTK_RADIO_MENU_ITEM( N_( "Descending" ), on_sort_descending_activate, 0, 0 ), PTK_MENU_END };static PtkMenuItemEntry fm_side_pane_menu[] = { PTK_CHECK_MENU_ITEM( N_( "_Open Side Pane" ), on_open_side_pane_activate, GDK_F9, 0 ), PTK_SEPARATOR_MENU_ITEM, PTK_RADIO_MENU_ITEM( N_( "Show _Location Pane" ), on_show_loation_pane, 0, 0 ), PTK_RADIO_MENU_ITEM( N_( "Show _Directory Tree" ), on_show_dir_tree, 0, 0 ), PTK_MENU_END };static PtkMenuItemEntry fm_view_menu[] = { PTK_IMG_MENU_ITEM( N_( "_Refresh" ), "gtk-refresh", on_refresh_activate, GDK_F5, 0 ), PTK_POPUP_MENU( N_( "Side _Pane" ), fm_side_pane_menu ), /* PTK_CHECK_MENU_ITEM( N_( "_Full Screen" ), on_fullscreen_activate, GDK_F11, 0 ), */ PTK_SEPARATOR_MENU_ITEM, PTK_CHECK_MENU_ITEM( N_( "Show _Hidden Files" ), on_show_hidden_activate, GDK_H, GDK_CONTROL_MASK ), PTK_POPUP_MENU( N_( "_Sort..." ), fm_sort_menu ), PTK_SEPARATOR_MENU_ITEM, PTK_RADIO_MENU_ITEM( N_( "View as _Icons" ), on_view_as_icon_activate, 0, 0 ), PTK_RADIO_MENU_ITEM( N_( "View as Detailed _List" ), on_view_as_list_activate, 0, 0 ), PTK_MENU_END };static PtkMenuItemEntry fm_tool_menu[] = { PTK_IMG_MENU_ITEM( N_( "Open _Terminal" ), GTK_STOCK_EXECUTE, on_open_terminal_activate, GDK_F4, 0 ), PTK_IMG_MENU_ITEM( N_( "Open Current Folder as _Root" ), GTK_STOCK_DIALOG_AUTHENTICATION, on_open_current_folder_as_root, 0, 0 ), PTK_MENU_END };static PtkMenuItemEntry fm_menu_bar[] = { PTK_POPUP_MENU( N_( "_File" ), fm_file_menu ), PTK_MENU_ITEM( N_( "_Edit" ), NULL, 0, 0 ), /* PTK_POPUP_MENU( N_( "_Edit" ), fm_edit_menu ), */ PTK_POPUP_MENU( N_( "_Go" ), fm_go_menu ), PTK_MENU_ITEM( N_( "_Bookmark" ), NULL, 0, 0 ), PTK_POPUP_MENU( N_( "_View" ), fm_view_menu ), PTK_POPUP_MENU( N_( "_Tool" ), fm_tool_menu ), PTK_POPUP_MENU( N_( "_Help" ), fm_help_menu ), PTK_MENU_END };/* Toolbar items defiinition */static PtkToolItemEntry fm_toolbar_btns[] = { PTK_TOOL_ITEM( N_( "New Tab" ), "gtk-add", N_( "New Tab" ), on_new_tab_activate ), PTK_TOOL_ITEM( N_( "Back" ), "gtk-go-back", N_( "Back" ), on_back_activate ), PTK_TOOL_ITEM( N_( "Forward" ), "gtk-go-forward", N_( "Forward" ), on_forward_activate ), PTK_TOOL_ITEM( N_( "Parent Folder" ), "gtk-go-up", N_( "Parent Folder" ), on_up_activate ), PTK_TOOL_ITEM( N_( "Refresh" ), "gtk-refresh", N_( "Refresh" ), on_refresh_activate ), PTK_TOOL_ITEM( N_( "Home Directory" ), "gtk-home", N_( "Home Directory" ), on_home_activate ), PTK_CHECK_TOOL_ITEM( N_( "Open Side Pane" ), "gtk-open", N_( "Open Side Pane" ), on_side_pane_toggled ), PTK_TOOL_END };static PtkToolItemEntry fm_toolbar_jump_btn[] = { PTK_TOOL_ITEM( NULL, "gtk-jump-to", N_( "Go" ), on_go_btn_clicked ), PTK_TOOL_END };void fm_main_window_init( FMMainWindow* main_window ){ GtkWidget *bookmark_menu; GtkWidget *view_menu_item; GtkWidget *edit_menu_item, *edit_menu; GtkToolItem *toolitem; GtkWidget *hbox; GtkLabel *label; GtkAccelGroup *edit_accel_group; /* Initialize parent class */ GTK_WINDOW( main_window ) ->type = GTK_WINDOW_TOPLEVEL; /* Add to total window count */ ++n_windows; all_windows = g_list_prepend( all_windows, main_window ); /* Set a monitor for changes of the bookmarks */ ptk_bookmarks_add_callback( ( GFunc ) on_bookmarks_change, main_window ); /* Start building GUI */ gtk_window_set_icon_name( GTK_WINDOW( main_window ), "gnome-fs-directory" ); main_window->main_vbox = gtk_vbox_new ( FALSE, 0 ); gtk_container_add ( GTK_CONTAINER ( main_window ), main_window->main_vbox ); main_window->splitter_pos = appSettings.splitterPos; /* Create menu bar */ main_window->menu_bar = gtk_menu_bar_new (); gtk_box_pack_start ( GTK_BOX ( main_window->main_vbox ), main_window->menu_bar, FALSE, FALSE, 0 ); main_window->accel_group = gtk_accel_group_new (); fm_side_pane_menu[ 0 ].ret = ( GtkWidget** ) & main_window->open_side_pane_menu; fm_side_pane_menu[ 2 ].ret = ( GtkWidget** ) & main_window->show_location_menu; fm_side_pane_menu[ 3 ].ret = ( GtkWidget** ) & main_window->show_dir_tree_menu; fm_view_menu[ 3 ].ret = ( GtkWidget** ) & main_window->show_hidden_files_menu; fm_view_menu[ 6 ].ret = ( GtkWidget** ) & main_window->view_as_icon; fm_view_menu[ 7 ].ret = ( GtkWidget** ) & main_window->view_as_list; fm_sort_menu[ 0 ].ret = ( GtkWidget** ) & main_window->sort_by_name; fm_sort_menu[ 1 ].ret = ( GtkWidget** ) & main_window->sort_by_size; fm_sort_menu[ 2 ].ret = ( GtkWidget** ) & main_window->sort_by_mtime; fm_sort_menu[ 3 ].ret = ( GtkWidget** ) & main_window->sort_by_type; fm_sort_menu[ 4 ].ret = ( GtkWidget** ) & main_window->sort_by_perm; fm_sort_menu[ 5 ].ret = ( GtkWidget** ) & main_window->sort_by_owner; fm_sort_menu[ 7 ].ret = ( GtkWidget** ) & main_window->sort_ascending; fm_sort_menu[ 8 ].ret = ( GtkWidget** ) & main_window->sort_descending; fm_menu_bar[ 1 ].ret = &edit_menu_item; fm_menu_bar[ 3 ].ret = &main_window->bookmarks; fm_menu_bar[ 4 ].ret = &view_menu_item; ptk_menu_add_items_from_data( main_window->menu_bar, fm_menu_bar, main_window, main_window->accel_group ); /* This accel_group is useless and just used to show shortcuts in edit menu. These shortcuts are provided by PtkFileBrowser itself. */ edit_accel_group = gtk_accel_group_new(); edit_menu = ptk_menu_new_from_data( fm_edit_menu, main_window, edit_accel_group ); g_object_weak_ref( G_OBJECT(edit_menu), g_object_unref, edit_accel_group); gtk_menu_item_set_submenu( GTK_MENU_ITEM( edit_menu_item ), edit_menu ); bookmark_menu = create_bookmarks_menu( main_window ); gtk_menu_item_set_submenu( GTK_MENU_ITEM( main_window->bookmarks ), bookmark_menu ); g_signal_connect( view_menu_item, "activate", G_CALLBACK( on_view_menu_popup ), main_window ); /* Create toolbar */ main_window->toolbar = gtk_toolbar_new (); gtk_toolbar_set_style ( GTK_TOOLBAR ( main_window->toolbar ), GTK_TOOLBAR_ICONS ); gtk_box_pack_start ( GTK_BOX ( main_window->main_vbox ), main_window->toolbar, FALSE, FALSE, 0 ); main_window->tooltips = gtk_tooltips_new (); fm_toolbar_btns[ 1 ].ret = &main_window->back_btn; fm_toolbar_btns[ 2 ].ret = &main_window->forward_btn; fm_toolbar_btns[ 6 ].ret = ( GtkWidget** ) & main_window->open_side_pane_btn; ptk_toolbar_add_items_from_data( ( main_window->toolbar ), fm_toolbar_btns, main_window, main_window->tooltips ); toolitem = gtk_tool_item_new (); gtk_tool_item_set_expand ( toolitem, TRUE ); gtk_toolbar_insert( GTK_TOOLBAR( main_window->toolbar ), toolitem, -1 ); hbox = gtk_hbox_new ( FALSE, 0 ); gtk_container_add ( GTK_CONTAINER ( toolitem ), hbox ); /* FIXME: Is this label required? What about the hotkey? */ label = ( GtkLabel* ) gtk_label_new_with_mnemonic ( _( "A_ddress:" ) ); gtk_box_pack_start ( GTK_BOX ( hbox ), ( GtkWidget* ) label, FALSE, FALSE, 0 ); gtk_label_set_justify ( label, GTK_JUSTIFY_FILL ); gtk_misc_set_padding ( GTK_MISC ( label ), 6, 0 ); /* gtk_box_pack_start ( GTK_BOX ( hbox ), gtk_separator_tool_item_new(), FALSE, FALSE, 0 ); */ main_window->address_bar = ( GtkEntry* ) ptk_path_entry_new (); g_signal_connect( main_window->address_bar, "activate", on_address_bar_activate, main_window ); gtk_box_pack_start ( GTK_BOX ( hbox ), GTK_WIDGET( main_window->address_bar ), TRUE, TRUE, 0 ); ptk_toolbar_add_items_from_data( ( main_window->toolbar ), fm_toolbar_jump_btn, main_window, main_window->tooltips ); gtk_label_set_mnemonic_widget ( GTK_LABEL ( label ), GTK_WIDGET( main_window->address_bar ) ); gtk_window_add_accel_group ( GTK_WINDOW ( main_window ), main_window->accel_group ); gtk_widget_grab_focus ( GTK_WIDGET( main_window->address_bar ) ); /* Create warning bar for super user */ if ( geteuid() == 0 ) /* Run as super user! */ { main_window->status_bar = gtk_event_box_new(); gtk_widget_modify_bg( main_window->status_bar, GTK_STATE_NORMAL, &main_window->status_bar->style->bg[ GTK_STATE_SELECTED ] ); label = GTK_LABEL( gtk_label_new ( _( "Warning: You are in super user mode" ) ) ); gtk_misc_set_padding( GTK_MISC( label ), 0, 2 ); gtk_widget_modify_fg( GTK_WIDGET( label ), GTK_STATE_NORMAL, >K_WIDGET( label ) ->style->fg[ GTK_STATE_SELECTED ] ); gtk_container_add( GTK_CONTAINER( main_window->status_bar ), GTK_WIDGET( label ) ); gtk_box_pack_start ( GTK_BOX ( main_window->main_vbox ), main_window->status_bar, FALSE, FALSE, 2 ); } /* Create client area */ main_window->notebook = GTK_NOTEBOOK( gtk_notebook_new () ); gtk_notebook_set_scrollable ( GTK_NOTEBOOK( main_window->notebook ), TRUE ); gtk_box_pack_start ( GTK_BOX ( main_window->main_vbox ), GTK_WIDGET( main_window->notebook ), TRUE, TRUE, 0 ); g_signal_connect ( main_window->notebook, "switch_page", G_CALLBACK ( on_folder_notebook_switch_pape ), main_window ); /* Create Status bar */ main_window->status_bar = gtk_statusbar_new (); gtk_box_pack_start ( GTK_BOX ( main_window->main_vbox ), main_window->status_bar, FALSE, FALSE, 0 ); gtk_widget_show_all( main_window->main_vbox ); g_signal_connect ( main_window, "focus-in-event", G_CALLBACK ( on_main_window_focus ), NULL );}void fm_main_window_finalize( GObject *obj ){ all_windows = g_list_remove( all_windows, obj ); --n_windows; /* Remove the monitor for changes of the bookmarks */ ptk_bookmarks_remove_callback( ( GFunc ) on_bookmarks_change, obj ); if ( 0 == n_windows && !appSettings.showDesktop ) gtk_main_quit(); G_OBJECT_CLASS( parent_class ) ->finalize( obj );}void fm_main_window_get_property ( GObject *obj, guint prop_id, GValue *value, GParamSpec *pspec ){}void fm_main_window_set_property ( GObject *obj, guint prop_id, const GValue *value, GParamSpec *pspec ){}static void fm_main_window_close( GtkWidget* main_window ){ appSettings.width = GTK_WIDGET( main_window ) ->allocation.width; appSettings.height = GTK_WIDGET( main_window ) ->allocation.height; appSettings.splitterPos = FM_MAIN_WINDOW( main_window ) ->splitter_pos; gtk_widget_destroy( main_window );}gbooleanfm_main_window_delete_event ( GtkWidget *widget, GdkEvent *event ){ fm_main_window_close( widget ); return TRUE;}static voidon_close_notebook_page( GtkButton* btn, PtkFileBrowser* file_browser ){ GtkNotebook * notebook = GTK_NOTEBOOK( gtk_widget_get_ancestor( GTK_WIDGET( file_browser ), GTK_TYPE_NOTEBOOK ) ); gtk_widget_destroy( GTK_WIDGET( file_browser ) ); if ( gtk_notebook_get_n_pages ( notebook ) == 1 ) gtk_notebook_set_show_tabs( notebook, FALSE );}static GtkWidget* fm_main_window_create_tab_label( FMMainWindow* main_window, PtkFileBrowser* file_browser ){ GtkEventBox * evt_box; GtkWidget* tab_label; GtkWidget* tab_text; GtkWidget* tab_icon; GtkWidget* close_btn; /* Create tab label */ evt_box = GTK_EVENT_BOX( gtk_event_box_new () ); gtk_event_box_set_visible_window ( GTK_EVENT_BOX( evt_box ), FALSE ); tab_label = gtk_hbox_new( FALSE, 0 ); tab_icon = gtk_image_new_from_icon_name ( "gnome-fs-directory", GTK_ICON_SIZE_MENU ); gtk_box_pack_start( GTK_BOX( tab_label ), tab_icon, FALSE, FALSE, 4 ); tab_text = gtk_label_new( "" ); gtk_box_pack_start( GTK_BOX( tab_label ), tab_text, FALSE, FALSE, 4 ); close_btn = gtk_button_new (); gtk_button_set_focus_on_click ( GTK_BUTTON ( close_btn ), FALSE ); gtk_button_set_relief( GTK_BUTTON ( close_btn ), GTK_RELIEF_NONE ); gtk_container_add ( GTK_CONTAINER ( close_btn ), gtk_image_new_from_icon_name( "gtk-close", GTK_ICON_SIZE_MENU ) ); gtk_widget_set_size_request ( close_btn, 20, 20 ); gtk_box_pack_start ( GTK_BOX( tab_label ), close_btn, FALSE, FALSE, 0 ); g_signal_connect( G_OBJECT( close_btn ), "clicked", G_CALLBACK( on_close_notebook_page ), file_browser ); gtk_container_add ( GTK_CONTAINER ( evt_box ), tab_label ); gtk_widget_set_events ( GTK_WIDGET( evt_box ), GDK_ALL_EVENTS_MASK ); gtk_drag_dest_set ( GTK_WIDGET( evt_box ), GTK_DEST_DEFAULT_ALL, drag_targets, sizeof( drag_targets ) / sizeof( GtkTargetEntry ), GDK_ACTION_DEFAULT | GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK ); g_signal_connect ( ( gpointer ) evt_box, "drag-motion", G_CALLBACK ( on_tab_drag_motion ), file_browser ); gtk_widget_show_all( GTK_WIDGET( evt_box ) ); return GTK_WIDGET( evt_box );}void fm_main_window_add_new_tab( FMMainWindow* main_window, const char* folder_path,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -