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

📄 callbacks.c

📁 HP PCI热插拔代码GUI HP内部珍贵资料!
💻 C
字号:
/* *    Compaq Hot Plug Controller Graphical User Interface  *    Copyright 2000, 2001 Compaq Computer Corporation *    All rights reserved. * *    This program is free software; you can redistribute it and/or modify *    it under the terms of the GNU General Public License as published by *    the Free Software Foundation; either version 2 of the License, or *    (at your option) any later version. * *    This program is distributed in the hope that it will be useful, *    but WITHOUT ANY WARRANTY; without even the implied warranty of *    MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or *    NON INFRINGEMENT.  See the GNU General Public License for more details. * *    You should have received a copy of the GNU General Public License *    along with this program; if not, write to the Free Software *    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *    Please send all questions or concerns to linuxhotplug@compaq.com */#ifdef HAVE_CONFIG_H#  include <config.h>#endif#include "commonheader.h"#include "callbacks.h"#include "interface.h"#include "refresh_table.h"#include "refresh_tree.h"#include "set_adapter.h"#include "set_attention_status.h"#include "set_driver.h"#include "support.h"#include "tree.h"extern void quit();extern void Popup(char*);void update_selected_row(pci_tree_node* p_node);voidon_exit_activate                       (GtkMenuItem     *menuitem,                                        gpointer         user_data){	quit();}voidon_add_adapter_activate                (GtkMenuItem     *menuitem,                                        gpointer         user_data){	GtkCTreeNode* node = g_node;	pci_tree_node* pci_node = ctree_partner(g_tree, node, slot_based);		if (pci_node->type != 0)  {	// child was selected		node = get_parent(g_node); 		pci_node = ctree_partner(g_tree, node, slot_based);	}	update_selected_row(pci_node);	(*(pci_node->set_adapter))(ADD_ADAPTER, g_tree, node, g_table, g_statusbar, pci_node);}voidon_remove_adapter_activate             (GtkMenuItem     *menuitem,                                        gpointer         user_data){	GtkCTreeNode* node = g_node;	pci_tree_node* pci_node = ctree_partner(g_tree, node, slot_based);		if (pci_node->type != 0)  {	// child was selected		node = get_parent(g_node); 		pci_node = ctree_partner(g_tree, node, slot_based);	}	update_selected_row(pci_node);	(*(pci_node->set_adapter))(REMOVE_ADAPTER, g_tree, node, g_table, g_statusbar, pci_node);	}voidon_insert_driver_activate             (GtkMenuItem     *menuitem,                                       gpointer         user_data){	GtkCTreeNode* node = g_node;	pci_tree_node* pci_node = ctree_partner(g_tree, node, adapter_based);		update_selected_row(pci_node);	(*(pci_node->set_driver))(INSERT_DRIVER, g_tree, node, g_table, g_statusbar, pci_node);	}voidon_remove_driver_activate              (GtkMenuItem     *menuitem,                                        gpointer         user_data){	GtkCTreeNode* node = g_node;	pci_tree_node* pci_node = ctree_partner(g_tree, node, adapter_based);		update_selected_row(pci_node);	(*(pci_node->set_driver))(REMOVE_DRIVER, g_tree, node, g_table, g_statusbar, pci_node);}voidon_enable_attention_status_activate    (GtkMenuItem     *menuitem,                                        gpointer         user_data){	GtkCTreeNode* node = g_node;	pci_tree_node* pci_node = ctree_partner(g_tree, node, slot_based);		if (pci_node->type != 0)  {	// child was selected		node = get_parent(g_node); 		pci_node = ctree_partner(g_tree, node, slot_based);	}	update_selected_row(pci_node);	(*(pci_node->set_attention_status))(ENABLE_ATT_STATUS, g_tree, node, g_table, g_statusbar, pci_node);}voidon_disable_attention_status_activate   (GtkMenuItem     *menuitem,                                        gpointer         user_data){	GtkCTreeNode* node = g_node;	pci_tree_node* pci_node = ctree_partner(g_tree, node, slot_based);		if (pci_node->type != 0)  {	// child was selected		node = get_parent(g_node); 		pci_node = ctree_partner(g_tree, node, slot_based);	}	update_selected_row(pci_node);	(*(pci_node->set_attention_status))(DISABLE_ATT_STATUS, g_tree, node, g_table, g_statusbar, pci_node);}voidon_refresh_activate                    (GtkMenuItem     *menuitem,                                        gpointer         user_data){	refresh_tree(g_tree);		refresh_table(g_table, g_node);}voidon_about_activate                      (GtkMenuItem     *menuitem,                                        gpointer         user_data){	Popup("Compaq PCI Hot Plug for Linux \n\n (C) 2000, 2001\n\n  by Mark Simpson, Dan Zink, and Christoph Schmitz");}void set_adapter_button_status(GtkCTreeNode* node, pci_tree_node* p_node){	if (node) {		GtkCTreeNode* tmp_node = node;		if (p_node->type > 1) {		// at adapter or function node			tmp_node = get_parent(node); 		}		p_node = ctree_partner(g_tree, tmp_node, slot_based);	 				if (p_node->type == 0) {  // slot			public_slot_info* tmp_slot = (public_slot_info*) p_node->node_info;							if (tmp_slot->power == 0) {				gtk_widget_set_sensitive(g_add_adapter_button, TRUE); 				gtk_widget_set_sensitive(g_add_adapter_menu_item, TRUE); 				gtk_widget_set_sensitive(g_remove_adapter_button, FALSE); 				gtk_widget_set_sensitive(g_remove_adapter_menu_item, FALSE); 			}			else {				gtk_widget_set_sensitive(g_add_adapter_button, FALSE); 				gtk_widget_set_sensitive(g_add_adapter_menu_item, FALSE); 				gtk_widget_set_sensitive(g_remove_adapter_button, TRUE); 				gtk_widget_set_sensitive(g_remove_adapter_menu_item, TRUE); 			}						if (tmp_slot->is_hotpluggable == 0) {	// non-hotplug slot				gtk_widget_set_sensitive(g_add_adapter_button, FALSE); 				gtk_widget_set_sensitive(g_add_adapter_menu_item, FALSE); 				gtk_widget_set_sensitive(g_remove_adapter_button, FALSE); 				gtk_widget_set_sensitive(g_remove_adapter_menu_item, FALSE); 			}		}	}	else {  // no tree node selected		gtk_widget_set_sensitive(g_add_adapter_button, FALSE); 		gtk_widget_set_sensitive(g_add_adapter_menu_item, FALSE); 		gtk_widget_set_sensitive(g_remove_adapter_button, FALSE); 		gtk_widget_set_sensitive(g_remove_adapter_menu_item, FALSE); 	}}void set_driver_button_status(GtkCTreeNode* node, pci_tree_node* p_node){	if (node) {		if (p_node->type < 2) {	// at bus/slot node			gtk_widget_set_sensitive(g_insert_driver_button, FALSE); 			gtk_widget_set_sensitive(g_insert_driver_menu_item, FALSE); 			gtk_widget_set_sensitive(g_remove_driver_button, FALSE);			gtk_widget_set_sensitive(g_remove_driver_menu_item, FALSE); 		}		else {			int rt = 0;			public_function_info* tmp_func = NULL;				if (p_node->type > 2) {		// at an adapter node				public_adapter_info* tmp_adapter = (public_adapter_info*) p_node->node_info;					if (tmp_adapter->slot->power == 0) {		// empty slot					gtk_widget_set_sensitive(g_insert_driver_button, FALSE); 					gtk_widget_set_sensitive(g_insert_driver_menu_item, FALSE); 					gtk_widget_set_sensitive(g_remove_driver_button, FALSE);					gtk_widget_set_sensitive(g_remove_driver_menu_item, FALSE); 					return;				}						rt = number_of_children(node);					if (rt >= 2) {  // adapter serving as a bridge or multi-function device					gtk_widget_set_sensitive(g_insert_driver_button, FALSE); 					gtk_widget_set_sensitive(g_insert_driver_menu_item, FALSE); 					gtk_widget_set_sensitive(g_remove_driver_button, FALSE);					gtk_widget_set_sensitive(g_remove_driver_menu_item, FALSE); 					return;				}								if (tmp_adapter->function)  // does function exist?					tmp_func = tmp_adapter->function;				else {					gtk_widget_set_sensitive(g_insert_driver_button, FALSE); 					gtk_widget_set_sensitive(g_insert_driver_menu_item, FALSE); 					gtk_widget_set_sensitive(g_remove_driver_button, FALSE);					gtk_widget_set_sensitive(g_remove_driver_menu_item, FALSE);					return;				}								}						if (!tmp_func)					tmp_func = (public_function_info*) p_node->node_info;				if (tmp_func->is_bridge == 0) {  // not a bridge				if (tmp_func->is_driverloaded == 0) {					gtk_widget_set_sensitive(g_insert_driver_button, TRUE); 					gtk_widget_set_sensitive(g_insert_driver_menu_item, TRUE); 					gtk_widget_set_sensitive(g_remove_driver_button, FALSE);					gtk_widget_set_sensitive(g_remove_driver_menu_item, FALSE); 				}				else {						gtk_widget_set_sensitive(g_insert_driver_button, FALSE);					gtk_widget_set_sensitive(g_insert_driver_menu_item, FALSE); 					gtk_widget_set_sensitive(g_remove_driver_button, TRUE);					gtk_widget_set_sensitive(g_remove_driver_menu_item, TRUE); 				}			}		}	}	else {  // no tree node selected		gtk_widget_set_sensitive(g_insert_driver_button, FALSE); 		gtk_widget_set_sensitive(g_insert_driver_menu_item, FALSE); 		gtk_widget_set_sensitive(g_remove_driver_button, FALSE);		gtk_widget_set_sensitive(g_remove_driver_menu_item, FALSE); 	}}void set_attention_status_button_status(GtkCTreeNode* node, pci_tree_node* p_node){	if (node) {		GtkCTreeNode* tmp_node = node;		if (p_node->type > 1) {		// at adapter or function node			tmp_node = get_parent(node); 		}			p_node = ctree_partner(g_tree, tmp_node, slot_based);	 				if (p_node->type == 0) {  // slot			public_slot_info* tmp_slot = (public_slot_info*) p_node->node_info;				if (tmp_slot->is_hotpluggable) {				if (tmp_slot->attention_status == 0) {					gtk_widget_set_sensitive(g_enable_att_status_button, TRUE); 					gtk_widget_set_sensitive(g_enable_att_status_menu_item, TRUE); 					gtk_widget_set_sensitive(g_disable_att_status_button, FALSE); 					gtk_widget_set_sensitive(g_disable_att_status_menu_item, FALSE); 				}				else {					gtk_widget_set_sensitive(g_enable_att_status_button, FALSE); 					gtk_widget_set_sensitive(g_enable_att_status_menu_item, FALSE); 					gtk_widget_set_sensitive(g_disable_att_status_button, TRUE); 					gtk_widget_set_sensitive(g_disable_att_status_menu_item, TRUE); 				}			}			else {				gtk_widget_set_sensitive(g_enable_att_status_button, FALSE); 				gtk_widget_set_sensitive(g_enable_att_status_menu_item, FALSE); 				gtk_widget_set_sensitive(g_disable_att_status_button, FALSE); 				gtk_widget_set_sensitive(g_disable_att_status_menu_item, FALSE); 			}		}	}	else {  // no tree node selected		gtk_widget_set_sensitive(g_enable_att_status_button, FALSE); 		gtk_widget_set_sensitive(g_enable_att_status_menu_item, FALSE); 		gtk_widget_set_sensitive(g_disable_att_status_button, FALSE); 		gtk_widget_set_sensitive(g_disable_att_status_menu_item, FALSE); 	}}voidtree_row_selected			(GtkCTree	*tree,					 GList		*node,					 gint		column,					 gpointer	user_data){	pci_tree_node *p_node, *tmp_p_node;	g_node = (GtkCTreeNode*) node;		p_node = (pci_tree_node*) gtk_ctree_node_get_row_data(tree, g_node);	tmp_p_node = p_node;	if (p_node->type != 0)  {	// child was selected		GtkCTreeNode* tmp_node = g_node;		if (p_node->type >= 2)			tmp_node = get_parent(g_node); 		tmp_p_node = ctree_partner(g_tree, tmp_node, slot_based);	}	update_selected_row(tmp_p_node);	set_adapter_button_status(g_node, p_node);	set_driver_button_status(g_node, p_node);	set_attention_status_button_status(g_node, p_node);	refresh_table(g_table, g_node);}void update_selected_row(pci_tree_node* p_node){	char msg[MAXLEN];	if (p_node->type == 0) {		public_slot_info* slot = (public_slot_info*) p_node->node_info;		selected_row = slot->slot_number;					if (slot->is_hotpluggable == 0) {			gtk_statusbar_pop(GTK_STATUSBAR(g_statusbar), context_id);			sprintf(msg, "Slot %d is not Hot-Pluggable.", slot->slot_number);			gtk_statusbar_push(GTK_STATUSBAR(g_statusbar), context_id, msg);		}		else {			gtk_statusbar_pop(GTK_STATUSBAR(g_statusbar), context_id);		}	}}voidtable_row_selected 			(GtkWidget         *clist,              				 gint              row,             				 gint              column,             				 GdkEventButton    *event,             				 gpointer          data){	char msg[MAXLEN];        	gtk_statusbar_pop(GTK_STATUSBAR(g_statusbar), context_id);        sprintf(msg, " ");        gtk_statusbar_push(GTK_STATUSBAR(g_statusbar), context_id, msg);}

⌨️ 快捷键说明

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