[WM_ROT] Fixed floating mode window rotation bug that window doesn't send ROTATION_DO...
[platform/core/uifw/e17.git] / src / bin / e_randr_11_serialization.c
1 #include "e_randr_private.h"
2 #include "e_randr.h"
3
4 /**********************************************************************
5  *
6  * Storage/Restorage of setups
7  *
8  **********************************************************************
9  */
10
11 //New helper functions
12
13 E_Randr_Serialized_Setup_11 *
14 _serialized_setup_11_new(void)
15 {
16    E_Randr_Serialized_Setup_11 *ss;
17    Ecore_X_Randr_Screen_Size_MM *size;
18    Ecore_X_Randr_Orientation ori = ECORE_X_RANDR_ORIENTATION_ROT_0;
19    Ecore_X_Randr_Refresh_Rate rate = 0;
20
21    ss = malloc(sizeof(*ss));
22
23    if (e_randr_screen_info.randr_version == ECORE_X_RANDR_1_1)
24      {
25         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;
26         size = e_randr_screen_info.rrvd_info.randr_info_11->sizes + e_randr_screen_info.rrvd_info.randr_info_11->csize_index;
27         if (!size) goto _serialized_setup_11_new_failed_free_ss;;
28         rate = e_randr_screen_info.rrvd_info.randr_info_11->current_rate;
29         ori = e_randr_screen_info.rrvd_info.randr_info_11->corientation;
30         ss->size.width = size->width;
31         ss->size.width_mm = size->width_mm;
32         ss->size.height = size->height;
33         ss->size.height_mm = size->height_mm;
34      }
35    else if (e_randr_screen_info.randr_version > ECORE_X_RANDR_1_1)
36      {
37         ecore_x_randr_screen_primary_output_current_size_get(e_randr_screen_info.root, &ss->size.width, &ss->size.height, &ss->size.width_mm, &ss->size.height_mm, NULL);
38         rate = ecore_x_randr_screen_primary_output_current_refresh_rate_get(e_randr_screen_info.root);
39         ori = ecore_x_randr_screen_primary_output_orientation_get(e_randr_screen_info.root);
40      }
41
42    ss->refresh_rate = rate;
43    ss->orientation = ori;
44
45    return ss;
46
47 _serialized_setup_11_new_failed_free_ss:
48    free(ss);
49    return NULL;
50 }
51
52 //Update/value set helper functions
53 E_Randr_Serialized_Setup_11 *
54 _serialized_setup_11_update(E_Randr_Serialized_Setup_11 *ss_11)
55 {
56    if (ss_11)
57      e_randr_11_serialized_setup_free(ss_11);
58
59    ss_11 = _serialized_setup_11_new();
60
61    return ss_11;
62 }
63
64 void
65 _11_store_configuration(E_Randr_Configuration_Store_Modifier modifier __UNUSED__)
66 {
67    if (!e_config->randr_serialized_setup)
68      e_config->randr_serialized_setup = e_randr_serialized_setup_new();
69
70    if (e_config->randr_serialized_setup->serialized_setup_11)
71      e_config->randr_serialized_setup->serialized_setup_11 = _serialized_setup_11_update(e_config->randr_serialized_setup->serialized_setup_11);
72    else
73      e_config->randr_serialized_setup->serialized_setup_11 = _serialized_setup_11_new();
74 }
75
76
77 EAPI void e_randr_11_store_configuration(E_Randr_Configuration_Store_Modifier modifier __UNUSED__)
78 {
79    _11_store_configuration(modifier);
80    e_config_save_queue();
81 }
82
83 //Free helper functions
84 void
85 _e_randr_serialized_setup_11_free(E_Randr_Serialized_Setup_11 *ss11)
86 {
87    free(ss11);
88 }
89
90 EINTERN void
91 e_randr_11_serialized_setup_free(E_Randr_Serialized_Setup_11 *ss_11)
92 {
93    _e_randr_serialized_setup_11_free(ss_11);
94 }
95
96 Eina_Bool
97 _11_try_restore_configuration(void)
98 {
99    Ecore_X_Randr_Screen_Size_MM *stored_size, *sizes = NULL;
100    int i = 0, nsizes;
101
102 #define SIZE_EQUAL(size) \
103    ((stored_size->width == (size).width) \
104     && (stored_size->height == (size).height) \
105     && (stored_size->width_mm == (size).width_mm) \
106     && (stored_size->height_mm == (size).height_mm))
107
108    if (!e_config->randr_serialized_setup->serialized_setup_11) return EINA_FALSE;
109    stored_size = &e_config->randr_serialized_setup->serialized_setup_11->size;
110    if (e_randr_screen_info.randr_version == ECORE_X_RANDR_1_1)
111      {
112         int x;
113         for (x = 0; x < e_randr_screen_info.rrvd_info.randr_info_11->nsizes; x++)
114           {
115              if (SIZE_EQUAL(e_randr_screen_info.rrvd_info.randr_info_11->sizes[x]))
116                {
117                   return ecore_x_randr_screen_primary_output_size_set(e_randr_screen_info.root, i);
118                }
119              i++;
120           }
121      }
122    else if (e_randr_screen_info.randr_version > ECORE_X_RANDR_1_1)
123      {
124         sizes = ecore_x_randr_screen_primary_output_sizes_get(e_randr_screen_info.root, &nsizes);
125         for (i = 0; i < nsizes; i++)
126           {
127              if (SIZE_EQUAL(sizes[i]))
128                {
129                   free(sizes);
130                   return ecore_x_randr_screen_primary_output_size_set(e_randr_screen_info.root, i);
131                }
132           }
133      }
134 #undef SIZE_EQUAL
135
136    if (sizes) free(sizes);
137
138    return EINA_FALSE;
139 }