📄 preferences.c
字号:
case CONFIG_ITEM_BOOL: /* add check button */ bool_checkbutton = gtk_check_button_new(); gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(bool_checkbutton), p_item->i_value ); /* connect signal to track changes in the button state */ gtk_object_set_data( GTK_OBJECT(bool_checkbutton), "config_option", p_item->psz_name ); gtk_signal_connect( GTK_OBJECT(bool_checkbutton), "toggled", GTK_SIGNAL_FUNC(GtkBoolChanged), (gpointer)config_dialog ); LABEL_AND_WIDGET( p_item->psz_text, bool_checkbutton, p_item->psz_longtext ); break; } } while( p_item->i_type != CONFIG_HINT_END && p_item++ ); vlc_list_release( p_list );#ifndef MODULE_NAME_IS_gnome /* Now let's add the action buttons at the bottom of the page */ dialog_action_area = GTK_DIALOG(config_dialog)->action_area; gtk_container_set_border_width( GTK_CONTAINER(dialog_action_area), 4 ); /* add a new table for the config option */ item_hbox = gtk_hbox_new( FALSE, 0 ); gtk_box_pack_end( GTK_BOX(dialog_action_area), item_hbox, TRUE, FALSE, 0 ); item_hbox = gtk_hbox_new( FALSE, 0 ); gtk_box_pack_end( GTK_BOX(dialog_action_area), item_hbox, TRUE, FALSE, 0 );#endif /* Create the OK button */#ifdef MODULE_NAME_IS_gnome gnome_dialog_append_button( GNOME_DIALOG(config_dialog), GNOME_STOCK_BUTTON_OK ); ok_button = GTK_WIDGET(g_list_last(GNOME_DIALOG(config_dialog)->buttons)->data); gnome_dialog_append_button( GNOME_DIALOG(config_dialog), GNOME_STOCK_BUTTON_APPLY ); apply_button = GTK_WIDGET(g_list_last(GNOME_DIALOG(config_dialog)->buttons)->data); gnome_dialog_append_button_with_pixmap( GNOME_DIALOG(config_dialog), _("Save"), GNOME_STOCK_PIXMAP_SAVE ); save_button = GTK_WIDGET(g_list_last(GNOME_DIALOG(config_dialog)->buttons)->data); gnome_dialog_append_button( GNOME_DIALOG(config_dialog), GNOME_STOCK_BUTTON_CANCEL ); cancel_button = GTK_WIDGET(g_list_last(GNOME_DIALOG(config_dialog)->buttons)->data);#else ok_button = gtk_button_new_with_label( _("OK") ); gtk_box_pack_start( GTK_BOX(dialog_action_area), ok_button, TRUE, TRUE, 0 ); apply_button = gtk_button_new_with_label( _("Apply") ); gtk_box_pack_start( GTK_BOX(dialog_action_area), apply_button, TRUE, TRUE, 0 ); save_button = gtk_button_new_with_label( _("Save") ); gtk_box_pack_start( GTK_BOX(dialog_action_area), save_button, TRUE, TRUE, 0 ); cancel_button = gtk_button_new_with_label( _("Cancel") ); gtk_box_pack_start( GTK_BOX(dialog_action_area), cancel_button, TRUE, TRUE, 0 );#endif gtk_signal_connect( GTK_OBJECT(ok_button), "clicked", GTK_SIGNAL_FUNC(GtkConfigOk), config_dialog ); gtk_widget_set_sensitive( apply_button, FALSE ); gtk_object_set_data( GTK_OBJECT(config_dialog), "apply_button", apply_button ); gtk_signal_connect( GTK_OBJECT(apply_button), "clicked", GTK_SIGNAL_FUNC(GtkConfigApply), config_dialog ); gtk_signal_connect( GTK_OBJECT(save_button), "clicked", GTK_SIGNAL_FUNC(GtkConfigSave), config_dialog ); gtk_signal_connect( GTK_OBJECT(cancel_button), "clicked", GTK_SIGNAL_FUNC(GtkConfigCancel), config_dialog ); /* Ok, job done successfully. Let's keep a reference to the dialog box */ gtk_object_set_data( GTK_OBJECT(p_intf->p_sys->p_window), psz_module_name, config_dialog ); gtk_object_set_data( GTK_OBJECT(config_dialog), "psz_module_name", psz_module_name ); /* we want this ref to be destroyed if the object is destroyed */ gtk_signal_connect( GTK_OBJECT(config_dialog), "destroy", GTK_SIGNAL_FUNC(GtkConfigDialogDestroyed), (gpointer)p_intf ); gtk_widget_show_all( config_dialog );}#undef LABEL_AND_WIDGET#undef TOOLTIP/**************************************************************************** * GtkConfigApply: store the changes to the config inside the modules * configuration structure and clear the hash table. ****************************************************************************/static void GtkConfigApply( GtkButton * button, gpointer user_data ){ intf_thread_t *p_intf; GHashTable *hash_table; GtkWidget *apply_button; hash_table = (GHashTable *)gtk_object_get_data( GTK_OBJECT(user_data), "config_hash_table" ); p_intf = (intf_thread_t *)gtk_object_get_data( GTK_OBJECT(user_data), "p_intf" ); g_hash_table_foreach_remove( hash_table, GtkSaveHashValue, (void*)p_intf ); /* change the highlight status of the Apply button */ apply_button = (GtkWidget *)gtk_object_get_data( GTK_OBJECT(user_data), "apply_button" ); gtk_widget_set_sensitive( apply_button, FALSE );}static void GtkConfigOk( GtkButton * button, gpointer user_data ){ GtkConfigApply( button, user_data ); gtk_widget_destroy( gtk_widget_get_toplevel( GTK_WIDGET (button) ) );}static void GtkConfigCancel( GtkButton * button, gpointer user_data ){ gtk_widget_destroy( gtk_widget_get_toplevel( GTK_WIDGET (button) ) );}static void GtkConfigSave( GtkButton * button, gpointer user_data ){ intf_thread_t *p_intf; p_intf = (intf_thread_t *)gtk_object_get_data( GTK_OBJECT(user_data), "p_intf" ); GtkConfigApply( button, user_data ); config_SaveConfigFile( p_intf, NULL );}/**************************************************************************** * GtkModuleHighlighted: display module description when an entry is selected * in the clist, and activate the configure button if necessary. ****************************************************************************/static void GtkModuleHighlighted( GtkCList *module_clist, int row, int column, GdkEventButton *event, gpointer user_data ){ intf_thread_t *p_intf; GtkWidget *config_button; module_t *p_parser; vlc_list_t *p_list; char *psz_name; int i_index; p_intf = (intf_thread_t *)gtk_object_get_data( GTK_OBJECT(module_clist), "p_intf" ); if( !gtk_clist_get_text( GTK_CLIST(module_clist), row, 0, &psz_name ) ) { return; } /* look for module 'psz_name' */ p_list = vlc_list_find( p_intf, VLC_OBJECT_MODULE, FIND_ANYWHERE ); for( i_index = 0; i_index < p_list->i_count; i_index++ ) { p_parser = (module_t *)p_list->p_values[i_index].p_object ; if( !strcmp( p_parser->psz_object_name, psz_name ) ) { gtk_object_set_data( GTK_OBJECT(module_clist), "module_highlighted", p_parser ); config_button = gtk_object_get_data( GTK_OBJECT(module_clist), "config_button" ); if( p_parser->i_config_items ) gtk_widget_set_sensitive( config_button, TRUE ); else gtk_widget_set_sensitive( config_button, FALSE ); break; } } vlc_list_release( p_list );}/**************************************************************************** * GtkModuleConfigure: display module configuration dialog box. ****************************************************************************/static void GtkModuleConfigure( GtkButton *button, gpointer user_data ){ module_t *p_module; intf_thread_t *p_intf; p_module = (module_t *)gtk_object_get_data( GTK_OBJECT(user_data), "module_highlighted" ); if( !p_module ) return; p_intf = (intf_thread_t *)gtk_object_get_data( GTK_OBJECT(button), "p_intf" ); GtkCreateConfigDialog( p_module->psz_object_name, (gpointer)p_intf );}/**************************************************************************** * GtkModuleSelected: select module. ****************************************************************************/static void GtkModuleSelected( GtkButton *button, gpointer user_data ){ module_t *p_module; GtkWidget *widget; p_module = (module_t *)gtk_object_get_data( GTK_OBJECT(user_data), "module_highlighted" ); widget = (GtkWidget *)gtk_object_get_data( GTK_OBJECT(user_data), "module_entry" ); if( !p_module ) return; gtk_entry_set_text( GTK_ENTRY(widget), p_module->psz_object_name );}/**************************************************************************** * GtkStringChanged: signal called when the user changes a string value. ****************************************************************************/static void GtkStringChanged( GtkEditable *editable, gpointer user_data ){ intf_thread_t *p_intf; module_config_t *p_config; GHashTable *hash_table; GtkWidget *apply_button; p_intf = (intf_thread_t *)gtk_object_get_data( GTK_OBJECT(editable), "p_intf" ); hash_table = (GHashTable *)gtk_object_get_data( GTK_OBJECT(user_data), "config_hash_table" ); /* free old p_config */ p_config = (module_config_t *)g_hash_table_lookup( hash_table, (gpointer)editable ); if( p_config ) GtkFreeHashValue( NULL, (gpointer)p_config, (void *)p_intf ); p_config = malloc( sizeof(module_config_t) ); p_config->i_type = CONFIG_ITEM_STRING; p_config->psz_value = gtk_editable_get_chars( editable, 0, -1 ); p_config->psz_name = (char *)gtk_object_get_data( GTK_OBJECT(editable), "config_option" ); g_hash_table_insert( hash_table, (gpointer)editable, (gpointer)p_config ); /* change the highlight status of the Apply button */ apply_button = (GtkWidget *)gtk_object_get_data( GTK_OBJECT(user_data),
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -