summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/NV-CONTROL-API.txt4
-rw-r--r--src/gtk+-2.x/ctkdisplayconfig.c1
-rw-r--r--src/gtk+-2.x/ctkgvo.c25
-rw-r--r--src/gtk+-2.x/ctkwindow.c5
-rw-r--r--src/libXNVCtrl/nv_control.h24
-rw-r--r--src/parse.c12
-rw-r--r--src/parse.h10
-rw-r--r--src/query-assign.c44
8 files changed, 99 insertions, 26 deletions
diff --git a/doc/NV-CONTROL-API.txt b/doc/NV-CONTROL-API.txt
index f8f43af..79f76b4 100644
--- a/doc/NV-CONTROL-API.txt
+++ b/doc/NV-CONTROL-API.txt
@@ -380,6 +380,6 @@
8. NV-CONTROL EXTENSION HISTORY
- 1.0 - 1.5 NVIDIA Internal development versions
- 1.6 Initial public version
+ Please see the NV-CONTROL Protocol Version History comment at the
+ top of nv_control.h.
diff --git a/src/gtk+-2.x/ctkdisplayconfig.c b/src/gtk+-2.x/ctkdisplayconfig.c
index 3409bea..744de7d 100644
--- a/src/gtk+-2.x/ctkdisplayconfig.c
+++ b/src/gtk+-2.x/ctkdisplayconfig.c
@@ -2439,6 +2439,7 @@ static void setup_display_resolution_dropdown(CtkDisplayConfig *ctk_object)
gtk_option_menu_set_history
(GTK_OPTION_MENU(ctk_object->mnu_display_resolution), cur_idx);
+ ctk_object->last_resolution_idx = cur_idx;
/* If dropdown has only one item, disable menu selection */
if (ctk_object->resolution_table_len > 1) {
diff --git a/src/gtk+-2.x/ctkgvo.c b/src/gtk+-2.x/ctkgvo.c
index 64910e3..8e31f40 100644
--- a/src/gtk+-2.x/ctkgvo.c
+++ b/src/gtk+-2.x/ctkgvo.c
@@ -1455,17 +1455,24 @@ static void clone_mode_button_ui_toggled(GtkWidget *button, gpointer user_data)
if (enabled) val = NV_CTRL_GVO_DISPLAY_X_SCREEN_ENABLE;
else val = NV_CTRL_GVO_DISPLAY_X_SCREEN_DISABLE;
- NvCtrlSetAttribute(ctk_gvo->handle, NV_CTRL_GVO_DISPLAY_X_SCREEN, val);
- /*
- * XXX NV_CTRL_GVO_DISPLAY_X_SCREEN can silently fail if GLX
- * locked GVO output for use by pbuffer(s). Check that the
- * setting actually stuck.
- */
+ ret = NvCtrlSetDisplayAttributeWithReply(ctk_gvo->handle,
+ 0, /* display_mask */
+ NV_CTRL_GVO_DISPLAY_X_SCREEN,
+ val);
- ret = NvCtrlGetAttribute(ctk_gvo->handle,
- NV_CTRL_GVO_LOCK_OWNER,
- &ctk_gvo->lock_owner);
+ if (ret == NvCtrlSuccess) {
+
+ /*
+ * XXX NV_CTRL_GVO_DISPLAY_X_SCREEN can silently fail if GLX
+ * locked GVO output for use by pbuffer(s). Check that the
+ * setting actually stuck.
+ */
+
+ ret = NvCtrlGetAttribute(ctk_gvo->handle,
+ NV_CTRL_GVO_LOCK_OWNER,
+ &ctk_gvo->lock_owner);
+ }
if ((ret != NvCtrlSuccess) ||
(enabled &&
diff --git a/src/gtk+-2.x/ctkwindow.c b/src/gtk+-2.x/ctkwindow.c
index 1043b79..29addf0 100644
--- a/src/gtk+-2.x/ctkwindow.c
+++ b/src/gtk+-2.x/ctkwindow.c
@@ -398,6 +398,7 @@ GtkWidget *ctk_window_new(ParsedAttribute *p, ConfigProperties *conf,
CtkConfig *ctk_config;
gint column_offset, i;
+ gboolean slimm_page_added; /* XXX Kludge to only show one SLIMM page */
/* create the new object */
@@ -597,6 +598,7 @@ GtkWidget *ctk_window_new(ParsedAttribute *p, ConfigProperties *conf,
/* add the per-screen entries into the tree model */
+ slimm_page_added = FALSE;
for (i = 0; i < h->targets[X_SCREEN_TARGET].n; i++) {
gchar *screen_name;
@@ -633,11 +635,12 @@ GtkWidget *ctk_window_new(ParsedAttribute *p, ConfigProperties *conf,
CTK_WINDOW_CONFIG_FILE_ATTRIBUTES_FUNC_COLUMN,
NULL, -1);
- if (h->targets[VCS_TARGET].n) {
+ if (h->targets[VCS_TARGET].n && !slimm_page_added) {
/* SLI Mosaic Mode information */
child = ctk_slimm_new(screen_handle, ctk_event, ctk_config);
if (child) {
+ slimm_page_added = TRUE;
help = ctk_slimm_create_help(tag_table, "SLI Mosaic Mode Settings");
add_page(child, help, ctk_window, &iter, NULL,
"SLI Mosaic Mode Settings", NULL, NULL, NULL);
diff --git a/src/libXNVCtrl/nv_control.h b/src/libXNVCtrl/nv_control.h
index b424724..795823f 100644
--- a/src/libXNVCtrl/nv_control.h
+++ b/src/libXNVCtrl/nv_control.h
@@ -19,6 +19,28 @@
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
+ *
+ *
+ * NV-CONTROL Protocol Version History
+ *
+ * 1.0 - 1.5 NVIDIA Internal development versions
+ * 1.6 Initial public version
+ * 1.7 Added QueryBinaryData request
+ * 1.8 Added TargetTypes
+ * 1.9 Added QueryTargetCount request
+ * 1.10 Fixed target type/id byte ordering for compatibility with
+ * pre-1.8 NV-CONTROL clients
+ * 1.11 NVIDIA Internal development version
+ * 1.12 Added StringOperation request
+ * 1.13 NVIDIA Internal development version
+ * 1.14 Fixed an NV_CTRL_BINARY_DATA_MODELINES double scan modeline
+ * reporting bug (vsyncstart, vsyncend, and vtotal were incorrectly
+ * doubled)
+ * 1.15 Added AVAILABILITY_TARGET_ATTRIBUTE_CHANGED_EVENT
+ * 1.16 Added TARGET_STRING_ATTRIBUTE_CHANGED_EVENT
+ * 1.17 Added TARGET_BINARY_ATTRIBUTE_CHANGED_EVENT
+ * 1.18 Updated QueryTargetCount to return a count of 0, rather than
+ * BadMatch, if an unknown TargetType is specified
*/
#ifndef __NVCONTROL_H
@@ -29,7 +51,7 @@
#define NV_CONTROL_NAME "NV-CONTROL"
#define NV_CONTROL_MAJOR 1
-#define NV_CONTROL_MINOR 17
+#define NV_CONTROL_MINOR 18
#define X_nvCtrlQueryExtension 0
#define X_nvCtrlIsNv 1
diff --git a/src/parse.c b/src/parse.c
index 5a4476e..1fb3cb6 100644
--- a/src/parse.c
+++ b/src/parse.c
@@ -307,28 +307,32 @@ TargetTypeEntry targetTypeTable[] = {
X_SCREEN_TARGET, /* target_index */
NV_CTRL_TARGET_TYPE_X_SCREEN, /* nvctrl */
ATTRIBUTE_TYPE_X_SCREEN, /* permission_bit */
- NV_TRUE }, /* uses_display_devices */
+ NV_TRUE, /* uses_display_devices */
+ 1, 6 }, /* required major,minor protocol rev */
{ "GPU", /* name */
"gpu", /* parsed_name */
GPU_TARGET, /* target_index */
NV_CTRL_TARGET_TYPE_GPU, /* nvctrl */
ATTRIBUTE_TYPE_GPU, /* permission_bit */
- NV_TRUE }, /* uses_display_devices */
+ NV_TRUE, /* uses_display_devices */
+ 1, 10 }, /* required major,minor protocol rev */
{ "Frame Lock Device", /* name */
"framelock", /* parsed_name */
FRAMELOCK_TARGET, /* target_index */
NV_CTRL_TARGET_TYPE_FRAMELOCK, /* nvctrl */
ATTRIBUTE_TYPE_FRAMELOCK, /* permission_bit */
- NV_FALSE }, /* uses_display_devices */
+ NV_FALSE, /* uses_display_devices */
+ 1, 10 }, /* required major,minor protocol rev */
{ "VCS", /* name */
"vcs", /* parsed_name */
VCS_TARGET, /* target_index */
NV_CTRL_TARGET_TYPE_VCSC, /* nvctrl */
ATTRIBUTE_TYPE_VCSC, /* permission_bit */
- NV_FALSE }, /* uses_display_devices */
+ NV_FALSE, /* uses_display_devices */
+ 1, 12 }, /* required major,minor protocol rev */
{ NULL, NULL, 0, 0, 0 },
};
diff --git a/src/parse.h b/src/parse.h
index 326531e..0b99541 100644
--- a/src/parse.h
+++ b/src/parse.h
@@ -167,6 +167,16 @@ typedef struct {
/* whether this target type is aware of display devices */
int uses_display_devices;
+ /*
+ * the minimum NV-CONTROL Protocol version required to use this target
+ * type; note that all future target types should be able to use 1.18,
+ * since that version and later allows NV-CONTROL clients to query the
+ * count of TargetTypes not recognized by the X server
+ */
+
+ int major;
+ int minor;
+
} TargetTypeEntry;
diff --git a/src/query-assign.c b/src/query-assign.c
index ad6d36a..87a8878 100644
--- a/src/query-assign.c
+++ b/src/query-assign.c
@@ -154,8 +154,33 @@ CtrlHandles *nv_alloc_ctrl_handles(const char *display)
*/
if (pQueryHandle) {
- status = NvCtrlQueryTargetCount
- (pQueryHandle, targetTypeTable[j].nvctrl, &val);
+
+ /*
+ * check that the NV-CONTROL protocol is new enough to
+ * recognize this target type
+ */
+
+ ReturnStatus ret1, ret2;
+ int major, minor;
+
+ ret1 = NvCtrlGetAttribute(pQueryHandle,
+ NV_CTRL_ATTR_NV_MAJOR_VERSION,
+ &major);
+ ret2 = NvCtrlGetAttribute(pQueryHandle,
+ NV_CTRL_ATTR_NV_MINOR_VERSION,
+ &minor);
+
+ if ((ret1 == NvCtrlSuccess) && (ret2 == NvCtrlSuccess) &&
+ ((major > targetTypeTable[j].major) ||
+ ((major == targetTypeTable[j].major) &&
+ (minor >= targetTypeTable[j].minor)))) {
+
+ status = NvCtrlQueryTargetCount
+ (pQueryHandle, targetTypeTable[j].nvctrl,
+ &val);
+ } else {
+ status = NvCtrlMissingExtension;
+ }
} else {
status = NvCtrlMissingExtension;
}
@@ -839,20 +864,21 @@ static void print_additional_fsaa_info(const char *name,
{
int bit;
-#define MORE_INDENT " "
-
- nv_msg(indent, "\nNames for valid '%s' values:\n", name);
+ nv_msg(indent, "\n");
+ nv_msg(indent, "Note to assign 'FSAA' on the commandline, you may also "
+ "need to assign\n");
+ nv_msg(indent, "'FSAAAppControlled' and 'FSAAAppEnhanced' to 0.\n");
+ nv_msg(indent, "\n");
+ nv_msg(indent, "Valid '%s' Values\n", name);
+ nv_msg(indent, " value - description\n");
for (bit = 0; bit < 32; bit++) {
/* FSAA is not a packed attribute */
if (valid_fsaa_modes & (1 << bit)) {
- nv_msg(MORE_INDENT, "%2u - %s\n",
+ nv_msg(indent, " %2u - %s\n",
bit, NvCtrlGetMultisampleModeName(bit));
}
}
-
-#undef MORE_INDENT
-
}