diff options
-rw-r--r-- | src/gtk+-2.x/ctkdisplayconfig-utils.c | 7 | ||||
-rw-r--r-- | src/gtk+-2.x/ctkdisplayconfig.c | 12 | ||||
-rw-r--r-- | src/gtk+-2.x/ctkgvo-sync.c | 76 | ||||
-rw-r--r-- | src/libXNVCtrl/NVCtrl.h | 7 |
4 files changed, 82 insertions, 20 deletions
diff --git a/src/gtk+-2.x/ctkdisplayconfig-utils.c b/src/gtk+-2.x/ctkdisplayconfig-utils.c index 8b41571..6b5f823 100644 --- a/src/gtk+-2.x/ctkdisplayconfig-utils.c +++ b/src/gtk+-2.x/ctkdisplayconfig-utils.c @@ -282,12 +282,10 @@ static nvModeLinePtr modeline_parse(const char *modeline_str, if (!str) goto fail; /* Read dot clock */ - str = parse_read_name(str, &(modeline->data.clock), 0); if (!str) goto fail; /* Read the mode timings */ - str = parse_read_integer(str, &(modeline->data.hdisplay)); str = parse_read_integer(str, &(modeline->data.hsyncstart)); str = parse_read_integer(str, &(modeline->data.hsyncend)); @@ -765,8 +763,11 @@ static void display_remove_modelines(nvDisplayPtr display) if (display) { while (display->modelines) { modeline = display->modelines; - free(modeline->data.clock); display->modelines = display->modelines->next; + free(modeline->xconfig_name); + free(modeline->data.identifier); + free(modeline->data.comment); + free(modeline->data.clock); free(modeline); } display->num_modelines = 0; diff --git a/src/gtk+-2.x/ctkdisplayconfig.c b/src/gtk+-2.x/ctkdisplayconfig.c index ee4c133..2061434 100644 --- a/src/gtk+-2.x/ctkdisplayconfig.c +++ b/src/gtk+-2.x/ctkdisplayconfig.c @@ -6547,13 +6547,19 @@ static XConfigModeLinePtr makeXConfigModeline(nvModeLinePtr modeline) *xconf_modeline = modeline->data; if (modeline->xconfig_name) { - xconf_modeline->identifier = strdup(modeline->xconfig_name); + xconf_modeline->identifier = xconfigStrdup(modeline->xconfig_name); + } else if (modeline->data.identifier) { - xconf_modeline->identifier = strdup(modeline->data.identifier); + xconf_modeline->identifier = xconfigStrdup(modeline->data.identifier); + + } + + if (modeline->data.clock) { + xconf_modeline->clock = xconfigStrdup(modeline->data.clock); } if (modeline->data.comment) { - xconf_modeline->comment = strdup(modeline->data.comment); + xconf_modeline->comment = xconfigStrdup(modeline->data.comment); } return xconf_modeline; diff --git a/src/gtk+-2.x/ctkgvo-sync.c b/src/gtk+-2.x/ctkgvo-sync.c index 3aeb4be..d7b108f 100644 --- a/src/gtk+-2.x/ctkgvo-sync.c +++ b/src/gtk+-2.x/ctkgvo-sync.c @@ -135,10 +135,19 @@ static const char * __hsync_delay_help = "The HSync Delay entry allows you to specify the horizontal delay between the " "input signal and the output signal generated by the SDI device."; +static const char * __hsync_advance_help = +"The HSync Advance entry allows you to specify the horizontal advance between " +"the input signal and the output signal generated by the SDI device."; + static const char * __vsync_delay_help = "The VSync Delay entry allows you to specify the vertical delay between the " "input signal and the output signal generated by the SDI device."; +static const char * __vsync_advance_help = +"The VSync Advance entry allows you to specify the vertical advance between " +"the input signal and the output signal generated by the SDI device."; + + /**** Utility Functions ******************************************************/ @@ -329,6 +338,8 @@ GtkWidget* ctk_gvo_sync_new(NvCtrlAttributeHandle *handle, gint val, i, width, height; ReturnStatus ret; gint row; + + const char *help_text; /* make sure we have a handle */ @@ -540,7 +551,7 @@ GtkWidget* ctk_gvo_sync_new(NvCtrlAttributeHandle *handle, /* - * Synchronization Delay + * Synchronization Delay/Advance */ ctk_gvo_get_video_format_resolution(ctk_gvo_sync->input_video_format, @@ -548,7 +559,12 @@ GtkWidget* ctk_gvo_sync_new(NvCtrlAttributeHandle *handle, /* NV_CTRL_GVO_SYNC_DELAY_PIXELS */ - label = gtk_label_new("HSync Delay:"); + if ( ctk_gvo_sync->caps && NV_CTRL_GVO_CAPABILITIES_ADVANCE_SYNC_SKEW ) { + label = gtk_label_new("HSync Advance:"); + } else { + label = gtk_label_new("HSync Delay:"); + } + gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); gtk_table_attach(GTK_TABLE(table), label, 0, 1, row, row+1, GTK_FILL, GTK_FILL, TABLE_PADDING, TABLE_PADDING); @@ -558,11 +574,19 @@ GtkWidget* ctk_gvo_sync_new(NvCtrlAttributeHandle *handle, if (width < 1) width = 1; + if ( ctk_gvo_sync->caps && NV_CTRL_GVO_CAPABILITIES_ADVANCE_SYNC_SKEW ) { + width = INT_MAX; + help_text = __hsync_advance_help; + } else { + help_text = __hsync_delay_help; + } + ctk_gvo_sync->hsync_delay_spin_button = gtk_spin_button_new_with_range(0.0, width, 1); - ctk_config_set_tooltip(ctk_config, ctk_gvo_sync->hsync_delay_spin_button, - __hsync_delay_help); + ctk_config_set_tooltip(ctk_config, + ctk_gvo_sync->hsync_delay_spin_button, + help_text); gtk_spin_button_set_value (GTK_SPIN_BUTTON(ctk_gvo_sync->hsync_delay_spin_button), val); @@ -588,7 +612,11 @@ GtkWidget* ctk_gvo_sync_new(NvCtrlAttributeHandle *handle, /* NV_CTRL_GVO_SYNC_DELAY_LINES */ - label = gtk_label_new("VSync Delay:"); + if ( ctk_gvo_sync->caps && NV_CTRL_GVO_CAPABILITIES_ADVANCE_SYNC_SKEW ) { + label = gtk_label_new("VSync Advance:"); + } else { + label = gtk_label_new("VSync Delay:"); + } gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); gtk_table_attach(GTK_TABLE(table), label, 0, 1, row, row+1, GTK_FILL, GTK_FILL, TABLE_PADDING, TABLE_PADDING); @@ -598,12 +626,19 @@ GtkWidget* ctk_gvo_sync_new(NvCtrlAttributeHandle *handle, if (height < 1) height = 1; + if ( ctk_gvo_sync->caps && NV_CTRL_GVO_CAPABILITIES_ADVANCE_SYNC_SKEW ) { + height = INT_MAX; + help_text = __vsync_advance_help; + } else { + help_text = __vsync_delay_help; + } + ctk_gvo_sync->vsync_delay_spin_button = gtk_spin_button_new_with_range(0.0, height, 1); - - ctk_config_set_tooltip(ctk_config, ctk_gvo_sync->vsync_delay_spin_button, - __vsync_delay_help); - + + ctk_config_set_tooltip(ctk_config, + ctk_gvo_sync->vsync_delay_spin_button, + help_text); gtk_spin_button_set_value (GTK_SPIN_BUTTON(ctk_gvo_sync->vsync_delay_spin_button), val); @@ -1014,6 +1049,11 @@ static void update_delay_spin_buttons_range(CtkGvoSync *ctk_gvo_sync) { gint w, h; + if ( ctk_gvo_sync->caps && NV_CTRL_GVO_CAPABILITIES_ADVANCE_SYNC_SKEW ) { + // No need to reset max values + return; + } + ctk_gvo_get_video_format_resolution(ctk_gvo_sync->input_video_format, &w, &h); @@ -1021,7 +1061,7 @@ static void update_delay_spin_buttons_range(CtkGvoSync *ctk_gvo_sync) (GTK_SPIN_BUTTON(ctk_gvo_sync->hsync_delay_spin_button), 0, w); gtk_spin_button_set_range (GTK_SPIN_BUTTON(ctk_gvo_sync->vsync_delay_spin_button), 0, h); - + } /* update_delay_spin_buttons_range() */ @@ -1498,10 +1538,18 @@ GtkTextBuffer* ctk_gvo_sync_create_help(GtkTextTagTable *table, ctk_help_para(b, &i, __sync_format_help); ctk_help_heading(b, &i, "Sync Status"); ctk_help_para(b, &i, __sync_status_help); - ctk_help_heading(b, &i, "HSync Delay"); - ctk_help_para(b, &i, __hsync_delay_help); - ctk_help_heading(b, &i, "VSync Delay"); - ctk_help_para(b, &i, __vsync_delay_help); + + if ( ctk_gvo_sync->caps && NV_CTRL_GVO_CAPABILITIES_ADVANCE_SYNC_SKEW ) { + ctk_help_heading(b, &i, "HSync Advance"); + ctk_help_para(b, &i, __hsync_advance_help); + ctk_help_heading(b, &i, "VSync Advance"); + ctk_help_para(b, &i, __vsync_advance_help); + } else { + ctk_help_heading(b, &i, "HSync Delay"); + ctk_help_para(b, &i, __hsync_delay_help); + ctk_help_heading(b, &i, "VSync Delay"); + ctk_help_para(b, &i, __vsync_delay_help); + } ctk_help_finish(b); diff --git a/src/libXNVCtrl/NVCtrl.h b/src/libXNVCtrl/NVCtrl.h index 96e073d..d231372 100644 --- a/src/libXNVCtrl/NVCtrl.h +++ b/src/libXNVCtrl/NVCtrl.h @@ -1130,6 +1130,9 @@ * NV_CTRL_GVO_SYNC_DELAY_PIXELS - controls the delay between the * input sync and the output sync in numbers of pixels from hsync; * this is a 12 bit value. + * + * If the NV_CTRL_GVO_CAPABILITIES_ADVANCE_SYNC_SKEW bit is set, + * then setting this value will set an advance instead of a delay. */ #define NV_CTRL_GVO_SYNC_DELAY_PIXELS 79 /* RW- */ @@ -1139,6 +1142,9 @@ * NV_CTRL_GVO_SYNC_DELAY_LINES - controls the delay between the input * sync and the output sync in numbers of lines from vsync; this is a * 12 bit value. + * + * If the NV_CTRL_GVO_CAPABILITIES_ADVANCE_SYNC_SKEW bit is set, + * then setting this value will set an advance instead of a delay. */ #define NV_CTRL_GVO_SYNC_DELAY_LINES 80 /* RW- */ @@ -2716,6 +2722,7 @@ #define NV_CTRL_GVO_CAPABILITIES_COMPOSITE_TERMINATION 0x00000004 #define NV_CTRL_GVO_CAPABILITIES_SHARED_SYNC_BNC 0x00000008 #define NV_CTRL_GVO_CAPABILITIES_MULTIRATE_SYNC 0x00000010 +#define NV_CTRL_GVO_CAPABILITIES_ADVANCE_SYNC_SKEW 0x00000020 /* |