diff options
author | Aaron Plattner <aplattner@nvidia.com> | 2013-05-02 08:02:33 -0700 |
---|---|---|
committer | Aaron Plattner <aplattner@nvidia.com> | 2013-05-02 08:02:33 -0700 |
commit | b9b1fd8f08cd7ccda0f2edea50fc87b3383af52a (patch) | |
tree | 9f0f22aba118f768ee6a721088cdfdc544bc7111 /src | |
parent | 8600b2a00d39fef61123f5eec972d8508740e460 (diff) |
319.17319.17
Diffstat (limited to 'src')
-rw-r--r-- | src/common-utils/common-utils.c | 99 | ||||
-rw-r--r-- | src/common-utils/common-utils.h | 5 | ||||
-rw-r--r-- | src/gtk+-2.x/ctkappprofile.c | 197 | ||||
-rw-r--r-- | src/gtk+-2.x/ctkappprofile.h | 3 | ||||
-rw-r--r-- | src/gtk+-2.x/ctkconfig.c | 82 | ||||
-rw-r--r-- | src/gtk+-2.x/ctkconfig.h | 5 | ||||
-rw-r--r-- | src/gtk+-2.x/ctkdisplayconfig.c | 34 | ||||
-rw-r--r-- | src/gtk+-2.x/ctkvdpau.c | 2 | ||||
-rw-r--r-- | src/version.mk | 2 |
9 files changed, 332 insertions, 97 deletions
diff --git a/src/common-utils/common-utils.c b/src/common-utils/common-utils.c index a11d996..7b18294 100644 --- a/src/common-utils/common-utils.c +++ b/src/common-utils/common-utils.c @@ -319,6 +319,19 @@ char *tilde_expansion(const char *str) } /* tilde_expansion() */ +/* + * nv_prepend_to_string_list() - add a new string to a string list, delimited + * by the given string delimiter. The original list is freed. + */ + +char *nv_prepend_to_string_list(char *list, const char *item, const char *delim) +{ + char *new_list = nvstrcat(item, list ? delim : NULL, list, NULL); + nvfree(list); + return new_list; +} + + /****************************************************************************/ /* TextRows helper functions */ /****************************************************************************/ @@ -693,3 +706,89 @@ char *nvstrchrnul(char *s, int c) } return result; } + + +/****************************************************************************/ +/* string helper functions */ +/****************************************************************************/ + +/* + * nv_trim_space() - remove any leading and trailing whitespace from a string + * and return a pointer to the modified string. The original string may be + * modified; the returned value should *NOT* be deallocated with free(), since + * it may point somewhere other than the beginning of the original string. If + * the original string was a malloc()ed buffer, that string should be stored + * separately from the returned value of nv_strip_space, and freed. + */ + +char *nv_trim_space(char *string) { + char *ret, *end; + + for (ret = string; *ret && isspace(*ret); ret++); + for (end = ret + strlen(ret); end >= ret && isspace(*end); end--) { + *end = '\0'; + } + + return ret; +} + +/* + * trim_char() - helper function to remove a character from the initial and + * final positions of a string, and optionally report how many replacements + * were made. The returned value should not be free()d (see nv_trim_space()). + */ + +static char *trim_char(char *string, char trim, int *count) { + int len, replaced = 0; + + if (!string || trim == '\0') { + return NULL; + } + + len = strlen(string); + + if (string[0] == trim) { + string++; + replaced++; + } + + if (string[len - 1] == trim) { + string[len - 1] = '\0'; + replaced++; + } + + if (count) { + *count = replaced; + } + + return string; +} + +/* + * nv_trim_char() - remove a character from the initial and final positions of + * a string. The returned value should not be free()d (see nv_trim_space()). + */ + +char *nv_trim_char(char *string, char trim) { + return trim_char(string, trim, NULL); +} + +/* + * nv_trim_char_strict() - remove a character from the initial and final + * positions of a string. If no replacements were made, or if replacements were + * made at both positions, return the modified string. Otherwise, return NULL. + * The returned value should not be free()d (see nv_trim_space()). + */ + +char *nv_trim_char_strict(char *string, char trim) { + int count = 0; + char *trimmed; + + trimmed = trim_char(string, trim, &count); + + if (count == 0 || count == 2) { + return trimmed; + } + + return NULL; +} diff --git a/src/common-utils/common-utils.h b/src/common-utils/common-utils.h index 7e2838f..6dced25 100644 --- a/src/common-utils/common-utils.h +++ b/src/common-utils/common-utils.h @@ -70,6 +70,7 @@ char *nvasprintf(const char *fmt, ...) NV_ATTRIBUTE_PRINTF(1, 2); void nvfree(void *s); char *tilde_expansion(const char *str); +char *nv_prepend_to_string_list(char *list, const char *item, const char *delim); TextRows *nv_format_text_rows(const char *prefix, const char *str, @@ -89,6 +90,10 @@ void fmt(FILE *stream, const char *prefix, const char *fmt, ...) NV_ATTRIBUTE_PR char *fget_next_line(FILE *fp, int *eof); +char *nv_trim_space(char *string); +char *nv_trim_char(char *string, char trim); +char *nv_trim_char_strict(char *string, char trim); + /* * NV_VSNPRINTF(): macro that assigns buf using vsnprintf(). This is * correct for differing semantics of the vsnprintf() return value: diff --git a/src/gtk+-2.x/ctkappprofile.c b/src/gtk+-2.x/ctkappprofile.c index a7183ed..da4c88b 100644 --- a/src/gtk+-2.x/ctkappprofile.c +++ b/src/gtk+-2.x/ctkappprofile.c @@ -178,6 +178,7 @@ enum { typedef struct _WidgetDataItem { gchar *label; GtkWidget *widget; + guint flags; } WidgetDataItem; /* @@ -188,11 +189,14 @@ typedef struct _ToolbarItemTemplate { const gchar *icon_id; GCallback callback; gpointer user_data; + guint flags; const gchar *help_text; const gchar *extended_help_text; } ToolbarItemTemplate; +#define TOOLBAR_ITEM_GHOST_IF_NOTHING_SELECTED (1 << 0) + /* * Template used to construct tree view columns and generate help text with * populate_tree_view(). @@ -395,13 +399,29 @@ static void widget_data_list_free_full(GList *list) g_list_free(list); } +static void tree_view_cursor_changed_toolbar_item_ghost(GtkTreeView *tree_view, + gpointer user_data) +{ + GtkTreePath *path; + GtkWidget *widget = (GtkWidget *)user_data; + + gtk_tree_view_get_cursor(tree_view, &path, NULL); + if (path) { + gtk_widget_set_sensitive(widget, TRUE); + } else { + gtk_widget_set_sensitive(widget, FALSE); + } + gtk_tree_path_free(path); +} + /* Simple helper function to fill a toolbar with buttons from a table */ static void populate_toolbar(GtkToolbar *toolbar, const ToolbarItemTemplate *item, size_t num_items, GList **help_data, - GList **widget_data) + GList **widget_data, + GtkTreeView *selection_tree_view) { WidgetDataItem *widget_data_item; GtkWidget *widget; @@ -439,6 +459,16 @@ static void populate_toolbar(GtkToolbar *toolbar, widget_data_item->widget = widget; *widget_data = g_list_prepend(*widget_data, widget_data_item); } + + if (item->flags & TOOLBAR_ITEM_GHOST_IF_NOTHING_SELECTED) { + assert(selection_tree_view); + g_signal_connect(G_OBJECT(selection_tree_view), "cursor-changed", + G_CALLBACK(tree_view_cursor_changed_toolbar_item_ghost), + (gpointer)widget); + tree_view_cursor_changed_toolbar_item_ghost(selection_tree_view, + (gpointer)widget); + } + item++; } @@ -1834,6 +1864,7 @@ static ToolbarItemTemplate *get_edit_rule_dialog_toolbar_items(EditRuleDialog *d .icon_id = GTK_STOCK_SAVE, .callback = G_CALLBACK(edit_rule_dialog_save_changes), .user_data = dialog, + .flags = 0, }, { .text = "Cancel", @@ -1841,6 +1872,7 @@ static ToolbarItemTemplate *get_edit_rule_dialog_toolbar_items(EditRuleDialog *d .icon_id = GTK_STOCK_CANCEL, .callback = G_CALLBACK(edit_rule_dialog_cancel), .user_data = dialog, + .flags = 0, } }; @@ -2038,13 +2070,16 @@ static EditRuleDialog* edit_rule_dialog_new(CtkAppProfile *ctk_app_profile) edit_rule_dialog_toolbar_items, num_edit_rule_dialog_toolbar_items, &toolbar_help_items, - &toolbar_widget_items); + &toolbar_widget_items, + NULL); dialog->help_data = g_list_concat(dialog->help_data, toolbar_help_items); // Save off the "Update Rule" button for later use dialog->add_edit_rule_button = find_widget_in_widget_data_list(toolbar_widget_items, UPDATE_RULE_LABEL); + widget_data_list_free_full(toolbar_widget_items); + free(edit_rule_dialog_toolbar_items); gtk_container_add(GTK_CONTAINER(alignment), toolbar); @@ -2377,6 +2412,7 @@ static void get_profile_dialog_toolbar_items(EditProfileDialog *dialog, .icon_id = GTK_STOCK_ADD, .callback = G_CALLBACK(edit_profile_dialog_add_setting), .user_data = dialog, + .flags = 0, }, { .text = "Delete Setting", @@ -2386,6 +2422,7 @@ static void get_profile_dialog_toolbar_items(EditProfileDialog *dialog, .icon_id = GTK_STOCK_REMOVE, .callback = G_CALLBACK(edit_profile_dialog_delete_setting), .user_data = dialog, + .flags = TOOLBAR_ITEM_GHOST_IF_NOTHING_SELECTED }, { .text = "Edit Setting", @@ -2395,6 +2432,7 @@ static void get_profile_dialog_toolbar_items(EditProfileDialog *dialog, .icon_id = GTK_STOCK_PREFERENCES, .callback = G_CALLBACK(edit_profile_dialog_edit_setting), .user_data = dialog, + .flags = TOOLBAR_ITEM_GHOST_IF_NOTHING_SELECTED }, }; @@ -2405,6 +2443,7 @@ static void get_profile_dialog_toolbar_items(EditProfileDialog *dialog, .icon_id = GTK_STOCK_SAVE, .callback = G_CALLBACK(edit_profile_dialog_save_changes), .user_data = dialog, + .flags = 0, }, { .text = "Cancel", @@ -2412,6 +2451,7 @@ static void get_profile_dialog_toolbar_items(EditProfileDialog *dialog, .icon_id = GTK_STOCK_CANCEL, .callback = G_CALLBACK(edit_profile_dialog_cancel), .user_data = dialog, + .flags = 0, } }; @@ -2424,6 +2464,26 @@ static void get_profile_dialog_toolbar_items(EditProfileDialog *dialog, *num_dialog_items = ARRAY_LEN(dialog_items); } +static void edit_profile_dialog_statusbar_message(EditProfileDialog *dialog, + const char *fmt, ...) +{ + va_list ap; + gchar *str; + + va_start(ap, fmt); + str = g_strdup_vprintf(fmt, ap); + va_end(ap); + + ctk_statusbar_message(&dialog->error_statusbar, str); + + g_free(str); +} + +static void edit_profile_dialog_statusbar_clear(EditProfileDialog *dialog) +{ + ctk_statusbar_clear(&dialog->error_statusbar); +} + static void setting_key_edited(GtkCellRendererText *renderer, gchar *path_s, @@ -2434,7 +2494,6 @@ static void setting_key_edited(GtkCellRendererText *renderer, GtkTreePath *path; GtkTreeIter iter; json_t *setting; - GString *error_string; const gchar *canonical_key; if (dialog->setting_update_canceled) { @@ -2449,19 +2508,17 @@ static void setting_key_edited(GtkCellRendererText *renderer, return; } + edit_profile_dialog_statusbar_clear(dialog); + gtk_tree_model_get(GTK_TREE_MODEL(dialog->settings_store), &iter, SETTING_LIST_STORE_COL_SETTING, &setting, -1); canonical_key = get_canonical_setting_key(new_text); if (!canonical_key) { - error_string = g_string_new(""); - g_string_printf(error_string, "The key [%s] is not recognized by nvidia-settings." - "Please check for spelling errors (keys " - "are NOT case sensitive).", new_text); - gtk_statusbar_push(GTK_STATUSBAR(dialog->error_statusbar), - dialog->setting_error_context_id, - error_string->str); - g_string_free(error_string, TRUE); + edit_profile_dialog_statusbar_message(dialog, + "The key [%s] is not recognized by nvidia-settings. " + "Please check for spelling errors (keys " + "are NOT case sensitive).", new_text); } if (canonical_key) { @@ -2511,7 +2568,7 @@ static void setting_value_edited(GtkCellRendererText *renderer, json_t *setting; json_t *value; json_error_t error; - GString *error_string; + gboolean update_value = TRUE; if (dialog->setting_update_canceled) { // Don't update anything @@ -2524,6 +2581,8 @@ static void setting_value_edited(GtkCellRendererText *renderer, return; } + edit_profile_dialog_statusbar_clear(dialog); + gtk_tree_model_get(GTK_TREE_MODEL(dialog->settings_store), &iter, SETTING_LIST_STORE_COL_SETTING, &setting, -1); @@ -2531,26 +2590,23 @@ static void setting_value_edited(GtkCellRendererText *renderer, value = json_loads(new_text_in_json, JSON_DECODE_ANY, &error); if (!value) { - error_string = g_string_new(""); - g_string_printf(error_string, "The value [%s] was not understood by the JSON parser.", - new_text); - gtk_statusbar_push(GTK_STATUSBAR(dialog->error_statusbar), - dialog->setting_error_context_id, - error_string->str); - g_string_free(error_string, TRUE); - value = json_false(); + edit_profile_dialog_statusbar_message(dialog, + "The value [%s] was not understood by the JSON parser.", + new_text); + update_value = FALSE; } else if (!is_valid_setting_value(value, &invalid_type_str)) { - error_string = g_string_new(""); - g_string_printf(error_string, "A value of type \"%s\" is not allowed in the configuration.", - invalid_type_str); - gtk_statusbar_push(GTK_STATUSBAR(dialog->error_statusbar), - dialog->setting_error_context_id, - error_string->str); - g_string_free(error_string, TRUE); - value = json_false(); + edit_profile_dialog_statusbar_message(dialog, + "A value of type \"%s\" is not allowed in the configuration.", + invalid_type_str); + update_value = FALSE; + } + + if (update_value) { + json_object_set_new(setting, "value", value); + } else { + json_decref(value); } - json_object_set_new(setting, "value", value); free(new_text_in_json); gtk_tree_path_free(path); } @@ -2618,8 +2674,6 @@ static gboolean profile_settings_tree_view_key_press_event(GtkWidget *widget, edit_profile_dialog_delete_setting_common(dialog); propagate = TRUE; } - - gtk_statusbar_pop(GTK_STATUSBAR(dialog->error_statusbar), dialog->setting_error_context_id); } return propagate; @@ -2669,7 +2723,6 @@ static EditProfileDialog *edit_profile_dialog_new(CtkAppProfile *ctk_app_profile GtkWidget *tree_view; GtkWidget *scroll_win; GtkWidget *alignment; - GtkWidget *statusbar; GtkWidget *button; GList *toolbar_widget_items; @@ -2765,15 +2818,17 @@ static EditProfileDialog *edit_profile_dialog_new(CtkAppProfile *ctk_app_profile gtk_box_pack_start(GTK_BOX(main_vbox), container, FALSE, FALSE, 0); toolbar = gtk_toolbar_new(); + tree_view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(dialog->settings_store)); + populate_toolbar(GTK_TOOLBAR(toolbar), edit_profile_settings_toolbar_items, num_edit_profile_settings_toolbar_items, &dialog->setting_toolbar_help_data, - NULL); + NULL, + GTK_TREE_VIEW(tree_view)); gtk_box_pack_start(GTK_BOX(main_vbox), toolbar, FALSE, FALSE, 0); - tree_view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(dialog->settings_store)); populate_tree_view(GTK_TREE_VIEW(tree_view), settings_tree_view_columns, ctk_app_profile, @@ -2794,20 +2849,20 @@ static EditProfileDialog *edit_profile_dialog_new(CtkAppProfile *ctk_app_profile dialog->setting_update_canceled = FALSE; - dialog->error_statusbar = statusbar = gtk_statusbar_new(); - gtk_box_pack_start(GTK_BOX(main_vbox), statusbar, FALSE, FALSE, 0); + ctk_statusbar_init(&dialog->error_statusbar); - dialog->setting_error_context_id = - gtk_statusbar_get_context_id(GTK_STATUSBAR(statusbar), - "Profile Settings"); + gtk_box_pack_start(GTK_BOX(main_vbox), dialog->error_statusbar.widget, + FALSE, FALSE, 0); alignment = gtk_alignment_new(1.0, 0.5, 0.0, 0.0); toolbar = gtk_toolbar_new(); + populate_toolbar(GTK_TOOLBAR(toolbar), edit_profile_dialog_toolbar_items, num_edit_profile_dialog_toolbar_items, &dialog->bottom_help_data, - &toolbar_widget_items); + &toolbar_widget_items, + NULL); // Save off the "Update Profile" button for later use dialog->add_edit_profile_button = find_widget_in_widget_data_list(toolbar_widget_items, UPDATE_PROFILE_LABEL); @@ -2864,14 +2919,16 @@ static GtkWidget* create_rules_page(CtkAppProfile *ctk_app_profile) "information on adding new rules.", .icon_id = GTK_STOCK_ADD, .callback = (GCallback)add_rule_callback, - .user_data = ctk_app_profile + .user_data = ctk_app_profile, + .flags = 0, }, { .text = "Delete Rule", .help_text = "The Delete Rule button allows you to remove a highlighted rule from the list.", .icon_id = GTK_STOCK_REMOVE, .callback = (GCallback)delete_rule_callback, - .user_data = ctk_app_profile + .user_data = ctk_app_profile, + .flags = TOOLBAR_ITEM_GHOST_IF_NOTHING_SELECTED }, { .text = "Increase Rule Priority", @@ -2885,7 +2942,8 @@ static GtkWidget* create_rules_page(CtkAppProfile *ctk_app_profile) "a particular priority.", .icon_id = GTK_STOCK_GO_UP, .callback = (GCallback)increase_rule_priority_callback, - .user_data = ctk_app_profile + .user_data = ctk_app_profile, + .flags = TOOLBAR_ITEM_GHOST_IF_NOTHING_SELECTED }, { .text = "Decrease Rule Priority", @@ -2894,7 +2952,8 @@ static GtkWidget* create_rules_page(CtkAppProfile *ctk_app_profile) "take on the setting value of the highest-priority rule (lowest number) in the list.", .icon_id = GTK_STOCK_GO_DOWN, .callback = (GCallback)decrease_rule_priority_callback, - .user_data = ctk_app_profile + .user_data = ctk_app_profile, + .flags = TOOLBAR_ITEM_GHOST_IF_NOTHING_SELECTED }, { .text = "Edit Rule", @@ -2905,7 +2964,8 @@ static GtkWidget* create_rules_page(CtkAppProfile *ctk_app_profile) // available from 2.6 onwards... .icon_id = GTK_STOCK_PREFERENCES, .callback = (GCallback)edit_rule_callback, - .user_data = ctk_app_profile + .user_data = ctk_app_profile, + .flags = TOOLBAR_ITEM_GHOST_IF_NOTHING_SELECTED }, }; @@ -2957,22 +3017,24 @@ static GtkWidget* create_rules_page(CtkAppProfile *ctk_app_profile) vbox = gtk_vbox_new(FALSE, 0); - /* Create the toolbar */ + /* Create the toolbar and main tree view */ toolbar = gtk_toolbar_new(); + + model = GTK_TREE_MODEL(ctk_app_profile->apc_rule_model); + tree_view = gtk_tree_view_new_with_model(model); + populate_toolbar(GTK_TOOLBAR(toolbar), rules_toolbar_items, ARRAY_LEN(rules_toolbar_items), &ctk_app_profile->rules_help_data, - NULL); + NULL, + GTK_TREE_VIEW(tree_view)); gtk_box_pack_start(GTK_BOX(vbox), toolbar, FALSE, FALSE, 0); - /* Create the main tree view */ scroll_win = gtk_scrolled_window_new(NULL, NULL); - model = GTK_TREE_MODEL(ctk_app_profile->apc_rule_model); - tree_view = gtk_tree_view_new_with_model(model); populate_tree_view(GTK_TREE_VIEW(tree_view), rules_tree_view_columns, @@ -3250,14 +3312,16 @@ static GtkWidget* create_profiles_page(CtkAppProfile *ctk_app_profile) "information on adding new profiles.", .icon_id = GTK_STOCK_ADD, .callback = (GCallback)add_profile_callback, - .user_data = ctk_app_profile + .user_data = ctk_app_profile, + .flags = 0 }, { .text = "Delete Profile", .help_text = "The Delete Profile button allows you to remove a highlighted profile from the list.", .icon_id = GTK_STOCK_REMOVE, .callback = (GCallback)delete_profile_callback, - .user_data = ctk_app_profile + .user_data = ctk_app_profile, + .flags = TOOLBAR_ITEM_GHOST_IF_NOTHING_SELECTED }, { .text = "Edit Profile", @@ -3268,7 +3332,8 @@ static GtkWidget* create_profiles_page(CtkAppProfile *ctk_app_profile) // available from 2.6 onwards... .icon_id = GTK_STOCK_PREFERENCES, .callback = (GCallback)edit_profile_callback, - .user_data = ctk_app_profile + .user_data = ctk_app_profile, + .flags = TOOLBAR_ITEM_GHOST_IF_NOTHING_SELECTED }, }; @@ -3303,22 +3368,23 @@ static GtkWidget* create_profiles_page(CtkAppProfile *ctk_app_profile) vbox = gtk_vbox_new(FALSE, 0); - /* Create the toolbar */ + /* Create the toolbar and main tree view */ toolbar = gtk_toolbar_new(); + + model = GTK_TREE_MODEL(ctk_app_profile->apc_profile_model); + tree_view = gtk_tree_view_new_with_model(model); + populate_toolbar(GTK_TOOLBAR(toolbar), profiles_toolbar_items, ARRAY_LEN(profiles_toolbar_items), &ctk_app_profile->profiles_help_data, - NULL); + NULL, + GTK_TREE_VIEW(tree_view)); gtk_box_pack_start(GTK_BOX(vbox), toolbar, FALSE, FALSE, 0); - /* Create the main tree view */ scroll_win = gtk_scrolled_window_new(NULL, NULL); - model = GTK_TREE_MODEL(ctk_app_profile->apc_profile_model); - tree_view = gtk_tree_view_new_with_model(model); - populate_tree_view(GTK_TREE_VIEW(tree_view), profiles_tree_view_columns, ctk_app_profile, @@ -3480,7 +3546,8 @@ static ToolbarItemTemplate *get_save_reload_toolbar_items(CtkAppProfile *ctk_app "should make backup copies of the original files before overwriting existing files.", .icon_id = GTK_STOCK_SAVE, .callback = (GCallback)save_changes_callback, - .user_data = ctk_app_profile + .user_data = ctk_app_profile, + .flags = 0, }, { .text = "Reload", @@ -3490,7 +3557,8 @@ static ToolbarItemTemplate *get_save_reload_toolbar_items(CtkAppProfile *ctk_app "display a dialog box to warn you before attempting to reload.", .icon_id = GTK_STOCK_REFRESH, .callback = (GCallback)reload_callback, - .user_data = ctk_app_profile + .user_data = ctk_app_profile, + .flags = 0, } }; @@ -3588,6 +3656,7 @@ static ToolbarItemTemplate *get_save_app_profile_changes_toolbar_items(SaveAppPr .icon_id = GTK_STOCK_SAVE, .callback = G_CALLBACK(save_app_profile_changes_dialog_save_changes), .user_data = dialog, + .flags = 0, }, { .text = "Cancel", @@ -3595,6 +3664,7 @@ static ToolbarItemTemplate *get_save_app_profile_changes_toolbar_items(SaveAppPr .icon_id = GTK_STOCK_CANCEL, .callback = G_CALLBACK(save_app_profile_changes_dialog_cancel), .user_data = dialog, + .flags = 0, } }; @@ -3792,8 +3862,7 @@ static SaveAppProfileChangesDialog *save_app_profile_changes_dialog_new(CtkAppPr populate_toolbar(GTK_TOOLBAR(toolbar), toolbar_items, num_toolbar_items, - NULL, - NULL); + NULL, NULL, NULL); free(toolbar_items); gtk_container_add(GTK_CONTAINER(alignment), toolbar); @@ -4139,7 +4208,7 @@ GtkWidget* ctk_app_profile_new(CtkConfig *ctk_config) save_reload_toolbar_items, num_save_reload_toolbar_items, &ctk_app_profile->save_reload_help_data, - NULL); + NULL, NULL); free(save_reload_toolbar_items); gtk_container_add(GTK_CONTAINER(alignment), toolbar); diff --git a/src/gtk+-2.x/ctkappprofile.h b/src/gtk+-2.x/ctkappprofile.h index add8118..5a34f1d 100644 --- a/src/gtk+-2.x/ctkappprofile.h +++ b/src/gtk+-2.x/ctkappprofile.h @@ -114,8 +114,7 @@ typedef struct _EditProfileDialog { // the model. gboolean setting_update_canceled; - GtkWidget *error_statusbar; - guint setting_error_context_id; + CtkStatusBar error_statusbar; // Data for constructing the help text for this dialog GList *top_help_data; diff --git a/src/gtk+-2.x/ctkconfig.c b/src/gtk+-2.x/ctkconfig.c index 7293f9a..921b60b 100644 --- a/src/gtk+-2.x/ctkconfig.c +++ b/src/gtk+-2.x/ctkconfig.c @@ -138,6 +138,23 @@ static void ctk_config_class_init(CtkConfigClass *ctk_config_class) G_TYPE_NONE, 0); } +void ctk_statusbar_init(CtkStatusBar *status_bar) +{ + + status_bar->widget = gtk_statusbar_new(); + status_bar->prev_message_id = 0; + status_bar->enabled = TRUE; + + gtk_statusbar_set_has_resize_grip + (GTK_STATUSBAR(status_bar->widget), FALSE); + + /* XXX force the status bar window to be vertically centered */ + + gtk_misc_set_alignment + (GTK_MISC(GTK_STATUSBAR(status_bar->widget)->label), + 0.0, 0.5); +} + GtkWidget* ctk_config_new(ConfigProperties *conf, CtrlHandles *pCtrlHandles) { gint i; @@ -207,21 +224,17 @@ GtkWidget* ctk_config_new(ConfigProperties *conf, CtrlHandles *pCtrlHandles) gtk_box_set_spacing(GTK_BOX(ctk_config), 10); - /* initialize the statusbar widget */ - ctk_config->status_bar.widget = gtk_statusbar_new(); - ctk_config->status_bar.prev_message_id = 0; - ctk_config->status_bar.enabled = TRUE; - - gtk_statusbar_set_has_resize_grip - (GTK_STATUSBAR(ctk_config->status_bar.widget), FALSE); + /* initialize the statusbar widget */ + ctk_statusbar_init(&ctk_config->status_bar); - /* XXX force the status bar window to be vertially centered */ + /* XXX force the status bar window to be vertically centered */ gtk_misc_set_alignment (GTK_MISC(GTK_STATUSBAR(ctk_config->status_bar.widget)->label), 0.0, 0.5); + /* initialize the tooltips widget */ ctk_config->tooltips.object = gtk_tooltips_new(); @@ -353,36 +366,61 @@ static void save_rc_clicked(GtkWidget *widget, gpointer user_data) ctk_window->attribute_list, ctk_config->conf); } +void ctk_statusbar_clear(CtkStatusBar *status_bar) +{ + if ((!status_bar->enabled) || + (!status_bar->widget)) { + return; + } + + if (status_bar->prev_message_id) { + gtk_statusbar_remove(GTK_STATUSBAR(status_bar->widget), + 1, status_bar->prev_message_id); + } +} + +void ctk_statusbar_message(CtkStatusBar *status_bar, + const gchar *str) +{ + + if ((!status_bar->enabled) || + (!status_bar->widget)) { + return; + } + + if (status_bar->prev_message_id) { + gtk_statusbar_remove(GTK_STATUSBAR(status_bar->widget), + 1, status_bar->prev_message_id); + } + + status_bar->prev_message_id = + gtk_statusbar_push + (GTK_STATUSBAR(status_bar->widget), 1, str); + +} /* ctk_config_statusbar_message() */ -void ctk_config_statusbar_message(CtkConfig *ctk_config, const char *fmt, ...) +void ctk_config_statusbar_message(CtkConfig *ctk_config, + const char *fmt, + ...) { va_list ap; gchar *str; if ((!ctk_config) || - (!ctk_config->status_bar.enabled) || - (!ctk_config->status_bar.widget) || (!(ctk_config->conf->booleans & CONFIG_PROPERTIES_DISPLAY_STATUS_BAR))) { return; } - if (ctk_config->status_bar.prev_message_id) { - gtk_statusbar_remove(GTK_STATUSBAR(ctk_config->status_bar.widget), - 1, ctk_config->status_bar.prev_message_id); - } - va_start(ap, fmt); str = g_strdup_vprintf(fmt, ap); va_end(ap); - - ctk_config->status_bar.prev_message_id = - gtk_statusbar_push - (GTK_STATUSBAR(ctk_config->status_bar.widget), 1, str); + + ctk_statusbar_message(&ctk_config->status_bar, + str); g_free(str); - -} /* ctk_config_statusbar_message() */ +} diff --git a/src/gtk+-2.x/ctkconfig.h b/src/gtk+-2.x/ctkconfig.h index b3bf286..ab6a352 100644 --- a/src/gtk+-2.x/ctkconfig.h +++ b/src/gtk+-2.x/ctkconfig.h @@ -115,6 +115,11 @@ void ctk_config_set_tooltip_and_add_help_data(CtkConfig *config, const gchar *help_text, const gchar *extended_help_text); +// Helper functions for other components which use CtkStatusBar +void ctk_statusbar_init(CtkStatusBar *status_bar); +void ctk_statusbar_message(CtkStatusBar *status_bar, const gchar *str); +void ctk_statusbar_clear(CtkStatusBar *status_bar); + G_END_DECLS #endif /* __CTK_CONFIG_H__ */ diff --git a/src/gtk+-2.x/ctkdisplayconfig.c b/src/gtk+-2.x/ctkdisplayconfig.c index b9797f5..bd81ab8 100644 --- a/src/gtk+-2.x/ctkdisplayconfig.c +++ b/src/gtk+-2.x/ctkdisplayconfig.c @@ -191,7 +191,9 @@ static const char * __dpy_configuration_mnu_help = static const char * __dpy_resolution_mnu_help = "The Resolution drop-down allows you to select a desired resolution " -"for the currently selected display device."; +"for the currently selected display device. The 'scaled' qualifier indicates " +"an aspect-scaled common resolution simulated through a MetaMode ViewPort " +"configuration."; static const char * __dpy_refresh_mnu_help = "The Refresh drop-down allows you to select a desired refresh rate " @@ -5519,17 +5521,35 @@ static void do_configure_display_for_xscreen(CtkDisplayConfig *ctk_object, } - /* Translate mode positional relationships to screen relationships */ + /* Set the position of all the new screens to the position of the displays + * for the current mode. + */ for (display = gpu->displays; display; display = display->next_on_gpu) { + nvModePtr cur_mode; if (!display->screen) continue; + cur_mode = display->cur_mode; + if (!cur_mode) { + continue; + } + + /* Translate the positional relationship of the current mode from + * the display to its screen. + */ + if (cur_mode->relative_to && + (cur_mode->relative_to->gpu == cur_mode->display->gpu)) { + display->screen->position_type = cur_mode->position_type; + display->screen->relative_to = cur_mode->relative_to->screen; + } + + /* Position the modes of the display to be where the current mode is, + * and to use absolute positioning since it should now be the only + * display in the X screen. + */ for (mode = display->modes; mode; mode = mode->next) { - if (mode->relative_to && - (mode->relative_to->gpu == mode->display->gpu)) { - display->screen->position_type = mode->position_type; - display->screen->relative_to = mode->relative_to->screen; - } + mode->pan.x = cur_mode->pan.x; + mode->pan.y = cur_mode->pan.y; mode->position_type = CONF_ADJ_ABSOLUTE; mode->relative_to = NULL; } diff --git a/src/gtk+-2.x/ctkvdpau.c b/src/gtk+-2.x/ctkvdpau.c index 8a834e8..ac4c388 100644 --- a/src/gtk+-2.x/ctkvdpau.c +++ b/src/gtk+-2.x/ctkvdpau.c @@ -1429,7 +1429,7 @@ GtkWidget* ctk_vdpau_new(NvCtrlAttributeHandle *handle, gtk_box_pack_start(GTK_BOX(ctk_vdpau), banner, FALSE, FALSE, 0); /* open VDPAU library */ - vdpau_handle = dlopen("libvdpau.so", RTLD_NOW); + vdpau_handle = dlopen("libvdpau.so.1", RTLD_NOW); if (!vdpau_handle) { goto fail; } diff --git a/src/version.mk b/src/version.mk index 69efa2d..8e97966 100644 --- a/src/version.mk +++ b/src/version.mk @@ -1 +1 @@ -NVIDIA_VERSION = 319.12 +NVIDIA_VERSION = 319.17 |