princeamd pushed a commit to branch enlightenment-0.17.

commit 13a4aed496f957b97b537e11c81ba411427891ea
Author: Christopher Michael <[email protected]>
Date:   Tue Feb 19 10:55:56 2013 +0000

    Backport: 31b98fe :: Add a list of modes to smart_data structure. When we 
set the output, fill in the modes list Add code to sort modes list.
    
    Signed-off-by: Christopher Michael <[email protected]>
    
    SVN revision: 84133
    Signed-off-by: Deon Thomas <[email protected]>
---
 src/modules/conf_randr/e_smart_monitor.c | 74 ++++++++++++++++++++++++++++++++
 1 file changed, 74 insertions(+)

diff --git a/src/modules/conf_randr/e_smart_monitor.c 
b/src/modules/conf_randr/e_smart_monitor.c
index ed79bde..55185ca 100644
--- a/src/modules/conf_randr/e_smart_monitor.c
+++ b/src/modules/conf_randr/e_smart_monitor.c
@@ -18,6 +18,9 @@ struct _E_Smart_Data
    /* output config */
    E_Randr_Output_Config *output;
 
+   /* list of modes */
+   Eina_List *modes;
+
    /* visibility flag */
    Eina_Bool visible : 1;
 }
@@ -32,6 +35,9 @@ static void _e_smart_hide(Evas_Object *obj);
 static void _e_smart_clip_set(Evas_Object *obj, Evas_Object *clip);
 static void _e_smart_clip_unset(Evas_Object *obj);
 
+static void _e_smart_monitor_modes_fill(E_Smart_Data *sd);
+static int _e_smart_monitor_modes_sort(const void *data1, const void *data2);
+
 /* external functions exposed by this widget */
 Evas_Object *
 e_smart_monitor_add(Evas *evas)
@@ -77,6 +83,9 @@ e_smart_monitor_output_set(Evas_Object *obj, 
E_Randr_Output_Config *output)
 
    /* set the output config */
    sd->output = output;
+
+   /* since we now have the output, let's be preemptive and fill in modes */
+   _e_smart_monitor_modes_fill(sd);
 }
 
 /* local functions */
@@ -99,10 +108,15 @@ static void
 _e_smart_del(Evas_Object *obj)
 {
    E_Smart_Data *sd;
+   Ecore_X_Randr_Mode_Info *mode;
 
    /* try to get the objects smart data */
    if (!(sd = evas_object_smart_data_get(obj))) return;
 
+   /* free the list of modes */
+   EINA_LIST_FREE(sd->modes, mode)
+     ecore_x_randr_mode_info_free(mode);
+
    /* try to free the allocated structure */
    E_FREE(sd);
 
@@ -187,3 +201,63 @@ _e_smart_clip_unset(Evas_Object *obj)
    /* try to get the objects smart data */
    if (!(sd = evas_object_smart_data_get(obj))) return;
 }
+
+static void 
+_e_smart_monitor_modes_fill(E_Smart_Data *sd)
+{
+   Ecore_X_Window root = 0;
+   Ecore_X_Randr_Mode *modes;
+   int num = 0, i = 0;
+
+   /* safety check */
+   if (!sd) return;
+
+   /* try to get the root window */
+   root = ecore_x_window_root_first_get();
+
+   /* try to get the modes for this output from ecore_x_randr */
+   modes = ecore_x_randr_output_modes_get(root, sd->output->xid, &num, NULL);
+   if (!modes) return;
+
+   /* loop the returned modes */
+   for (i = 0; i < num; i++)
+     {
+        Ecore_X_Randr_Mode_Info *mode;
+
+        /* try to get the mode info */
+        if (!(mode = ecore_x_randr_mode_info_get(root, modes[i])))
+          continue;
+
+        /* append the mode info to our list of modes */
+        sd->modes = eina_list_append(sd->modes, mode);
+     }
+
+   /* free any memory allocated from ecore_x_randr */
+   free(modes);
+
+   /* sort the list of modes (smallest to largest) */
+   if (sd->modes)
+     sd->modes = eina_list_sort(sd->modes, 0, _e_smart_monitor_modes_sort);
+}
+
+static int 
+_e_smart_monitor_modes_sort(const void *data1, const void *data2)
+{
+   const Ecore_X_Randr_Mode_Info *m1, *m2 = NULL;
+
+   if (!(m1 = data1)) return 1;
+   if (!(m2 = data2)) return -1;
+
+   /* second one compares to previous to determine position */
+   if (m2->width < m1->width) return 1;
+   if (m2->width > m1->width) return -1;
+
+   /* width are same, compare heights */
+   if ((m2->width == m1->width))
+     {
+        if (m2->height < m1->height) return 1;
+        if (m2->height > m1->height) return -1;
+     }
+
+   return 1;
+}

-- 

------------------------------------------------------------------------------
This SF.net email is sponsored by Windows:

Build for Windows Store.

http://p.sf.net/sfu/windows-dev2dev

Reply via email to