~ubuntu-branches/ubuntu/precise/nvidia-settings/precise

« back to all changes in this revision

Viewing changes to src/gtk+-2.x/ctkdisplayconfig.c

  • Committer: Bazaar Package Importer
  • Author(s): Alberto Milone
  • Date: 2010-06-27 18:59:46 UTC
  • mfrom: (1.1.11 upstream)
  • Revision ID: james.westby@ubuntu.com-20100627185946-zpgnp08qs5do500z
Tags: 256.35-0ubuntu1
* New upstream release:
  - Fixed a bug that caused nvidia-settings to crash when rendering
    its thermal gauge widget if the range of valid values for the
    thermal sensor was empty.
  - Improved Thermal Settings reporting in nvidia-settings to
    accurately reflect hardware configurations with multiple thermal
    sensors.
* debian/docs:
  - Remove Makefile.inc.

Show diffs side-by-side

added added

removed removed

Lines of Context:
138
138
#define VALIDATE_APPLY 0
139
139
#define VALIDATE_SAVE  1
140
140
 
141
 
#define SCREEN_DEPTH_COUNT 5
142
141
 
143
142
 
144
143
/*** G L O B A L S ***********************************************************/
3069
3068
 
3070
3069
 
3071
3070
 
 
3071
/** grow_screen_depth_table() **************************************
 
3072
 *
 
3073
 * realloc the screen_depth_table, if possible.
 
3074
 *
 
3075
 **/
 
3076
 
 
3077
static gboolean grow_screen_depth_table(CtkDisplayConfig *ctk_object)
 
3078
{
 
3079
    int *tmp = realloc(ctk_object->screen_depth_table,
 
3080
                       sizeof(int) *
 
3081
                       (ctk_object->screen_depth_table_len + 1));
 
3082
    if (!tmp) {
 
3083
        return False;
 
3084
    }
 
3085
 
 
3086
    ctk_object->screen_depth_table = tmp;
 
3087
    ctk_object->screen_depth_table_len++;
 
3088
 
 
3089
    return True;
 
3090
 
 
3091
} /* grow_screen_depth_table() */
 
3092
 
 
3093
 
 
3094
 
3072
3095
/** setup_screen_depth_dropdown() ************************************
3073
3096
 *
3074
3097
 * Generates the color depth dropdown based on the currently selected
3081
3104
    GtkWidget *menu;
3082
3105
    GtkWidget *menu_item;
3083
3106
    int cur_idx;
3084
 
    int screen_depth_table_len = 0;
3085
3107
    gboolean add_depth_30_option;
3086
3108
    nvScreenPtr screen = ctk_display_layout_get_selected_screen
3087
3109
        (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout));
3088
 
    
 
3110
 
3089
3111
    if (!screen) {
3090
3112
        gtk_widget_hide(ctk_object->box_screen_depth);
3091
3113
        return;
3093
3115
    if (ctk_object->screen_depth_table) {
3094
3116
        free(ctk_object->screen_depth_table);
3095
3117
    }
3096
 
    ctk_object->screen_depth_table =
3097
 
        (char *) malloc(sizeof(char) * SCREEN_DEPTH_COUNT);
 
3118
    ctk_object->screen_depth_table = NULL;
 
3119
    ctk_object->screen_depth_table_len = 0;
3098
3120
 
3099
3121
    menu  = gtk_menu_new();
3100
3122
 
3109
3131
    }
3110
3132
 
3111
3133
    if (add_depth_30_option) {
3112
 
        menu_item = gtk_menu_item_new_with_label
3113
 
            ("1.1 Billion Colors (Depth 30) - Experimental");
3114
 
        gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item);
3115
 
        gtk_widget_show(menu_item);
3116
 
        ctk_object->screen_depth_table[screen_depth_table_len++] = 30;
3117
 
    }
3118
 
    menu_item = gtk_menu_item_new_with_label("16.7 Million Colors (Depth 24)");
3119
 
    gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item);
3120
 
    gtk_widget_show(menu_item);
3121
 
    ctk_object->screen_depth_table[screen_depth_table_len++] = 24;
3122
 
 
3123
 
    menu_item = gtk_menu_item_new_with_label("65,536 Colors (Depth 16)");
3124
 
    gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item);
3125
 
    gtk_widget_show(menu_item);
3126
 
    ctk_object->screen_depth_table[screen_depth_table_len++] = 16;
3127
 
 
3128
 
    menu_item = gtk_menu_item_new_with_label("32,768 Colors (Depth 15)");
3129
 
    gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item);
3130
 
    gtk_widget_show(menu_item);
3131
 
    ctk_object->screen_depth_table[screen_depth_table_len++] = 15;
3132
 
 
3133
 
    menu_item = gtk_menu_item_new_with_label("256 Colors (Depth 8)");
3134
 
    gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item);
3135
 
    gtk_widget_show(menu_item);
3136
 
    ctk_object->screen_depth_table[screen_depth_table_len++] = 8;
3137
 
 
3138
 
    assert(screen_depth_table_len <= SCREEN_DEPTH_COUNT);
 
3134
 
 
3135
        if (grow_screen_depth_table(ctk_object)) {
 
3136
            menu_item = gtk_menu_item_new_with_label
 
3137
                ("1.1 Billion Colors (Depth 30) - Experimental");
 
3138
            gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item);
 
3139
            gtk_widget_show(menu_item);
 
3140
 
 
3141
            ctk_object->screen_depth_table[ctk_object->screen_depth_table_len-1] = 30;
 
3142
        }
 
3143
    }
 
3144
 
 
3145
    if (grow_screen_depth_table(ctk_object)) {
 
3146
        menu_item = gtk_menu_item_new_with_label("16.7 Million Colors (Depth 24)");
 
3147
        gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item);
 
3148
        gtk_widget_show(menu_item);
 
3149
        ctk_object->screen_depth_table[ctk_object->screen_depth_table_len-1] = 24;
 
3150
    }
 
3151
 
 
3152
    if (grow_screen_depth_table(ctk_object)) {
 
3153
        menu_item = gtk_menu_item_new_with_label("65,536 Colors (Depth 16)");
 
3154
        gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item);
 
3155
        gtk_widget_show(menu_item);
 
3156
        ctk_object->screen_depth_table[ctk_object->screen_depth_table_len-1] = 16;
 
3157
    }
 
3158
 
 
3159
    if (grow_screen_depth_table(ctk_object)) {
 
3160
        menu_item = gtk_menu_item_new_with_label("32,768 Colors (Depth 15)");
 
3161
        gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item);
 
3162
        gtk_widget_show(menu_item);
 
3163
        ctk_object->screen_depth_table[ctk_object->screen_depth_table_len-1] = 15;
 
3164
    }
 
3165
 
 
3166
    if (grow_screen_depth_table(ctk_object)) {
 
3167
        menu_item = gtk_menu_item_new_with_label("256 Colors (Depth 8)");
 
3168
        gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item);
 
3169
        gtk_widget_show(menu_item);
 
3170
        ctk_object->screen_depth_table[ctk_object->screen_depth_table_len-1] = 8;
 
3171
    }
 
3172
 
3139
3173
    g_signal_handlers_block_by_func(G_OBJECT(ctk_object->mnu_screen_depth),
3140
3174
                                    G_CALLBACK(screen_depth_changed),
3141
3175
                                    (gpointer) ctk_object);
3143
3177
    gtk_option_menu_set_menu
3144
3178
        (GTK_OPTION_MENU(ctk_object->mnu_screen_depth), menu);
3145
3179
    
3146
 
    for (cur_idx = 0; cur_idx < SCREEN_DEPTH_COUNT; cur_idx++) {
 
3180
    for (cur_idx = 0; cur_idx < ctk_object->screen_depth_table_len; cur_idx++) {
3147
3181
        if (screen->depth == ctk_object->screen_depth_table[cur_idx]) {
3148
3182
            gtk_option_menu_set_history
3149
3183
                (GTK_OPTION_MENU(ctk_object->mnu_screen_depth), cur_idx);
3453
3487
    gchar *tmp;
3454
3488
    gint page_num;
3455
3489
    GtkWidget *tab_label;
 
3490
    GParamSpec* param_spec = NULL;
3456
3491
 
3457
3492
 
3458
3493
    page_num = gtk_notebook_page_num(GTK_NOTEBOOK(ctk_object->notebook),
3476
3511
 
3477
3512
    /* Setup the screen number */
3478
3513
    tmp = g_strdup_printf("%d", screen->scrnum);
3479
 
    g_object_set(gtk_widget_get_settings(ctk_object->txt_screen_num),
3480
 
                 "gtk-label-select-on-focus", FALSE, NULL);
 
3514
 
 
3515
    param_spec = g_object_class_find_property
 
3516
        (G_OBJECT_GET_CLASS(gtk_widget_get_settings(ctk_object->txt_screen_num)),
 
3517
         "gtk-label-select-on-focus");
 
3518
 
 
3519
    if (param_spec) {
 
3520
        /*
 
3521
         * When running against versions of gtk that have the
 
3522
         * "gtk-label-select-on-focus" property, set the property to FALSE for
 
3523
         * the screen label so that it isn't auto-selected when switching tabs
 
3524
         */
 
3525
        g_object_set(gtk_widget_get_settings(ctk_object->txt_screen_num),
 
3526
                     "gtk-label-select-on-focus", FALSE, NULL);
 
3527
    }
 
3528
 
3481
3529
    gtk_label_set_text(GTK_LABEL(ctk_object->txt_screen_num), tmp);
3482
3530
    g_free(tmp);
3483
3531
    
3583
3631
 
3584
3632
                /* Delete the metamode */
3585
3633
                ctk_display_layout_delete_screen_metamode
3586
 
                    (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout), screen, i);
 
3634
                    (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout), screen, i,
 
3635
                     TRUE);
3587
3636
 
3588
3637
                nv_info_msg(TAB, "Removed MetaMode %d on Screen %d (No "
3589
3638
                            "active display devices)\n", i,
3646
3695
                
3647
3696
                /* Delete the metamode */
3648
3697
                ctk_display_layout_delete_screen_metamode
3649
 
                    (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout), screen, i);
 
3698
                    (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout), screen, i,
 
3699
                     TRUE);
3650
3700
                
3651
3701
                nv_info_msg(TAB, "Removed MetaMode %d on Screen %d (Is "
3652
3702
                            "Duplicate of MetaMode %d)\n", i+1, screen->scrnum,
4213
4263
    /* Delete implicit metamodes from all screens involved */
4214
4264
    for (screen = gpu->screens; screen; screen = screen->next) {
4215
4265
        nvMetaModePtr next;
 
4266
        Bool updated = FALSE;
4216
4267
 
4217
4268
        m = 0;
4218
4269
        metamode = screen->metamodes;
4223
4274
                (metamode != screen->cur_metamode)) {
4224
4275
 
4225
4276
                ctk_display_layout_delete_screen_metamode
4226
 
                    (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout), screen, m);
 
4277
                    (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout), screen, m,
 
4278
                     FALSE);
 
4279
                updated = TRUE;
4227
4280
            } else {
4228
4281
                m++;
4229
4282
            }
4230
4283
            metamode = next;
4231
4284
        }
 
4285
 
 
4286
        /* Now that all the implicit metamodes have been deleted,
 
4287
         * we can recalculate and reselect the current mode
 
4288
         * for the screen.
 
4289
         */
 
4290
        if (updated) {
 
4291
            ctk_display_layout_set_screen_metamode
 
4292
                (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout),
 
4293
                 screen, screen->cur_metamode_idx);
 
4294
        }
4232
4295
    }
4233
4296
 
4234
4297
    /* Make all other X screens in the layout relative to the GPU's
5458
5521
 
5459
5522
    if (!screen) return;
5460
5523
 
 
5524
    if (idx >= ctk_object->screen_depth_table_len) return;
 
5525
 
5461
5526
    depth = ctk_object->screen_depth_table[idx];
5462
5527
 
5463
5528
    if (depth == 30) {
5786
5851
    
5787
5852
    ctk_display_layout_delete_screen_metamode
5788
5853
        (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout),
5789
 
         screen, screen->cur_metamode_idx);
 
5854
         screen, screen->cur_metamode_idx, TRUE);
5790
5855
 
5791
5856
    /* Update the GUI */
5792
5857
    setup_display_page(ctk_object);
5998
6063
        case GTK_RESPONSE_YES:
5999
6064
            ctk_display_layout_delete_screen_metamode
6000
6065
                (CTK_DISPLAY_LAYOUT(ctk_object->obj_layout),
6001
 
                 screen, screen->cur_metamode_idx);
 
6066
                 screen, screen->cur_metamode_idx, TRUE);
6002
6067
 
6003
6068
            nv_info_msg(TAB, "Removed MetaMode %d on Screen %d.\n",
6004
6069
                        screen->cur_metamode_idx+1,
6085
6150
static char *find_metamode_string(char *metamode_str, char *metamode_strs)
6086
6151
{
6087
6152
    char *m;
6088
 
    char *str;
 
6153
    const char *str;
6089
6154
 
6090
6155
    for (m = metamode_strs; m && strlen(m); m += strlen(m) +1) {
6091
6156
 
6092
6157
        /* Skip tokens if any */
6093
6158
        str = strstr(m, "::");
6094
6159
        if (str) {
6095
 
            str = (char *)parse_skip_whitespace(str +2);
 
6160
            str = parse_skip_whitespace(str +2);
6096
6161
        } else {
6097
6162
            str = m;
6098
6163
        }
6242
6307
 
6243
6308
static void postprocess_metamodes(nvScreenPtr screen, char *metamode_strs)
6244
6309
{
6245
 
    char *metamode_str;
6246
 
    char *str;
 
6310
    char *metamode_str, *tmp;
 
6311
    const char *str;
6247
6312
    ReturnStatus ret;
6248
6313
 
6249
6314
 
6256
6321
        str = strstr(metamode_str, "::");
6257
6322
        if (!str) continue;
6258
6323
 
6259
 
        str = (char *)parse_skip_whitespace(str +2);
6260
 
 
 
6324
        str = parse_skip_whitespace(str +2);
 
6325
        tmp = strdup(str);
 
6326
        if (!tmp) continue;
6261
6327
 
6262
6328
        /* Delete the metamode */
6263
6329
        ret = NvCtrlSetStringAttribute(screen->handle,
6264
6330
                                       NV_CTRL_STRING_DELETE_METAMODE,
6265
 
                                       str, NULL);
 
6331
                                       tmp, NULL);
6266
6332
        if (ret == NvCtrlSuccess) {
6267
6333
            nv_info_msg(TAB, "Removed > %s", str);
6268
6334
        }
 
6335
 
 
6336
        free(tmp);
6269
6337
    }
6270
6338
 
6271
6339
    /* Reorder the list of metamodes */
6286
6354
{
6287
6355
    char *metamode_strs = NULL;
6288
6356
    char *cur_metamode_str = NULL;
6289
 
    char *metamode_str;
 
6357
    const char *metamode_str;
6290
6358
    int len;
6291
6359
 
6292
6360
    int clear_apply = 0; /* Set if we should clear the apply button */
6334
6402
    /* Skip tokens */
6335
6403
    metamode_str = strstr(cur_metamode_str, "::");
6336
6404
    if (metamode_str) {
6337
 
        metamode_str = (char *)parse_skip_whitespace(metamode_str +2);
 
6405
        metamode_str = parse_skip_whitespace(metamode_str +2);
6338
6406
    } else {
6339
6407
        metamode_str = cur_metamode_str;
6340
6408
    }