/* * Rebuilds the list of display devices available for syncing. */ static void xv_sync_to_display_rebuild_buttons(CtkXVideo *ctk_xvideo, gboolean update_status) { ReturnStatus ret; int enabled_display_id; int *pData; int len; int i; GtkWidget *last_button; GtkWidget *button; CtrlTarget *ctrl_target = ctk_xvideo->ctrl_target; /* Remove all buttons */ ctk_empty_container(ctk_xvideo->xv_sync_to_display_button_box); /* Rebuild the list based on the curren configuration */ ret = NvCtrlGetAttribute(ctrl_target, NV_CTRL_XV_SYNC_TO_DISPLAY_ID, &enabled_display_id); if (ret != NvCtrlSuccess) { nv_warning_msg("Failed to query XV Sync display ID on X screen %d.", NvCtrlGetTargetId(ctrl_target)); return; } ret = NvCtrlGetBinaryAttribute(ctrl_target, 0, NV_CTRL_BINARY_DATA_DISPLAYS_ENABLED_ON_XSCREEN, (unsigned char **)(&pData), &len); if (ret != NvCtrlSuccess) { nv_warning_msg("Failed to query list of displays assigned to X screen " " %d.", NvCtrlGetTargetId(ctrl_target)); return; } /* Add a button for No Display Specified */ last_button = NULL; button = xv_sync_to_display_radio_button_add(ctk_xvideo, NULL, NV_CTRL_XV_SYNC_TO_DISPLAY_ID_AUTO); if (button) { /* Track the first button */ if (!last_button) { ctk_xvideo->xv_sync_to_display_buttons = button; } last_button = button; } /* Add a button for each display device */ for (i = 0; i < pData[0]; i++) { int display_id = pData[1+i]; button = xv_sync_to_display_radio_button_add(ctk_xvideo, last_button, display_id); if (!button) { continue; } /* Make sure the enabled display is marked as so */ if (display_id == enabled_display_id) { xv_sync_to_display_set_enabled(ctk_xvideo, button, update_status); } /* Track the first button */ if (!last_button) { ctk_xvideo->xv_sync_to_display_buttons = button; } last_button = button; } gtk_widget_show_all(ctk_xvideo->xv_sync_to_display_button_box); }
static gboolean update_fan_status(CtkVcs *ctk_object) { gint ret; char *fan_entry_str = NULL; char *tokens; GtkWidget *table; GtkWidget *label; FanEntry current_fan; gchar output_str[16]; gint current_row; if (!ctk_object->fan_status_container) { return FALSE; } ret = NvCtrlGetStringAttribute(ctk_object->handle, NV_CTRL_STRING_VCSC_FAN_STATUS, &fan_entry_str); if (ret != NvCtrlSuccess) { return FALSE; } ctk_empty_container(ctk_object->fan_status_container); /* Generate the new table */ table = gtk_table_new(1, 3, FALSE); gtk_table_set_row_spacings(GTK_TABLE(table), 3); gtk_table_set_col_spacings(GTK_TABLE(table), 15); gtk_container_set_border_width(GTK_CONTAINER(table), 5); gtk_box_pack_start(GTK_BOX(ctk_object->fan_status_container), table, FALSE, FALSE, 0); label = gtk_label_new("Fan Number"); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_widget_set_size_request(label, ctk_object->req.width, -1); gtk_table_attach(GTK_TABLE(table), label, 0, 1, 0, 1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); label = gtk_label_new("Fan Speed"); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, 1, 2, 0, 1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); label = gtk_label_new("Fan Status"); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, 2, 3, 0, 1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); /* Parse string of fan entries and populate table */ current_row = 1; for (tokens = strtok(fan_entry_str, ";"); tokens; tokens = strtok(NULL, ";")) { /* Invalidate fan entry */ current_fan.fan_number = -1; current_fan.fan_speed = -1; current_fan.fan_failed = -1; parse_token_value_pairs(tokens, apply_fan_entry_token, ¤t_fan); if ((current_fan.fan_number != -1) && (current_fan.fan_speed != -1) && (current_fan.fan_failed != -1)) { gtk_table_resize(GTK_TABLE(table), current_row + 1, 3); g_snprintf(output_str, 16, "%d", current_fan.fan_number); label = gtk_label_new(output_str); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_widget_set_size_request(label, ctk_object->req.width, -1); gtk_table_attach(GTK_TABLE(table), label, 0, 1, current_row, current_row + 1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); g_snprintf(output_str, 16, "%d rpm", current_fan.fan_speed); label = gtk_label_new(output_str); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, 1, 2, current_row, current_row + 1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); if (!current_fan.fan_failed) { g_snprintf(output_str, 16, "Ok"); } else { g_snprintf(output_str, 16, "Failed"); } label = gtk_label_new(output_str); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_table_attach(GTK_TABLE(table), label, 2, 3, current_row, current_row + 1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); current_row++; } else { nv_warning_msg("Incomplete Fan Entry (fan=%d, speed=%d, failFlag=%d)", current_fan.fan_number, current_fan.fan_speed, current_fan.fan_failed); } } gtk_widget_show_all(table); XFree(fan_entry_str); return TRUE; }