diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/gtk+-2.x/ctkgvo.c | 107 | ||||
-rw-r--r-- | src/gtk+-2.x/ctkserver.c | 14 | ||||
-rw-r--r-- | src/libXNVCtrl/NVCtrl.h | 2 | ||||
-rw-r--r-- | src/libXNVCtrl/libXNVCtrl.a | bin | 17180 -> 17180 bytes |
4 files changed, 77 insertions, 46 deletions
diff --git a/src/gtk+-2.x/ctkgvo.c b/src/gtk+-2.x/ctkgvo.c index da79328..be71c69 100644 --- a/src/gtk+-2.x/ctkgvo.c +++ b/src/gtk+-2.x/ctkgvo.c @@ -117,8 +117,7 @@ static void set_gvo_sensitivity(CtkGvo *ctk_gvo, static void get_video_format_details(CtkGvo *ctk_gvo); -static void update_gvo_current_info(CtkGvo *ctk_gvo, gint w, gint h, - gint state); +static void update_gvo_current_info(CtkGvo *ctk_gvo, guint lock_owner); static void update_delay_spin_buttons(CtkGvo *ctk_gvo); @@ -301,10 +300,6 @@ static const FormatName syncFormatNames[] = { #define SET_SENSITIVITY_EXCLUDE_DETECT_BUTTON 0x0002 #define SET_SENSITIVITY_EXCLUDE_ROI_BUTTONS 0x0004 -#define CURRENT_SDI_STATE_INACTIVE 0 -#define CURRENT_SDI_STATE_IN_USE_BY_X 1 -#define CURRENT_SDI_STATE_IN_USE_BY_GLX 2 - #define DEFAULT_DETECT_INPUT_TIME_INTERVAL 2000 #define UPDATE_GVO_BANNER_TIME_INTERVAL 200 #define DEFAULT_GVO_PROBE_TIME_INTERVAL 1000 @@ -1859,7 +1854,6 @@ static void toggle_sdi_output_button(GtkWidget *button, gpointer user_data) static void post_toggle_sdi_output_button(CtkGvo *ctk_gvo, gboolean enabled) { - gint w, h; GList *children; GList *child; @@ -1883,8 +1877,7 @@ static void post_toggle_sdi_output_button(CtkGvo *ctk_gvo, gboolean enabled) ctk_gvo->output_video_format, ctk_gvo->output_data_format); - get_video_format_resolution(ctk_gvo->output_video_format, &w, &h); - update_gvo_current_info(ctk_gvo, w, h, CURRENT_SDI_STATE_IN_USE_BY_X); + update_gvo_current_info(ctk_gvo, NV_CTRL_GVO_LOCK_OWNER_CLONE); } else { gtk_container_add(GTK_CONTAINER(ctk_gvo->toggle_sdi_output_button), @@ -1894,15 +1887,11 @@ static void post_toggle_sdi_output_button(CtkGvo *ctk_gvo, gboolean enabled) NV_CTRL_GVO_VIDEO_FORMAT_NONE, ctk_gvo->output_data_format); - update_gvo_current_info(ctk_gvo, 0, 0, CURRENT_SDI_STATE_INACTIVE); + update_gvo_current_info(ctk_gvo, NV_CTRL_GVO_LOCK_OWNER_NONE); } ctk_gvo->sdi_output_enabled = enabled; - - set_gvo_sensitivity(ctk_gvo, !enabled, - SET_SENSITIVITY_EXCLUDE_ENABLE_BUTTON | - SET_SENSITIVITY_EXCLUDE_ROI_BUTTONS); ctk_config_statusbar_message(ctk_gvo->ctk_config, "SDI Output %s.", enabled ? "enabled" : "disabled"); @@ -2352,32 +2341,47 @@ static void get_video_format_details(CtkGvo *ctk_gvo) /* - * update_gvo_current_info() - + * update_gvo_current_info() - Updates the state information to reflect + * the GVO device's current state. */ -static void update_gvo_current_info(CtkGvo *ctk_gvo, gint w, gint h, - gint state) +static void update_gvo_current_info(CtkGvo *ctk_gvo, guint lock_owner) { + int width; + int height; gchar res_string[64], state_string[64]; + gboolean sensitive = FALSE; + guint flags = 0; if (!ctk_gvo->current_resolution_label) return; if (!ctk_gvo->current_state_label) return; + + /* Get the current video format sizes */ + get_video_format_resolution(ctk_gvo->output_video_format, &width, &height); - switch (state) { + switch (lock_owner) { - case CURRENT_SDI_STATE_INACTIVE: + case NV_CTRL_GVO_LOCK_OWNER_NONE: snprintf(res_string, 64, "Inactive"); snprintf(state_string, 64, "Inactive"); + sensitive = TRUE; break; - - case CURRENT_SDI_STATE_IN_USE_BY_X: - snprintf(res_string, 64, "%d x %d", w, h); - snprintf(state_string, 64, "In Use by X"); + + case NV_CTRL_GVO_LOCK_OWNER_CLONE: + snprintf(res_string, 64, "%d x %d", width, height); + snprintf(state_string, 64, "In use by X (Clone mode)"); + flags = SET_SENSITIVITY_EXCLUDE_ENABLE_BUTTON | + SET_SENSITIVITY_EXCLUDE_ROI_BUTTONS; break; - case CURRENT_SDI_STATE_IN_USE_BY_GLX: - snprintf(res_string, 64, "%d x %d", w, h); - snprintf(state_string, 64, "In Use by GLX"); + case NV_CTRL_GVO_LOCK_OWNER_X_SCREEN: + snprintf(res_string, 64, "%d x %d", width, height); + snprintf(state_string, 64, "In use by X"); + break; + + case NV_CTRL_GVO_LOCK_OWNER_GLX: + snprintf(res_string, 64, "%d x %d", width, height); + snprintf(state_string, 64, "In use by GLX"); break; default: @@ -2390,11 +2394,34 @@ static void update_gvo_current_info(CtkGvo *ctk_gvo, gint w, gint h, gtk_label_set_text(GTK_LABEL(ctk_gvo->current_state_label), state_string); + set_gvo_sensitivity(ctk_gvo, sensitive, flags); + } /* update_gvo_current_info() */ /* + * query_gvo_current_info() - Queries the state of the GVO device + * from the X server and updates the information on the page. + */ + +static void query_gvo_current_info(CtkGvo *ctk_gvo) +{ + ReturnStatus ret; + gint lock_owner; + + ret = NvCtrlGetAttribute(ctk_gvo->handle, + NV_CTRL_GVO_LOCK_OWNER, &lock_owner); + + if (ret == NvCtrlSuccess) { + update_gvo_current_info(ctk_gvo, lock_owner); + } + +} /* query_gvo_current_info() */ + + + +/* * update_delay_spin_buttons() - */ @@ -2615,11 +2642,6 @@ static void register_for_gvo_events(CtkGvo *ctk_gvo) CTK_EVENT_NAME(NV_CTRL_GVO_X_SCREEN_PAN_Y), G_CALLBACK(gvo_event_received), (gpointer) ctk_gvo); - - g_signal_connect(G_OBJECT(ctk_gvo->ctk_event), - CTK_EVENT_NAME(NV_CTRL_GVO_GLX_LOCKED), - G_CALLBACK(gvo_event_received), - (gpointer) ctk_gvo); g_signal_connect(G_OBJECT(ctk_gvo->ctk_event), CTK_EVENT_NAME(NV_CTRL_GVO_DISPLAY_X_SCREEN), @@ -2630,6 +2652,11 @@ static void register_for_gvo_events(CtkGvo *ctk_gvo) CTK_EVENT_NAME(NV_CTRL_GVO_COMPOSITE_TERMINATION), G_CALLBACK(gvo_event_received), (gpointer) ctk_gvo); + + g_signal_connect(G_OBJECT(ctk_gvo->ctk_event), + CTK_EVENT_NAME(NV_CTRL_GVO_LOCK_OWNER), + G_CALLBACK(gvo_event_received), + (gpointer) ctk_gvo); } @@ -2643,7 +2670,6 @@ static void gvo_event_received(GtkObject *object, GtkWidget *widget; gint attribute = event_struct->attribute; gint value = event_struct->value; - gint w, h; switch (attribute) { case NV_CTRL_GVO_SYNC_MODE: @@ -2664,6 +2690,7 @@ static void gvo_event_received(GtkObject *object, (CTK_DROP_DOWN_MENU(widget), value); post_output_video_format_changed(ctk_gvo, value); + query_gvo_current_info(ctk_gvo); g_signal_handlers_unblock_by_func (G_OBJECT(widget), @@ -2746,24 +2773,16 @@ static void gvo_event_received(GtkObject *object, (gpointer) ctk_gvo); break; - case NV_CTRL_GVO_GLX_LOCKED: - if (value == NV_CTRL_GVO_GLX_LOCKED_TRUE) { - get_video_format_resolution(ctk_gvo->output_video_format, &w, &h); - update_gvo_current_info(ctk_gvo, w, h, - CURRENT_SDI_STATE_IN_USE_BY_GLX); - set_gvo_sensitivity(ctk_gvo, FALSE, 0); - } else { - update_gvo_current_info(ctk_gvo, 0, 0, CURRENT_SDI_STATE_INACTIVE); - set_gvo_sensitivity(ctk_gvo, TRUE, 0); - } + case NV_CTRL_GVO_LOCK_OWNER: + update_gvo_current_info(ctk_gvo, value); break; case NV_CTRL_GVO_DISPLAY_X_SCREEN: /* * XXX explicitly re-query this value, since a change may not - * actually have been successfully applied (if GLX already had - * GVO locked) + * actually have been successfully applied (if GLX or some other + * mode already had GVO locked) */ ret = NvCtrlGetAttribute(ctk_gvo->handle, diff --git a/src/gtk+-2.x/ctkserver.c b/src/gtk+-2.x/ctkserver.c index 77367ea..28f42d6 100644 --- a/src/gtk+-2.x/ctkserver.c +++ b/src/gtk+-2.x/ctkserver.c @@ -260,6 +260,7 @@ GtkWidget* ctk_server_new(NvCtrlAttributeHandle *handle, gchar *server_version; gchar *vendor_str; gchar *vendor_ver; + gchar *nv_control_server_version; gchar *num_screens; ReturnStatus ret; @@ -327,6 +328,13 @@ GtkWidget* ctk_server_new(NvCtrlAttributeHandle *handle, vendor_ver = get_server_vendor_version(handle); + /* NV_CTRL_STRING_NV_CONTROL_VERSION */ + + ret = NvCtrlGetStringAttribute(handle, + NV_CTRL_STRING_NV_CONTROL_VERSION, + &nv_control_server_version); + if (ret != NvCtrlSuccess) nv_control_server_version = NULL; + /* # Logical X Screens */ if (xinerama_enabled) { @@ -408,7 +416,7 @@ GtkWidget* ctk_server_new(NvCtrlAttributeHandle *handle, hseparator = gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(hbox), hseparator, TRUE, TRUE, 5); - table = gtk_table_new(11, 2, FALSE); + table = gtk_table_new(15, 2, FALSE); gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0); gtk_table_set_row_spacings(GTK_TABLE(table), 3); gtk_table_set_col_spacings(GTK_TABLE(table), 15); @@ -425,6 +433,9 @@ GtkWidget* ctk_server_new(NvCtrlAttributeHandle *handle, 0, 0.5, "Server Vendor Version:", 0, 0.5, vendor_ver); /* separator */ add_table_row(table, 10, + 0, 0, "NV-Control Version:", 0, 0, nv_control_server_version); + /* separator */ + add_table_row(table, 14, 0, 0, "X Screens:", 0, 0, num_screens); @@ -469,6 +480,7 @@ GtkWidget* ctk_server_new(NvCtrlAttributeHandle *handle, g_free(server_version); g_free(vendor_str); g_free(vendor_ver); + XFree(nv_control_server_version); g_free(num_screens); gtk_widget_show_all(GTK_WIDGET(object)); diff --git a/src/libXNVCtrl/NVCtrl.h b/src/libXNVCtrl/NVCtrl.h index 389fe9b..ed882cf 100644 --- a/src/libXNVCtrl/NVCtrl.h +++ b/src/libXNVCtrl/NVCtrl.h @@ -3056,7 +3056,7 @@ #define NV_CTRL_GVO_LOCK_OWNER_NONE 0 #define NV_CTRL_GVO_LOCK_OWNER_GLX 1 #define NV_CTRL_GVO_LOCK_OWNER_CLONE 2 -#define NV_CTRL_GVO_LOCK_OWNER_TWINVIEW 3 +#define NV_CTRL_GVO_LOCK_OWNER_X_SCREEN 3 #define NV_CTRL_LAST_ATTRIBUTE NV_CTRL_GVO_LOCK_OWNER diff --git a/src/libXNVCtrl/libXNVCtrl.a b/src/libXNVCtrl/libXNVCtrl.a Binary files differindex dc1389b..e832bc9 100644 --- a/src/libXNVCtrl/libXNVCtrl.a +++ b/src/libXNVCtrl/libXNVCtrl.a |