📄 callbacks.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 + -