static void dithering_depth_menu_changed(GtkOptionMenu *dithering_depth_menu, gpointer user_data) { CtkDitheringControls *ctk_dithering_controls = CTK_DITHERING_CONTROLS(user_data); gint history, dithering_depth = NV_CTRL_DITHERING_DEPTH_AUTO; history = gtk_option_menu_get_history(dithering_depth_menu); dithering_depth = map_dithering_depth_menu_idx_to_nvctrl(history); NvCtrlSetAttribute(ctk_dithering_controls->handle, NV_CTRL_DITHERING_DEPTH, dithering_depth); g_signal_handlers_block_by_func (G_OBJECT(ctk_dithering_controls->dithering_depth_menu), G_CALLBACK(dithering_depth_menu_changed), (gpointer) ctk_dithering_controls); gtk_option_menu_set_history (GTK_OPTION_MENU(ctk_dithering_controls->dithering_depth_menu), dithering_depth); g_signal_handlers_unblock_by_func (G_OBJECT(ctk_dithering_controls->dithering_depth_menu), G_CALLBACK(dithering_depth_menu_changed), (gpointer) ctk_dithering_controls); /* reflecting the change in configuration to other widgets & reset button */ ctk_dithering_controls_setup(ctk_dithering_controls); post_dithering_depth_update(ctk_dithering_controls, dithering_depth); } /* dithering_depth_menu_changed() */
/* * Updates the display device page to reflect the current * configuration of the display device. */ static void display_device_setup(CtkDisplayDevice *ctk_object) { CtrlTarget *ctrl_target = ctk_object->ctrl_target; /* Disable the reset button here and allow the controls below to (re)enable * it if need be,. */ gtk_widget_set_sensitive(ctk_object->reset_button, FALSE); update_display_enabled_flag(ctrl_target, &ctk_object->display_enabled); /* Update info */ update_device_info(ctk_object); ctk_edid_setup(CTK_EDID(ctk_object->edid)); /* Update controls */ ctk_color_controls_setup(CTK_COLOR_CONTROLS(ctk_object->color_controls)); ctk_dithering_controls_setup (CTK_DITHERING_CONTROLS(ctk_object->dithering_controls)); ctk_image_sliders_setup(CTK_IMAGE_SLIDERS(ctk_object->image_sliders)); } /* display_device_setup() */
/* * When dithering configuration is enabled/disabled, * we should update the GUI to reflect the current state & mode. */ static void dithering_update_received(GtkObject *object, gpointer arg1, gpointer user_data) { CtkDitheringControls *ctk_object = CTK_DITHERING_CONTROLS(user_data); CtkEventStruct *event_struct = (CtkEventStruct *) arg1; ctk_dithering_controls_setup(ctk_object); /* update status bar message */ switch (event_struct->attribute) { case NV_CTRL_DITHERING: post_dithering_config_update(ctk_object, event_struct->value); break; case NV_CTRL_DITHERING_MODE: post_dithering_mode_update(ctk_object, event_struct->value); break; case NV_CTRL_DITHERING_DEPTH: post_dithering_depth_update(ctk_object, event_struct->value); break; } } /* dithering_update_received() */
/* * ctk_dithering_controls_reset() - Resets the dithering config (enabled/disabled) * & dithering mode when Reset HW Defaults is clicked */ void ctk_dithering_controls_reset(CtkDitheringControls *ctk_dithering_controls) { if (!ctk_dithering_controls) { return; } NvCtrlSetAttribute(ctk_dithering_controls->handle, NV_CTRL_DITHERING, NV_CTRL_DITHERING_AUTO); NvCtrlSetAttribute(ctk_dithering_controls->handle, NV_CTRL_DITHERING_MODE, NV_CTRL_DITHERING_MODE_AUTO); NvCtrlSetAttribute(ctk_dithering_controls->handle, NV_CTRL_DITHERING_DEPTH, NV_CTRL_DITHERING_DEPTH_AUTO); ctk_dithering_controls_setup(ctk_dithering_controls); } /* ctk_dithering_controls_reset() */
static void dithering_mode_menu_changed(GtkOptionMenu *dithering_mode_menu, gpointer user_data) { CtkDitheringControls *ctk_dithering_controls = CTK_DITHERING_CONTROLS(user_data); gint history, dithering_mode = NV_CTRL_DITHERING_MODE_AUTO; history = gtk_option_menu_get_history(dithering_mode_menu); dithering_mode = ctk_dithering_controls->dithering_mode_table[history]; NvCtrlSetAttribute(ctk_dithering_controls->handle, NV_CTRL_DITHERING_MODE, dithering_mode); dithering_mode = map_nvctrl_value_to_table(ctk_dithering_controls, dithering_mode); g_signal_handlers_block_by_func (G_OBJECT(ctk_dithering_controls->dithering_mode_menu), G_CALLBACK(dithering_mode_menu_changed), (gpointer) ctk_dithering_controls); gtk_option_menu_set_history (GTK_OPTION_MENU(ctk_dithering_controls->dithering_mode_menu), dithering_mode); g_signal_handlers_unblock_by_func (G_OBJECT(ctk_dithering_controls->dithering_mode_menu), G_CALLBACK(dithering_mode_menu_changed), (gpointer) ctk_dithering_controls); /* reflecting the change in mode to other widgets & reset button */ ctk_dithering_controls_setup(ctk_dithering_controls); post_dithering_mode_update(ctk_dithering_controls, dithering_mode); } /* dithering_mode_menu_changed() */
GtkWidget* ctk_dithering_controls_new(NvCtrlAttributeHandle *handle, CtkConfig *ctk_config, CtkEvent *ctk_event, GtkWidget *reset_button, char *name) { GObject *object; CtkDitheringControls *ctk_dithering_controls; GtkWidget *frame, *vbox, *hbox, *label; GtkWidget *menu, *table, *menu_item = NULL, *separator; /* create the object */ object = g_object_new(CTK_TYPE_DITHERING_CONTROLS, NULL); if (!object) { return NULL; } ctk_dithering_controls = CTK_DITHERING_CONTROLS(object); ctk_dithering_controls->handle = handle; ctk_dithering_controls->ctk_config = ctk_config; ctk_dithering_controls->reset_button = reset_button; ctk_dithering_controls->name = strdup(name); /* create main dithering box & frame */ hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(object), hbox, FALSE, FALSE, FRAME_PADDING); ctk_dithering_controls->dithering_controls_box = hbox; frame = gtk_frame_new("Dithering Controls"); gtk_box_pack_start(GTK_BOX(hbox), frame, FALSE, FALSE, 0); table = gtk_table_new(5, 4, FALSE); gtk_container_add(GTK_CONTAINER(frame), table); gtk_table_set_row_spacings(GTK_TABLE(table), 5); gtk_table_set_col_spacings(GTK_TABLE(table), 15); gtk_container_set_border_width(GTK_CONTAINER(table), 5); /* Build Dithering widgets & pack them in table */ /* dropdown list for dithering configuration */ menu = gtk_menu_new(); menu_item = gtk_menu_item_new_with_label("Auto"); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); gtk_widget_show(menu_item); menu_item = gtk_menu_item_new_with_label("Enabled"); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); gtk_widget_show(menu_item); menu_item = gtk_menu_item_new_with_label("Disabled"); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); gtk_widget_show(menu_item); ctk_dithering_controls->dithering_config_menu = gtk_option_menu_new(); gtk_option_menu_set_menu (GTK_OPTION_MENU(ctk_dithering_controls->dithering_config_menu), menu); ctk_config_set_tooltip(ctk_config, ctk_dithering_controls->dithering_config_menu, __dithering_config_help); g_signal_connect(G_OBJECT(ctk_dithering_controls->dithering_config_menu), "changed", G_CALLBACK(dithering_config_menu_changed), (gpointer) ctk_dithering_controls); /* Packing label & dropdown */ hbox = gtk_hbox_new(FALSE, 0); gtk_table_attach(GTK_TABLE(table), hbox, 0, 1, 0, 1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); label = gtk_label_new("Dithering: "); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); hbox = gtk_hbox_new(FALSE, 0); gtk_table_attach(GTK_TABLE(table), hbox, 1, 2, 0, 1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); gtk_box_pack_start(GTK_BOX(hbox), ctk_dithering_controls->dithering_config_menu, FALSE, FALSE, 0); /* Build CurrentDithering widget */ hbox = gtk_hbox_new(FALSE, 0); gtk_table_attach(GTK_TABLE(table), hbox, 2, 3, 0, 1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); label = gtk_label_new("Current Dithering: "); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); hbox = gtk_hbox_new(FALSE, 0); gtk_table_attach(GTK_TABLE(table), hbox, 3, 4, 0, 1, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); label = gtk_label_new(NULL); ctk_dithering_controls->dithering_config_txt = label; gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); /* H-bar 1 */ vbox = gtk_vbox_new(FALSE, 0); separator = gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(vbox), separator, FALSE, FALSE, 0); gtk_table_attach(GTK_TABLE(table), vbox, 0, 4, 1, 2, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); /* dropdown list for dithering modes - populated in setup */ ctk_dithering_controls->dithering_mode_menu = gtk_option_menu_new(); ctk_config_set_tooltip(ctk_config, ctk_dithering_controls->dithering_mode_menu, __dithering_mode_help); g_signal_connect(G_OBJECT(ctk_dithering_controls->dithering_mode_menu), "changed", G_CALLBACK(dithering_mode_menu_changed), (gpointer) ctk_dithering_controls); /* pack the label & drop down */ hbox = gtk_hbox_new(FALSE, 0); gtk_table_attach(GTK_TABLE(table), hbox, 0, 1, 2, 3, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); label = gtk_label_new("Mode: "); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); hbox = gtk_hbox_new(FALSE, 0); ctk_dithering_controls->dithering_mode_box = hbox; gtk_table_attach(GTK_TABLE(table), hbox, 1, 2, 2, 3, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); gtk_box_pack_start(GTK_BOX(hbox), ctk_dithering_controls->dithering_mode_menu, FALSE, FALSE, 0); /* Build CurrentMode widget */ hbox = gtk_hbox_new(FALSE, 0); gtk_table_attach(GTK_TABLE(table), hbox, 2, 3, 2, 3, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); label = gtk_label_new("Current Mode: "); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); hbox = gtk_hbox_new(FALSE, 0); gtk_table_attach(GTK_TABLE(table), hbox, 3, 4, 2, 3, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); label = gtk_label_new(NULL); ctk_dithering_controls->dithering_mode_txt = label; gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); /* H-bar 2 */ vbox = gtk_vbox_new(FALSE, 0); separator = gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(vbox), separator, FALSE, FALSE, 0); gtk_table_attach(GTK_TABLE(table), vbox, 0, 4, 3, 4, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); /* dithering depth */ menu = gtk_menu_new(); menu_item = gtk_menu_item_new_with_label("Auto"); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); gtk_widget_show(menu_item); menu_item = gtk_menu_item_new_with_label("6 bpc"); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); gtk_widget_show(menu_item); menu_item = gtk_menu_item_new_with_label("8 bpc"); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); gtk_widget_show(menu_item); ctk_dithering_controls->dithering_depth_menu = gtk_option_menu_new(); gtk_option_menu_set_menu (GTK_OPTION_MENU(ctk_dithering_controls->dithering_depth_menu), menu); ctk_config_set_tooltip(ctk_config, ctk_dithering_controls->dithering_depth_menu, __dithering_depth_help); g_signal_connect(G_OBJECT(ctk_dithering_controls->dithering_depth_menu), "changed", G_CALLBACK(dithering_depth_menu_changed), (gpointer) ctk_dithering_controls); /* Packing label & dropdown */ hbox = gtk_hbox_new(FALSE, 0); gtk_table_attach(GTK_TABLE(table), hbox, 0, 1, 4, 5, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); label = gtk_label_new("Depth: "); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); hbox = gtk_hbox_new(FALSE, 0); ctk_dithering_controls->dithering_depth_box = hbox; gtk_table_attach(GTK_TABLE(table), hbox, 1, 2, 4, 5, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); gtk_box_pack_start(GTK_BOX(hbox), ctk_dithering_controls->dithering_depth_menu, FALSE, FALSE, 0); /* Build CurrentDitheringDepth widget */ hbox = gtk_hbox_new(FALSE, 0); gtk_table_attach(GTK_TABLE(table), hbox, 2, 3, 4, 5, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); label = gtk_label_new("Current Depth: "); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); hbox = gtk_hbox_new(FALSE, 0); gtk_table_attach(GTK_TABLE(table), hbox, 3, 4, 4, 5, GTK_FILL, GTK_FILL | GTK_EXPAND, 5, 0); label = gtk_label_new(NULL); ctk_dithering_controls->dithering_depth_txt = label; gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); gtk_widget_show_all(GTK_WIDGET(object)); ctk_dithering_controls_setup(ctk_dithering_controls); g_signal_connect(G_OBJECT(ctk_event), CTK_EVENT_NAME(NV_CTRL_DITHERING), G_CALLBACK(dithering_update_received), (gpointer) ctk_dithering_controls); g_signal_connect(G_OBJECT(ctk_event), CTK_EVENT_NAME(NV_CTRL_DITHERING_MODE), G_CALLBACK(dithering_update_received), (gpointer) ctk_dithering_controls); g_signal_connect(G_OBJECT(ctk_event), CTK_EVENT_NAME(NV_CTRL_DITHERING_DEPTH), G_CALLBACK(dithering_update_received), (gpointer) ctk_dithering_controls); g_signal_connect(G_OBJECT(ctk_event), CTK_EVENT_NAME(NV_CTRL_CURRENT_DITHERING), G_CALLBACK(dithering_update_received), (gpointer) ctk_dithering_controls); g_signal_connect(G_OBJECT(ctk_event), CTK_EVENT_NAME(NV_CTRL_CURRENT_DITHERING_MODE), G_CALLBACK(dithering_update_received), (gpointer) ctk_dithering_controls); g_signal_connect(G_OBJECT(ctk_event), CTK_EVENT_NAME(NV_CTRL_CURRENT_DITHERING_DEPTH), G_CALLBACK(dithering_update_received), (gpointer) ctk_dithering_controls); return GTK_WIDGET(object); } /* ctk_dithering_controls_new() */