diff --git a/src/bin/e_randr.h b/src/bin/e_randr.h index 59e92a077..a952e462a 100644 --- a/src/bin/e_randr.h +++ b/src/bin/e_randr.h @@ -93,13 +93,13 @@ struct _E_Randr_Output_Info struct _E_Randr_Screen_Info_11 { - //List of Ecore_X_Randr_Screen_Size_MM* - Eina_List *sizes; + Ecore_X_Randr_Screen_Size_MM *sizes; + int nsizes; int csize_index; Ecore_X_Randr_Orientation corientation; Ecore_X_Randr_Orientation orientations; - //List of Ecore_X_Randr_Refresh_Rate* - Eina_List *rates; + Ecore_X_Randr_Refresh_Rate **rates; + int *nrates; // size is nsizes Ecore_X_Randr_Refresh_Rate current_rate; }; diff --git a/src/bin/e_randr_11.c b/src/bin/e_randr_11.c index 3f9fcafab..df5e5a654 100644 --- a/src/bin/e_randr_11.c +++ b/src/bin/e_randr_11.c @@ -13,8 +13,7 @@ _11_screen_info_new(void) E_Randr_Screen_Info_11 *randr_info_11 = NULL; Ecore_X_Randr_Screen_Size_MM *sizes = NULL; Ecore_X_Randr_Refresh_Rate *rates = NULL; - Eina_List *rates_list; - int i, j, nsizes, nrates; + int i, nsizes; EINA_SAFETY_ON_TRUE_RETURN_VAL(E_RANDR_11_NO, NULL); @@ -29,33 +28,22 @@ _11_screen_info_new(void) if (!(sizes = ecore_x_randr_screen_primary_output_sizes_get(e_randr_screen_info.root, &nsizes))) goto _info_11_new_fail; - for (i = 0; i < nsizes; i++) - if (!(randr_info_11->sizes = eina_list_append(randr_info_11->sizes, &sizes[i]))) - goto _info_11_new_fail_sizes; + randr_info_11->sizes = sizes, randr_info_11->nsizes = nsizes; ecore_x_randr_screen_primary_output_current_size_get(e_randr_screen_info.root, NULL, NULL, NULL, NULL, &(randr_info_11->csize_index)); randr_info_11->corientation = ecore_x_randr_screen_primary_output_orientation_get(e_randr_screen_info.root); randr_info_11->orientations = ecore_x_randr_screen_primary_output_orientations_get(e_randr_screen_info.root); + randr_info_11->rates = malloc(sizeof(Ecore_X_Randr_Refresh_Rate*) * nsizes); + randr_info_11->nrates = malloc(sizeof(int) * nsizes); for (i = 0; i < nsizes; i++) { - rates_list = NULL; - if (!(rates = ecore_x_randr_screen_primary_output_refresh_rates_get(e_randr_screen_info.root, i, &nrates))) + if (!(rates = ecore_x_randr_screen_primary_output_refresh_rates_get(e_randr_screen_info.root, i, &randr_info_11->nrates[i]))) return EINA_FALSE; - for (j = 0; j < nrates; j++) - if (!(rates_list = eina_list_append(rates_list, &rates[j]))) - goto _info_11_new_fail_rates_list; - if (!(randr_info_11->rates = eina_list_append(randr_info_11->rates, rates_list))) - goto _info_11_new_fail_rates; + randr_info_11->rates[i] = rates; } randr_info_11->current_rate = ecore_x_randr_screen_primary_output_current_refresh_rate_get(e_randr_screen_info.root); return randr_info_11; -_info_11_new_fail_rates_list: - eina_list_free(rates_list); -_info_11_new_fail_rates: - free(rates); -_info_11_new_fail_sizes: - free(sizes); _info_11_new_fail: free(randr_info_11); return NULL; @@ -68,23 +56,14 @@ _info_11_new_fail: void _11_screen_info_free(E_Randr_Screen_Info_11 *screen_info) { + int x; + EINA_SAFETY_ON_NULL_RETURN(screen_info); - if (screen_info->sizes) - { - free(eina_list_nth(screen_info->sizes, 0)); - eina_list_free(screen_info->sizes); - screen_info->sizes = NULL; - } - if (screen_info->rates) - { - /* this may be leaking, but at least it will be valid */ - eina_list_free(eina_list_nth(screen_info->rates, 0)); - eina_list_free(screen_info->rates); - screen_info->rates = NULL; - } + for (x = 0; x < screen_info->nsizes; x++) + free(screen_info->rates[x]); + free(screen_info->sizes); free(screen_info); - screen_info = NULL; } /***************************************************************** diff --git a/src/bin/e_randr_11_serialization.c b/src/bin/e_randr_11_serialization.c index 8b32f77cd..f6a9f5bff 100644 --- a/src/bin/e_randr_11_serialization.c +++ b/src/bin/e_randr_11_serialization.c @@ -22,7 +22,9 @@ _serialized_setup_11_new(void) if (e_randr_screen_info.randr_version == ECORE_X_RANDR_1_1) { - if (!(size = (Ecore_X_Randr_Screen_Size_MM *)eina_list_data_get(eina_list_nth(e_randr_screen_info.rrvd_info.randr_info_11->sizes, e_randr_screen_info.rrvd_info.randr_info_11->csize_index)))) goto _serialized_setup_11_new_failed_free_ss; + if (e_randr_screen_info.rrvd_info.randr_info_11->csize_index >= e_randr_screen_info.rrvd_info.randr_info_11->nsizes) goto _serialized_setup_11_new_failed_free_ss; + size = e_randr_screen_info.rrvd_info.randr_info_11->sizes + e_randr_screen_info.rrvd_info.randr_info_11->csize_index; + if (!size) goto _serialized_setup_11_new_failed_free_ss;; rate = e_randr_screen_info.rrvd_info.randr_info_11->current_rate; ori = e_randr_screen_info.rrvd_info.randr_info_11->corientation; ss->size.width = size->width; @@ -94,8 +96,7 @@ e_randr_11_serialized_setup_free(E_Randr_Serialized_Setup_11 *ss_11) Eina_Bool _11_try_restore_configuration(void) { - Ecore_X_Randr_Screen_Size_MM *stored_size, *size, *sizes; - Eina_List *iter; + Ecore_X_Randr_Screen_Size_MM *stored_size, *sizes; int i = 0, nsizes; #define SIZE_EQUAL(size) \ @@ -108,9 +109,10 @@ _11_try_restore_configuration(void) stored_size = &e_config->randr_serialized_setup->serialized_setup_11->size; if (e_randr_screen_info.randr_version == ECORE_X_RANDR_1_1) { - EINA_LIST_FOREACH(e_randr_screen_info.rrvd_info.randr_info_11->sizes, iter, size) + int x; + for (x = 0; x < e_randr_screen_info.rrvd_info.randr_info_11->nsizes; x++) { - if (SIZE_EQUAL(*size)) + if (SIZE_EQUAL(e_randr_screen_info.rrvd_info.randr_info_11->sizes[x])) { return ecore_x_randr_screen_primary_output_size_set(e_randr_screen_info.root, i); }