summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAaron Plattner <aplattner@nvidia.com>2012-12-11 12:39:46 -0800
committerAaron Plattner <aplattner@nvidia.com>2012-12-11 12:39:46 -0800
commit88f50388a0866128d4192196a14267916d1ea68f (patch)
tree95d7eb62636e5143ccdc86aa2fe80c46664b3e29
parente9f8e835f4e9ac4c59383feed05bb055d3405bf4 (diff)
313.09313.09
-rw-r--r--doc/version.mk2
-rw-r--r--samples/version.mk2
-rw-r--r--src/gtk+-2.x/ctkdisplayconfig-utils.c24
-rw-r--r--src/gtk+-2.x/ctkdisplayconfig.c30
-rw-r--r--src/gtk+-2.x/ctkdisplaylayout.c22
-rw-r--r--src/gtk+-2.x/ctkdropdownmenu.c172
-rw-r--r--src/gtk+-2.x/ctkdropdownmenu.h9
-rw-r--r--src/gtk+-2.x/ctkevent.c3
-rw-r--r--src/gtk+-2.x/ctkmultisample.c76
-rw-r--r--src/gtk+-2.x/ctkmultisample.h2
-rw-r--r--src/gtk+-2.x/ctkwindow.c9
-rw-r--r--src/libXNVCtrl/NVCtrl.c43
-rw-r--r--src/libXNVCtrl/NVCtrl.h68
-rw-r--r--src/libXNVCtrl/NVCtrlLib.h59
-rw-r--r--src/libXNVCtrl/nv_control.h17
-rw-r--r--src/parse.c1
-rw-r--r--src/version.mk2
-rw-r--r--version.mk2
18 files changed, 384 insertions, 159 deletions
diff --git a/doc/version.mk b/doc/version.mk
index 6db0208..f91d9f6 100644
--- a/doc/version.mk
+++ b/doc/version.mk
@@ -1 +1 @@
-NVIDIA_VERSION = 310.19
+NVIDIA_VERSION = 313.09
diff --git a/samples/version.mk b/samples/version.mk
index 6db0208..f91d9f6 100644
--- a/samples/version.mk
+++ b/samples/version.mk
@@ -1 +1 @@
-NVIDIA_VERSION = 310.19
+NVIDIA_VERSION = 313.09
diff --git a/src/gtk+-2.x/ctkdisplayconfig-utils.c b/src/gtk+-2.x/ctkdisplayconfig-utils.c
index 78ddf58..b2f1901 100644
--- a/src/gtk+-2.x/ctkdisplayconfig-utils.c
+++ b/src/gtk+-2.x/ctkdisplayconfig-utils.c
@@ -548,13 +548,13 @@ static void apply_mode_attribute_token(char *token, char *value, void *data)
mode->passive_stereo_eye = PASSIVE_STEREO_EYE_RIGHT;
}
- /* ViewPort In */
+ /* ViewPortIn */
} else if (!strcasecmp("viewportin", token)) {
parse_read_integer_pair(value, 'x',
&(mode->viewPortIn[W]),
&(mode->viewPortIn[H]));
- /* ViewPort Out */
+ /* ViewPortOut */
} else if (!strcasecmp("viewportout", token)) {
const char *str;
@@ -668,10 +668,6 @@ nvModePtr mode_parse(nvDisplayPtr display, const char *mode_str)
free(mode_name);
- /* Setup default size and panning of display values */
- mode_set_dims_from_modeline(mode, mode->modeline);
-
-
/* Read mode information */
while (*str) {
@@ -720,6 +716,16 @@ nvModePtr mode_parse(nvDisplayPtr display, const char *mode_str)
if (!str) goto fail;
}
+ /* Initialize defaults for the viewports if unspecified */
+ if ((mode->viewPortOut[W] == 0) || (mode->viewPortOut[H] == 0)) {
+ mode->viewPortOut[W] = mode->modeline->data.hdisplay;
+ mode->viewPortOut[H] = mode->modeline->data.vdisplay;
+ }
+ if ((mode->viewPortIn[W] == 0) || (mode->viewPortIn[H] == 0)) {
+ mode->viewPortIn[W] = mode->viewPortOut[W];
+ mode->viewPortIn[H] = mode->viewPortOut[H];
+ }
+
/* If rotation is specified, swap W/H if they are still set to the
* modeline's unrotated dimentions. Panning should not be rotated
* here since it is returned rotated by the X driver.
@@ -929,13 +935,13 @@ static gchar *mode_get_str(nvModePtr mode, int be_generic)
}
}
- /* ViewPort in */
+ /* ViewPortIn */
{
int width;
int height;
/* Only write out the ViewPortIn if it is specified and differes from
- * the viewport out.
+ * the ViewPortOut.
*/
if ((mode->rotation == ROTATION_90) ||
(mode->rotation == ROTATION_270)) {
@@ -957,7 +963,7 @@ static gchar *mode_get_str(nvModePtr mode, int be_generic)
}
}
- /* ViewPort out */
+ /* ViewPortOut */
if (mode->viewPortOut[X] ||
mode->viewPortOut[Y] ||
(mode->viewPortOut[W] && mode->viewPortOut[H] &&
diff --git a/src/gtk+-2.x/ctkdisplayconfig.c b/src/gtk+-2.x/ctkdisplayconfig.c
index 4b5caed..6437e26 100644
--- a/src/gtk+-2.x/ctkdisplayconfig.c
+++ b/src/gtk+-2.x/ctkdisplayconfig.c
@@ -1484,7 +1484,7 @@ GtkWidget* ctk_display_config_new(NvCtrlAttributeHandle *handle,
"activate", G_CALLBACK(display_position_offset_activate),
(gpointer) ctk_object);
- /* Display ViewPort In */
+ /* Display ViewPortIn */
ctk_object->txt_display_viewport_in = gtk_entry_new();
ctk_config_set_tooltip(ctk_config, ctk_object->txt_display_viewport_in,
__dpy_viewport_in_help);
@@ -1495,7 +1495,7 @@ GtkWidget* ctk_display_config_new(NvCtrlAttributeHandle *handle,
G_CALLBACK(txt_focus_out),
(gpointer) ctk_object);
- /* Display ViewPort Out */
+ /* Display ViewPortOut */
ctk_object->txt_display_viewport_out = gtk_entry_new();
ctk_config_set_tooltip(ctk_config, ctk_object->txt_display_viewport_out,
__dpy_viewport_out_help);
@@ -1876,8 +1876,8 @@ GtkWidget* ctk_display_config_new(NvCtrlAttributeHandle *handle,
TRUE, TRUE, 0);
ctk_object->box_display_position = hbox;
- /* Display ViewPort In */
- label = gtk_label_new("ViewPort In:");
+ /* Display ViewPortIn */
+ label = gtk_label_new("ViewPortIn:");
labels = g_slist_append(labels, label);
hbox = gtk_hbox_new(FALSE, 5);
@@ -1888,8 +1888,8 @@ GtkWidget* ctk_display_config_new(NvCtrlAttributeHandle *handle,
TRUE, TRUE, 0);
ctk_object->box_display_viewport_in = hbox;
- /* Display ViewPort Out */
- label = gtk_label_new("ViewPort Out:");
+ /* Display ViewPortOut */
+ label = gtk_label_new("ViewPortOut:");
labels = g_slist_append(labels, label);
hbox = gtk_hbox_new(FALSE, 5);
@@ -2186,9 +2186,9 @@ GtkTextBuffer *ctk_display_config_create_help(GtkTextTagTable *table,
ctk_help_para(b, &i, __dpy_position_relative_help);
ctk_help_heading(b, &i, "Position Offset");
ctk_help_para(b, &i, __dpy_position_offset_help);
- ctk_help_heading(b, &i, "ViewPort In");
+ ctk_help_heading(b, &i, "ViewPortIn");
ctk_help_para(b, &i, __dpy_viewport_in_help);
- ctk_help_heading(b, &i, "ViewPort Out");
+ ctk_help_heading(b, &i, "ViewPortOut");
ctk_help_para(b, &i, __dpy_viewport_out_help);
ctk_help_heading(b, &i, "Panning");
ctk_help_para(b, &i, "%s This is only available when advanced "
@@ -3173,7 +3173,7 @@ static void setup_display_reflection_dropdown(CtkDisplayConfig *ctk_object)
/** setup_display_viewport_in() **************************************
*
- * Sets up the display viewport in text entry to reflect the currently
+ * Sets up the display ViewPortIn text entry to reflect the currently
* selected display device/mode.
*
**/
@@ -3215,7 +3215,7 @@ static void setup_display_viewport_in(CtkDisplayConfig *ctk_object)
/** setup_display_viewport_out() *************************************
*
- * Sets up the display viewport out text entry to reflect the currently
+ * Sets up the display ViewPortOut text entry to reflect the currently
* selected display device/mode.
*
**/
@@ -5820,7 +5820,7 @@ static void display_position_offset_activate(GtkWidget *widget,
/** display_viewport_in_activate() ***********************************
*
- * Called when user modifies the display viewport in text entry.
+ * Called when user modifies the display ViewPortIn text entry.
*
**/
@@ -5839,7 +5839,7 @@ static void display_viewport_in_activate(GtkWidget *widget, gpointer user_data)
str = parse_read_integer_pair(str, 'x', &w, &h);
if (!str) {
- /* Reset the mode's viewport in */
+ /* Reset the mode's ViewPortIn */
setup_display_viewport_in(ctk_object);
return;
}
@@ -5853,7 +5853,7 @@ static void display_viewport_in_activate(GtkWidget *widget, gpointer user_data)
/** display_viewport_out_activate() **********************************
*
- * Called when user modifies the display viewport out text entry.
+ * Called when user modifies the display ViewPortOut text entry.
*
**/
@@ -5872,13 +5872,13 @@ static void display_viewport_out_activate(GtkWidget *widget, gpointer user_data)
str = parse_read_integer_pair(str, 'x', &w, &h);
if (!str) {
- /* Reset the mode's viewport out */
+ /* Reset the mode's ViewPortOut */
setup_display_viewport_out(ctk_object);
return;
}
str = parse_read_integer_pair(str, 0, &x, &y);
if (!str) {
- /* Reset the mode's viewport out */
+ /* Reset the mode's ViewPortOut */
setup_display_viewport_out(ctk_object);
return;
}
diff --git a/src/gtk+-2.x/ctkdisplaylayout.c b/src/gtk+-2.x/ctkdisplaylayout.c
index 1735a0b..2066d99 100644
--- a/src/gtk+-2.x/ctkdisplaylayout.c
+++ b/src/gtk+-2.x/ctkdisplaylayout.c
@@ -2156,7 +2156,7 @@ static int pan_selected(CtkDisplayLayout *ctk_object, int x, int y, int snap)
info->dst_dim[H] = y;
}
- /* Panning domain can never be smaller then the display viewport */
+ /* Panning domain can never be smaller then the display ViewPortIn */
if (info->display) {
dim = info->display->cur_mode->viewPortIn;
if (info->dst_dim[W] < dim[W]) {
@@ -3046,7 +3046,7 @@ static void draw_display(CtkDisplayLayout *ctk_object,
draw_rect(ctk_object, mode->pan, &(ctk_object->fg_color), 0);
- /* Draw viewport */
+ /* Draw ViewPortIn */
color_idx = base_color_idx + ((mode->modeline) ? BG_SCR_ON : BG_SCR_OFF);
draw_rect(ctk_object, mode->viewPortIn, &(ctk_object->color_palettes[color_idx]),
1);
@@ -3733,15 +3733,15 @@ void ctk_display_layout_set_mode_modeline(CtkDisplayLayout *ctk_object,
/*!
- * Sets the ViewPort In for the given mode.
+ * Sets the ViewPortIn for the given mode.
*
* If a modification occurs, this function will call the modified_callback
* handler registered, if any.
*
* \param[in] ctk_object The Display Layout object
* \param[in] mode The mode to be modified
- * \param[in] w The width of the ViewPort In to set
- * \param[in] h The height of the ViewPort In to set
+ * \param[in] w The width of the ViewPortIn to set
+ * \param[in] h The height of the ViewPortIn to set
*/
void ctk_display_layout_set_mode_viewport_in(CtkDisplayLayout *ctk_object,
nvModePtr mode,
@@ -3763,7 +3763,7 @@ void ctk_display_layout_set_mode_viewport_in(CtkDisplayLayout *ctk_object,
mode->viewPortIn[W] = w;
mode->viewPortIn[H] = h;
- /* Clamp the panning domain to the new viewport dimensions */
+ /* Clamp the panning domain to the new ViewPortIn dimensions */
if (mode->pan[W] < mode->viewPortIn[W]) {
mode->pan[W] = mode->viewPortIn[W];
}
@@ -3785,17 +3785,17 @@ void ctk_display_layout_set_mode_viewport_in(CtkDisplayLayout *ctk_object,
/*!
- * Sets the ViewPort Out for the given mode.
+ * Sets the ViewPortOut for the given mode.
*
* If a modification occurs, this function will call the modified_callback
* handler registered, if any.
*
* \param[in] ctk_object The Display Layout object
* \param[in] mode The mode to be modified
- * \param[in] x The X offset of the ViewPort Out to set
- * \param[in] y The Y offset of the ViewPort Out to set
- * \param[in] w The width of the ViewPort Out to set
- * \param[in] h The height of the ViewPort Out to set
+ * \param[in] x The X offset of the ViewPortOut to set
+ * \param[in] y The Y offset of the ViewPortOut to set
+ * \param[in] w The width of the ViewPortOut to set
+ * \param[in] h The height of the ViewPortOut to set
*/
void ctk_display_layout_set_mode_viewport_out(CtkDisplayLayout *ctk_object,
nvModePtr mode,
diff --git a/src/gtk+-2.x/ctkdropdownmenu.c b/src/gtk+-2.x/ctkdropdownmenu.c
index 0593a44..7166be0 100644
--- a/src/gtk+-2.x/ctkdropdownmenu.c
+++ b/src/gtk+-2.x/ctkdropdownmenu.c
@@ -18,6 +18,7 @@
*/
#include <gtk/gtk.h>
+#include <string.h>
#include "ctkdropdownmenu.h"
@@ -86,7 +87,7 @@ ctk_drop_down_menu_class_init(CtkDropDownMenuClass *ctk_drop_down_menu_class)
* changed() - emit the "changed" signal
*/
-static void changed(GtkOptionMenu *option_menu, gpointer user_data)
+static void changed(GtkWidget *menu, gpointer user_data)
{
CtkDropDownMenu *d = CTK_DROP_DOWN_MENU(user_data);
@@ -113,6 +114,47 @@ static void ctk_drop_down_menu_free(GObject *object)
+/*
+ * ctk_drop_down_menu_change_object() - abstract out the actual widget
+ * that is being used, so that users of CtkDropDownMenu don't have to
+ * know if the gtk widget is GtkCombo or GtkOptionMenu or anything else.
+ */
+
+GObject *ctk_drop_down_menu_change_object(GtkWidget* widget)
+{
+ CtkDropDownMenu *d = CTK_DROP_DOWN_MENU(widget);
+
+ if (d->flags & CTK_DROP_DOWN_MENU_FLAG_COMBO) {
+ return G_OBJECT(GTK_EDITABLE(GTK_COMBO(d->menu)->entry));
+ } else {
+ return G_OBJECT(d->option_menu);
+ }
+} /* ctk_drop_down_menu_change_object() */
+
+
+
+/*
+ * ctk_drop_down_menu_changed() - callback function for GtkCombo menu
+ * changed.
+ */
+
+static void ctk_drop_down_menu_changed(GtkEditable *editable, gpointer user_data)
+{
+ int i;
+ CtkDropDownMenu *d = CTK_DROP_DOWN_MENU(user_data);
+ const gchar *str = gtk_entry_get_text(GTK_ENTRY(editable));
+
+ for (i = 0; i < d->num_entries; i++) {
+ if (strcmp(d->values[i].glist_item, str) == 0) {
+ d->current_selected_item = i;
+ break;
+ }
+ }
+ g_signal_emit(G_OBJECT(d), __signals[DROP_DOWN_MENU_CHANGED_SIGNAL], 0);
+}
+
+
+
/*
* ctk_drop_down_menu_new() - constructor for the CtkDropDownMenu widget
*/
@@ -121,6 +163,7 @@ GtkWidget* ctk_drop_down_menu_new(guint flags)
{
GObject *object;
CtkDropDownMenu *d;
+ GtkWidget *menu_widget; // used to emit "changed" signal
object = g_object_new(CTK_TYPE_DROP_DOWN_MENU, NULL);
@@ -129,17 +172,26 @@ GtkWidget* ctk_drop_down_menu_new(guint flags)
d->flags = flags;
d->values = NULL;
d->num_entries = 0;
-
- d->option_menu = gtk_option_menu_new();
- d->menu = gtk_menu_new();
- gtk_option_menu_set_menu(GTK_OPTION_MENU(d->option_menu), d->menu);
+ if (flags & CTK_DROP_DOWN_MENU_FLAG_COMBO) {
+ d->menu = gtk_combo_new();
+ menu_widget = d->menu;
+ g_signal_connect(G_OBJECT(GTK_EDITABLE(GTK_COMBO(d->menu)->entry)),
+ "changed",
+ G_CALLBACK(ctk_drop_down_menu_changed),
+ (gpointer) d);
+ } else {
+ d->option_menu = gtk_option_menu_new();
+ d->menu = gtk_menu_new();
+ gtk_option_menu_set_menu(GTK_OPTION_MENU(d->option_menu), d->menu);
+ menu_widget = d->option_menu;
+ g_signal_connect(G_OBJECT(d->option_menu), "changed",
+ G_CALLBACK(changed), (gpointer) d);
- gtk_box_set_spacing(GTK_BOX(d), 0);
- gtk_box_pack_start(GTK_BOX(d), d->option_menu, FALSE, FALSE, 0);
+ }
- g_signal_connect(G_OBJECT(d->option_menu), "changed",
- G_CALLBACK(changed), (gpointer) d);
+ gtk_box_set_spacing(GTK_BOX(d), 0);
+ gtk_box_pack_start(GTK_BOX(d), menu_widget, FALSE, FALSE, 0);
return GTK_WIDGET(d);
@@ -153,8 +205,14 @@ GtkWidget* ctk_drop_down_menu_new(guint flags)
void ctk_drop_down_menu_reset(CtkDropDownMenu *d)
{
- g_free(d->values);
- d->values = NULL;
+ if (d->glist) {
+ g_free(d->glist);
+ d->glist = NULL;
+ }
+ if (d->values) {
+ g_free(d->values);
+ d->values = NULL;
+ }
d->num_entries = 0;
@@ -175,30 +233,41 @@ GtkWidget *ctk_drop_down_menu_append_item(CtkDropDownMenu *d,
const gchar *name,
const gint value)
{
- GtkWidget *menu_item, *label, *alignment;
- gchar *str;
+ GtkWidget *label = NULL;
- menu_item = gtk_menu_item_new();
- gtk_menu_shell_append(GTK_MENU_SHELL(d->menu), menu_item);
+ d->values = g_realloc(d->values,
+ sizeof(CtkDropDownMenuValue) * (d->num_entries + 1));
- if (d->flags & CTK_DROP_DOWN_MENU_FLAG_MONOSPACE) {
- str = g_strconcat("<tt><small>", name, "</small></tt>", NULL);
- label = gtk_label_new(NULL);
- gtk_label_set_markup(GTK_LABEL(label), str);
- g_free(str);
+ if (d->flags & CTK_DROP_DOWN_MENU_FLAG_COMBO) {
+ d->glist = g_list_append(d->glist,
+ g_strdup(name));
+
+ gtk_combo_set_popdown_strings(GTK_COMBO(d->menu), d->glist);
+ gtk_editable_set_editable(GTK_EDITABLE(GTK_COMBO(d->menu)->entry), FALSE);
+ d->values[d->num_entries].glist_item = g_strdup(name);
} else {
- label = gtk_label_new(name);
+ GtkWidget *menu_item, *alignment;
+ gchar *str;
+
+ menu_item = gtk_menu_item_new();
+ gtk_menu_shell_append(GTK_MENU_SHELL(d->menu), menu_item);
+
+ if (d->flags & CTK_DROP_DOWN_MENU_FLAG_MONOSPACE) {
+ str = g_strconcat("<tt><small>", name, "</small></tt>", NULL);
+ label = gtk_label_new(NULL);
+ gtk_label_set_markup(GTK_LABEL(label), str);
+ g_free(str);
+ } else {
+ label = gtk_label_new(name);
+ }
+ alignment = gtk_alignment_new(0, 0, 0, 0);
+ gtk_container_add(GTK_CONTAINER(alignment), label);
+ gtk_container_add(GTK_CONTAINER(menu_item), alignment);
+ d->values[d->num_entries].menu_item = menu_item;
+
}
-
- alignment = gtk_alignment_new(0, 0, 0, 0);
- gtk_container_add(GTK_CONTAINER(alignment), label);
- gtk_container_add(GTK_CONTAINER(menu_item), alignment);
-
- d->values = g_realloc(d->values,
- sizeof(CtkDropDownMenuValue) * (d->num_entries + 1));
- d->values[d->num_entries].menu_item = menu_item;
+
d->values[d->num_entries].value = value;
-
d->num_entries++;
return label;
@@ -215,15 +284,18 @@ GtkWidget *ctk_drop_down_menu_append_item(CtkDropDownMenu *d,
gint ctk_drop_down_menu_get_current_value(CtkDropDownMenu *d)
{
gint i;
-
- i = gtk_option_menu_get_history(GTK_OPTION_MENU(d->option_menu));
-
- if (i < d->num_entries) {
- return d->values[i].value;
+
+ if (d->flags & CTK_DROP_DOWN_MENU_FLAG_COMBO) {
+ return d->current_selected_item;
} else {
- return 0; /* XXX??? */
+ i = gtk_option_menu_get_history(GTK_OPTION_MENU(d->option_menu));
+
+ if (i < d->num_entries) {
+ return d->values[i].value;
+ }
}
-
+ return 0; /* XXX??? */
+
} /* ctk_drop_down_menu_get_current_value() */
@@ -239,7 +311,13 @@ void ctk_drop_down_menu_set_current_value(CtkDropDownMenu *d, gint value)
for (i = 0; i < d->num_entries; i++) {
if (d->values[i].value == value) {
- gtk_option_menu_set_history(GTK_OPTION_MENU(d->option_menu), i);
+ if (d->flags & CTK_DROP_DOWN_MENU_FLAG_COMBO) {
+ gtk_entry_set_text
+ (GTK_ENTRY(GTK_COMBO(d->menu)->entry),
+ d->values[i].glist_item);
+ } else {
+ gtk_option_menu_set_history(GTK_OPTION_MENU(d->option_menu), i);
+ }
return;
}
}
@@ -255,12 +333,18 @@ void ctk_drop_down_menu_set_current_value(CtkDropDownMenu *d, gint value)
void ctk_drop_down_menu_set_value_sensitive(CtkDropDownMenu *d,
gint value, gboolean sensitive)
{
- gint i;
-
- for (i = 0; i < d->num_entries; i++) {
- if (d->values[i].value == value) {
- gtk_widget_set_sensitive(d->values[i].menu_item, sensitive);
- return;
+
+ if (d->flags & CTK_DROP_DOWN_MENU_FLAG_COMBO) {
+ ctk_drop_down_menu_set_current_value(d, value);
+ gtk_widget_set_sensitive(GTK_WIDGET(GTK_COMBO(d->menu)->entry),
+ sensitive);
+ } else {
+ gint i;
+ for (i = 0; i < d->num_entries; i++) {
+ if (d->values[i].value == value) {
+ gtk_widget_set_sensitive(d->values[i].menu_item, sensitive);
+ return;
+ }
}
}
} /* ctk_drop_down_menu_set_value_sensitive() */
diff --git a/src/gtk+-2.x/ctkdropdownmenu.h b/src/gtk+-2.x/ctkdropdownmenu.h
index 10fb50c..f1d0557 100644
--- a/src/gtk+-2.x/ctkdropdownmenu.h
+++ b/src/gtk+-2.x/ctkdropdownmenu.h
@@ -47,6 +47,7 @@ G_BEGIN_DECLS
#define CTK_DROP_DOWN_MENU_FLAG_MONOSPACE 0x1
+#define CTK_DROP_DOWN_MENU_FLAG_COMBO 0x2
typedef struct _CtkDropDownMenu CtkDropDownMenu;
@@ -57,6 +58,7 @@ typedef struct _CtkDropDownMenuValue CtkDropDownMenuValue;
struct _CtkDropDownMenuValue {
GtkWidget *menu_item;
gint value;
+ gchar *glist_item;
};
@@ -70,6 +72,11 @@ struct _CtkDropDownMenu
guint flags;
gint num_entries;
+ gint current_selected_item;
+
+ GList *glist;
+ // currently selected item in the drop down
+ GtkWidget *current_selected_item_widget;
CtkDropDownMenuValue *values;
};
@@ -91,7 +98,7 @@ void ctk_drop_down_menu_set_value_sensitive (CtkDropDownMenu *d,
gboolean sensitive);
void ctk_drop_down_menu_reset (CtkDropDownMenu *d);
-
+GObject *ctk_drop_down_menu_change_object(GtkWidget* widget);
G_END_DECLS
diff --git a/src/gtk+-2.x/ctkevent.c b/src/gtk+-2.x/ctkevent.c
index 8a7956a..6c77ec4 100644
--- a/src/gtk+-2.x/ctkevent.c
+++ b/src/gtk+-2.x/ctkevent.c
@@ -327,10 +327,11 @@ static void ctk_event_class_init(CtkEventClass *ctk_event_class)
MAKE_SIGNAL(NV_CTRL_FRAMELOCK_INCOMING_HOUSE_SYNC_RATE);
MAKE_SIGNAL(NV_CTRL_FXAA);
MAKE_SIGNAL(NV_CTRL_DISPLAY_RANDR_OUTPUT_ID);
+ MAKE_SIGNAL(NV_CTRL_FRAMELOCK_DISPLAY_CONFIG);
MAKE_SIGNAL(NV_CTRL_TOTAL_DEDICATED_GPU_MEMORY);
MAKE_SIGNAL(NV_CTRL_USED_DEDICATED_GPU_MEMORY);
#undef MAKE_SIGNAL
-
+
/*
* When new integer attributes are added to NVCtrl.h, a
* MAKE_SIGNAL() line should be added above. The below #if should
diff --git a/src/gtk+-2.x/ctkmultisample.c b/src/gtk+-2.x/ctkmultisample.c
index 050240d..be35e9a 100644
--- a/src/gtk+-2.x/ctkmultisample.c
+++ b/src/gtk+-2.x/ctkmultisample.c
@@ -49,7 +49,7 @@ static GtkWidget *create_fsaa_setting_menu(CtkMultisample *ctk_multisample,
static void fsaa_setting_checkbox_toggled(GtkWidget *widget,
gpointer user_data);
-static void fsaa_setting_menu_changed(GtkWidget *widget, gpointer user_data);
+static void fsaa_setting_menu_changed(GtkObject *object, gpointer user_data);
static void fsaa_setting_update_received(GtkObject *object,
gpointer arg1,
@@ -109,6 +109,11 @@ static void update_fxaa_from_fsaa_change(CtkMultisample *ctk_multisample,
int fsaa_value);
static void update_fsaa_from_fxaa_change(CtkMultisample *ctk_multisample,
gboolean fxaa_enabled);
+static gchar *applicationSettings[] = {
+ "Use Application Settings",
+ "Override Application Settings",
+ "Enhance Application Settings"
+};
static const char *__aa_override_app_help =
"Enable the Antialiasing \"Override Application Setting\" "
@@ -138,7 +143,8 @@ static const char *__aniso_slider_help =
static const char *__fxaa_enable_help =
"Enable Fast Approximate Anti-Aliasing. This option is applied to "
"OpenGL applications that are started after this option is set. Enabling "
-"FXAA disables antialiasing and other antialiasing setting methods.";
+"FXAA disables triple buffering, antialiasing, and other antialiasing "
+"setting methods.";
static const char *__texture_sharpening_help =
"To improve image quality, select this option "
@@ -690,30 +696,18 @@ static GtkWidget *create_fsaa_setting_menu(CtkMultisample *ctk_multisample,
CtkEvent *ctk_event,
gboolean override, gboolean enhance)
{
- GtkWidget *omenu;
- GtkWidget *menu;
- GtkWidget *menu_item;
- gint idx;
+ CtkDropDownMenu *d;
- /* Create the menu */
+ gint idx, i;
- omenu = gtk_option_menu_new();
+ /* Create the menu */
- menu = gtk_menu_new();
+ d = (CtkDropDownMenu *)
+ ctk_drop_down_menu_new(CTK_DROP_DOWN_MENU_FLAG_COMBO);
- menu_item = gtk_menu_item_new_with_label("Use Application Settings");
- gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item);
- gtk_widget_show(menu_item);
-
- menu_item = gtk_menu_item_new_with_label("Override Application Settings");
- gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item);
- gtk_widget_show(menu_item);
-
- menu_item = gtk_menu_item_new_with_label("Enhance Application Settings");
- gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item);
- gtk_widget_show(menu_item);
-
- /* Set the state of the menu */
+ for (i = 0; i < ARRAY_LEN(applicationSettings); i++) {
+ ctk_drop_down_menu_append_item(d, applicationSettings[i], i);
+ }
if (!override) {
idx = 0;
@@ -725,14 +719,14 @@ static GtkWidget *create_fsaa_setting_menu(CtkMultisample *ctk_multisample,
}
}
- gtk_option_menu_set_menu(GTK_OPTION_MENU(omenu), menu);
+ /* set the menu item */
+ ctk_drop_down_menu_set_current_value(d, idx);
- gtk_option_menu_set_history(GTK_OPTION_MENU(omenu), idx);
-
- ctk_config_set_tooltip(ctk_multisample->ctk_config, omenu,
+ ctk_config_set_tooltip(ctk_multisample->ctk_config, d->menu,
__aa_menu_help);
- g_signal_connect(G_OBJECT(omenu), "changed",
+ g_signal_connect(ctk_drop_down_menu_change_object(GTK_WIDGET(d)),
+ "changed",
G_CALLBACK(fsaa_setting_menu_changed),
(gpointer) ctk_multisample);
@@ -742,7 +736,7 @@ static GtkWidget *create_fsaa_setting_menu(CtkMultisample *ctk_multisample,
G_CALLBACK(fsaa_setting_update_received),
(gpointer) ctk_multisample);
- return omenu;
+ return GTK_WIDGET(d);
} /* create_fsaa_setting_menu() */
@@ -847,15 +841,18 @@ static void fsaa_setting_checkbox_toggled(GtkWidget *widget,
* the fsaa slider.
*/
-static void fsaa_setting_menu_changed(GtkWidget *widget, gpointer user_data)
+static void fsaa_setting_menu_changed(GtkObject *object, gpointer user_data)
{
CtkMultisample *ctk_multisample = CTK_MULTISAMPLE(user_data);
gint idx;
gboolean override;
gboolean enhance;
-
- idx = gtk_option_menu_get_history(GTK_OPTION_MENU(widget));
-
+
+ CTK_DROP_DOWN_MENU(ctk_multisample->fsaa_menu)->current_selected_item_widget
+ = GTK_WIDGET(object);
+ idx = ctk_drop_down_menu_get_current_value
+ (CTK_DROP_DOWN_MENU(ctk_multisample->fsaa_menu));
+
/* The FSAA dropdown menu is setup this way:
*
* 0 == app
@@ -943,13 +940,16 @@ static void fsaa_setting_update_received(GtkObject *object,
GtkWidget *menu = ctk_multisample->fsaa_menu;
g_signal_handlers_block_by_func
- (G_OBJECT(menu), G_CALLBACK(fsaa_setting_menu_changed),
+ (ctk_drop_down_menu_change_object(GTK_WIDGET(menu)),
+ G_CALLBACK(fsaa_setting_menu_changed),
(gpointer) ctk_multisample);
-
- gtk_option_menu_set_history(GTK_OPTION_MENU(menu), idx);
+
+ ctk_drop_down_menu_set_current_value
+ (CTK_DROP_DOWN_MENU(ctk_multisample->fsaa_menu), idx);
g_signal_handlers_unblock_by_func
- (G_OBJECT(menu), G_CALLBACK(fsaa_setting_menu_changed),
+ (ctk_drop_down_menu_change_object(GTK_WIDGET(menu)),
+ G_CALLBACK(fsaa_setting_menu_changed),
(gpointer) ctk_multisample);
} else {
/* Update the checkbox */
@@ -1004,7 +1004,7 @@ static void update_fxaa_from_fsaa_change(CtkMultisample *ctk_multisample,
gboolean fxaa_value;
/* The FSAA dropdown menu is: 0 == app, 1 == override, 2 == enhance */
- gint fsaa_idx = gtk_option_menu_get_history(GTK_OPTION_MENU(fsaa_menu)) ;
+ gint fsaa_idx = CTK_DROP_DOWN_MENU(fsaa_menu)->current_selected_item;
if (fsaa_value != NV_CTRL_FSAA_MODE_NONE) {
g_signal_handlers_block_by_func(G_OBJECT(fxaa_checkbox),
@@ -1042,7 +1042,7 @@ static void update_fsaa_from_fxaa_change (CtkMultisample *ctk_multisample,
GtkWidget *fsaa_menu = ctk_multisample->fsaa_menu;
/* The FSAA dropdown menu is: 0 == app, 1 == override, 2 == enhance */
- gint fsaa_idx = gtk_option_menu_get_history(GTK_OPTION_MENU(fsaa_menu)) ;
+ gint fsaa_idx = CTK_DROP_DOWN_MENU(fsaa_menu)->current_selected_item;
gint fsaa_val;
diff --git a/src/gtk+-2.x/ctkmultisample.h b/src/gtk+-2.x/ctkmultisample.h
index a72621b..b7d0690 100644
--- a/src/gtk+-2.x/ctkmultisample.h
+++ b/src/gtk+-2.x/ctkmultisample.h
@@ -22,6 +22,7 @@
#include "ctkevent.h"
#include "ctkconfig.h"
+#include "ctkdropdownmenu.h"
G_BEGIN_DECLS
@@ -61,6 +62,7 @@ struct _CtkMultisample
GtkWidget *log_aniso_app_override_check_button;
GtkWidget *log_aniso_scale;
GtkWidget *texture_sharpening_button;
+ CtkDropDownMenu *d;
guint active_attributes;
diff --git a/src/gtk+-2.x/ctkwindow.c b/src/gtk+-2.x/ctkwindow.c
index 034a014..c3dd54b 100644
--- a/src/gtk+-2.x/ctkwindow.c
+++ b/src/gtk+-2.x/ctkwindow.c
@@ -888,7 +888,7 @@ GtkWidget *ctk_window_new(ParsedAttribute *p, ConfigProperties *conf,
/* add the per-vcs (e.g. Quadro Plex) entries into the tree model */
for (i = 0; i < h->targets[VCS_TARGET].n; i++) {
-
+
gchar *vcs_product_name;
gchar *vcs_name;
GtkWidget *child;
@@ -906,16 +906,17 @@ GtkWidget *ctk_window_new(ParsedAttribute *p, ConfigProperties *conf,
vcs_name = g_strdup_printf("VCS %d - (%s)",
NvCtrlGetTargetId(vcs_handle),
vcs_product_name);
+ XFree(vcs_product_name);
} else {
vcs_name = g_strdup_printf("VCS %d - (Unknown)",
NvCtrlGetTargetId(vcs_handle));
}
if (!vcs_name) continue;
-
+
/* create the object for receiving NV-CONTROL events */
-
+
ctk_event = CTK_EVENT(ctk_event_new(vcs_handle));
-
+
/* create the vcs entry */
gtk_tree_store_append(ctk_window->tree_store, &iter, NULL);
diff --git a/src/libXNVCtrl/NVCtrl.c b/src/libXNVCtrl/NVCtrl.c
index fe6240f..4db4533 100644
--- a/src/libXNVCtrl/NVCtrl.c
+++ b/src/libXNVCtrl/NVCtrl.c
@@ -1129,6 +1129,49 @@ Bool XNVCTRLStringOperation (
return ret;
}
+Bool XNVCTRLBindWarpPixmapName (
+ Display *dpy,
+ int screen,
+ Pixmap pix,
+ const char *name,
+ unsigned int dataType,
+ unsigned int vertexCount
+) {
+ XExtDisplayInfo *info = find_display(dpy);
+ xnvCtrlBindWarpPixmapNameReq *req;
+ unsigned int nameLen;
+
+ if (!XextHasExtension(info))
+ return False;
+
+ if (!name)
+ return False;
+
+ nameLen = strlen(name) + 1;
+
+ XNVCTRLCheckExtension(dpy, info, False);
+
+ LockDisplay(dpy);
+ GetReq(nvCtrlBindWarpPixmapName, req);
+
+ req->reqType = info->codes->major_opcode;
+ req->nvReqType = X_nvCtrlBindWarpPixmapName;
+
+ req->length += ((nameLen + 3) & ~3) >> 2;
+ req->num_bytes = nameLen;
+
+ req->screen = screen;
+ req->pixmap = pix;
+ req->dataType = dataType;
+ req->vertexCount = vertexCount;
+
+ Data(dpy, name, nameLen);
+
+ UnlockDisplay(dpy);
+ SyncHandle();
+
+ return True;
+}
static Bool wire_to_event (Display *dpy, XEvent *host, xEvent *wire)
{
diff --git a/src/libXNVCtrl/NVCtrl.h b/src/libXNVCtrl/NVCtrl.h
index 53bf930..2b6a302 100644
--- a/src/libXNVCtrl/NVCtrl.h
+++ b/src/libXNVCtrl/NVCtrl.h
@@ -406,21 +406,13 @@
/*
- * NV_CTRL_FRAMELOCK_MASTER - get/set which display device to use
- * as the frame lock master for the entire sync group. Note that only
- * one node in the sync group should be configured as the master.
- *
- * This attribute can only be queried through XNVCTRLQueryTargetAttribute()
- * using a NV_CTRL_TARGET_TYPE_GPU target. This attribute cannot be
- * queried using a NV_CTRL_TARGET_TYPE_X_SCREEN.
+ * NV_CTRL_FRAMELOCK_MASTER is deprecated; NV_CTRL_FRAMELOCK_DISPLAY_CONFIG
+ * should be used instead.
*/
#define NV_CTRL_FRAMELOCK_MASTER 22 /* RW-G */
-
-/* These are deprecated. NV_CTRL_FRAMELOCK_MASTER now takes and
- returns a display mask as value. */
-#define NV_CTRL_FRAMELOCK_MASTER_FALSE 0
-#define NV_CTRL_FRAMELOCK_MASTER_TRUE 1
+#define NV_CTRL_FRAMELOCK_MASTER_FALSE 0 // deprecated
+#define NV_CTRL_FRAMELOCK_MASTER_TRUE 1 // deprecated
/*
@@ -520,7 +512,7 @@
/*
* NV_CTRL_FRAMELOCK_SYNC - enable/disable the syncing of display
* devices to the frame lock pulse as specified by previous calls to
- * NV_CTRL_FRAMELOCK_MASTER and NV_CTRL_FRAMELOCK_SLAVES.
+ * NV_CTRL_FRAMELOCK_DISPLAY_CONFIG.
*
* This attribute can only be queried through XNVCTRLQueryTargetAttribute()
* using a NV_CTRL_TARGET_TYPE_GPU target. This attribute cannot be
@@ -1708,24 +1700,15 @@
#define NV_CTRL_ASSOCIATED_DISPLAY_DEVICES 231 /* RW- */
/*
- * NV_CTRL_FRAMELOCK_SLAVES - get/set whether the display device(s)
- * given should listen or ignore the master's sync signal.
- *
- * This attribute can only be queried through XNVCTRLQueryTargetAttribute()
- * using a NV_CTRL_TARGET_TYPE_GPU target. This attribute cannot be
- * queried using a NV_CTRL_TARGET_TYPE_X_SCREEN.
+ * NV_CTRL_FRAMELOCK_SLAVES is deprecated; NV_CTRL_FRAMELOCK_DISPLAY_CONFIG
+ * should be used instead.
*/
#define NV_CTRL_FRAMELOCK_SLAVES 232 /* RW-G */
/*
- * NV_CTRL_FRAMELOCK_MASTERABLE - Can any of the given display devices
- * be set as master of the frame lock group. Returns a bitmask of the
- * corresponding display devices that can be set as master.
- *
- * This attribute can only be queried through XNVCTRLQueryTargetAttribute()
- * using a NV_CTRL_TARGET_TYPE_GPU target. This attribute cannot be
- * queried using a NV_CTRL_TARGET_TYPE_X_SCREEN.
+ * NV_CTRL_FRAMELOCK_MASTERABLE is deprecated; NV_CTRL_FRAMELOCK_DISPLAY_CONFIG
+ * should be used instead.
*/
#define NV_CTRL_FRAMELOCK_MASTERABLE 233 /* R-DG */
@@ -2307,10 +2290,9 @@
#define NV_CTRL_GVO_CSC_CHANGED_EVENT 294 /* --- */
-/*
- * NV_CTRL_FRAMELOCK_SLAVEABLE - Returns a bitmask of the display devices
- * that are (currently) allowed to be selected as slave devices for the
- * given GPU
+/*
+ * NV_CTRL_FRAMELOCK_SLAVEABLE is deprecated; NV_CTRL_FRAMELOCK_DISPLAY_CONFIG
+ * should be used instead.
*/
#define NV_CTRL_FRAMELOCK_SLAVEABLE 295 /* R-DG */
@@ -3205,6 +3187,24 @@
#define NV_CTRL_DISPLAY_RANDR_OUTPUT_ID 391 /* R-D- */
/*
+ * NV_CTRL_FRAMELOCK_DISPLAY_CONFIG - Configures whether the display device
+ * should listen, ignore or drive the framelock sync signal.
+ *
+ * Note that whether or not a display device may be set as a client/server
+ * depends on the current configuration. For example, only one server may be
+ * set per Quadro Sync device, and displays can only be configured as a client
+ * if their refresh rate sufficiently matches the refresh rate of the server
+ * device.
+ *
+ * Note that when querying the ValidValues for this data type, the values are
+ * reported as bits within a bitmask (ATTRIBUTE_TYPE_INT_BITS);
+ */
+#define NV_CTRL_FRAMELOCK_DISPLAY_CONFIG 392 /* RWD */
+#define NV_CTRL_FRAMELOCK_DISPLAY_CONFIG_DISABLED 0
+#define NV_CTRL_FRAMELOCK_DISPLAY_CONFIG_CLIENT 1
+#define NV_CTRL_FRAMELOCK_DISPLAY_CONFIG_SERVER 2
+
+/*
* NV_CTRL_TOTAL_DEDICATED_GPU_MEMORY - Returns the total amount of dedicated
* GPU video memory, in MB, on the specified GPU. This excludes any TurboCache
* padding included in the value returned by NV_CTRL_TOTAL_GPU_MEMORY.
@@ -4612,5 +4612,13 @@ typedef struct _NVCTRLAttributePermissions {
#define TARGET_STRING_ATTRIBUTE_CHANGED_EVENT 3
#define TARGET_BINARY_ATTRIBUTE_CHANGED_EVENT 4
+/*
+ * To be used with XNVCTRLBindWarpPixmapName to specify the data type.
+ */
+
+#define NV_CTRL_WARP_DATA_TYPE_BLEND_OR_OFFSET_TEXTURE 0
+#define NV_CTRL_WARP_DATA_TYPE_MESH_TRIANGLESTRIP_XYUVRQ 1
+#define NV_CTRL_WARP_DATA_TYPE_MESH_TRIANGLES_XYUVRQ 2
+
#endif /* __NVCTRL_H */
diff --git a/src/libXNVCtrl/NVCtrlLib.h b/src/libXNVCtrl/NVCtrlLib.h
index f2f4bd6..0d6f910 100644
--- a/src/libXNVCtrl/NVCtrlLib.h
+++ b/src/libXNVCtrl/NVCtrlLib.h
@@ -632,7 +632,66 @@ Bool XNVCTRLStringOperation (
char **ppOut
);
+/*
+ * XNVCTRLBindWarpPixmapName -
+ *
+ * Binds a Pixmap to a string name and some meta-data. If the Pixmap is None,
+ * a previously bound name will be released from its Pixmap.
+ *
+ * These names are to be used with the "WarpMesh", "BlendTexture" and
+ * "OffsetTexture" MetaMode attributes.
+ *
+ * Returns True if successful, or False if the screen is not
+ * controlled by the NVIDIA driver.
+ *
+ * dataType should be one of:
+ * - NV_CTRL_WARP_DATA_TYPE_BLEND_OR_OFFSET_TEXTURE
+ * - NV_CTRL_WARP_DATA_TYPE_MESH_TRIANGLESTRIP_XYUVRQ
+ * - NV_CTRL_WARP_DATA_TYPE_MESH_TRIANGLES_XYUVRQ
+ *
+ * For dataType = NV_CTRL_WARP_DATA_TYPE_MESH_*, the named Pixmap is expected
+ * to have a width multiple of 1024 pixels, have a depth of 32 and contain a
+ * binary representation of a list of six-component vertices. Each of these
+ * components is a 32-bit floating point value.
+ *
+ * The XY components should contain normalized vertex coordinates, to be
+ * rendered as a triangle list or strip. The X and Y components' [0,1] range
+ * map to the display's MetaMode ViewportOut X and Y, respectively.
+ *
+ * The U, V, R, and Q components should contain normalized, projective texture
+ * coordinates:
+ * U, V: 2D texture coordinate. U and V components' [0,1] range maps to the
+ * display's MetaMode ViewportIn X and Y, respectively.
+ * R: unused
+ * Q: Used for interpolation purposes. This is typically the third component
+ * of the result of a multiplication by a 3x3 projective transform matrix.
+ *
+ * vertexCount should contain the amount of vertices represented by the Pixmap
+ * and is ignored if dataType = NV_CTRL_WARP_DATA_TYPE_BLEND_OR_OFFSET_TEXTURE.
+ *
+ * Possible errors:
+ * BadValue - The screen index is out of range
+ * BadMatch - The screen isn't being driven by the NVIDIA driver
+ * BadMatch - If pixmap_id is None, couldn't find the name to release.
+ * BadPixmap - Couldn't find the Pixmap referenced by pixmap_id.
+ * BadMatch - pixmap_id names a Pixmap owned by a different screen.
+ * BadValue - dataType isn't one of NV_CTRL_WARP_DATA_TYPE_*.
+ * BadAlloc - Insufficient resources to fulfill the request.
+ * Possible errors if dataType is NV_CTRL_WARP_DATA_TYPE_MESH_*:
+ * BadMatch - The Pixmap's width isn't a multiple of 1024.
+ * BadMatch - The Pixmap's depth isn't 32.
+ * BadMatch - The Pixmap cannot contain vertexCount XYUVRQ vertices.
+ * BadValue - Invalid vertexCount for the data type.
+ */
+Bool XNVCTRLBindWarpPixmapName (
+ Display *dpy,
+ int screen,
+ Pixmap pixmap_id,
+ const char *name,
+ unsigned int dataType,
+ unsigned int vertexCount
+);
/*
* XNVCtrlSelectNotify -
diff --git a/src/libXNVCtrl/nv_control.h b/src/libXNVCtrl/nv_control.h
index 0124c87..723609c 100644
--- a/src/libXNVCtrl/nv_control.h
+++ b/src/libXNVCtrl/nv_control.h
@@ -66,7 +66,7 @@
#define NV_CONTROL_NAME "NV-CONTROL"
#define NV_CONTROL_MAJOR 1
-#define NV_CONTROL_MINOR 28
+#define NV_CONTROL_MINOR 29
#define X_nvCtrlQueryExtension 0
#define X_nvCtrlIsNv 1
@@ -101,8 +101,9 @@
#define X_nvCtrlQueryStringAttributePermissions 30
#define X_nvCtrlQueryBinaryDataAttributePermissions 31
#define X_nvCtrlQueryStringOperationAttributePermissions 32
+#define X_nvCtrlBindWarpPixmapName 33
-#define X_nvCtrlLastRequest (X_nvCtrlQueryStringOperationAttributePermissions + 1)
+#define X_nvCtrlLastRequest (X_nvCtrlBindWarpPixmapName + 1)
/* Define 32 bit floats */
@@ -533,6 +534,18 @@ typedef struct {
#define sz_xnvCtrlStringOperationReply 32
typedef struct {
+ CARD8 reqType;
+ CARD8 nvReqType;
+ CARD16 length B16;
+ CARD32 screen B32;
+ CARD32 pixmap B32;
+ CARD32 num_bytes B32; /* Length of string */
+ CARD32 dataType B32;
+ CARD32 vertexCount B32;
+} xnvCtrlBindWarpPixmapNameReq;
+#define sz_xnvCtrlBindWarpPixmapNameReq 24
+
+typedef struct {
union {
struct {
BYTE type;
diff --git a/src/parse.c b/src/parse.c
index a27664d..73eb006 100644
--- a/src/parse.c
+++ b/src/parse.c
@@ -308,6 +308,7 @@ AttributeTableEntry attributeTable[] = {
{ "CurrentMetaMode", NV_CTRL_STRING_CURRENT_METAMODE_VERSION_2, S|N, "Controls the current MetaMode." },
{ "XineramaInfoOrder", NV_CTRL_STRING_NVIDIA_XINERAMA_INFO_ORDER, S|N, "Controls the nvidiaXineramaInfoOrder." },
{ "RandROutputID", NV_CTRL_DISPLAY_RANDR_OUTPUT_ID, N, "The RandR Output ID that corresponds to the display device." },
+ { "FrameLockDisplayConfig", NV_CTRL_FRAMELOCK_DISPLAY_CONFIG, N, "Controls the FrameLock mode of operation for the display device." },
/* TV */
{ "TVOverScan", NV_CTRL_TV_OVERSCAN, 0, "Adjusts the amount of overscan on the specified display device." },
diff --git a/src/version.mk b/src/version.mk
index 6db0208..f91d9f6 100644
--- a/src/version.mk
+++ b/src/version.mk
@@ -1 +1 @@
-NVIDIA_VERSION = 310.19
+NVIDIA_VERSION = 313.09
diff --git a/version.mk b/version.mk
index 6db0208..f91d9f6 100644
--- a/version.mk
+++ b/version.mk
@@ -1 +1 @@
-NVIDIA_VERSION = 310.19
+NVIDIA_VERSION = 313.09