princeamd pushed a commit to branch enlightenment-0.17.

commit 8958edd03dc6f63c6b787ad0ed3dd14816db4735
Author: Christopher Michael <[email protected]>
Date:   Tue Feb 19 10:56:38 2013 +0000

    Backport: 85ff779 :: Add min & max mode sizes to monitor structure. Add 
Frame & Stand to monitor structure. Add code to create/show/move/resize/hide 
the frame & stand. Change the code to use ecore_x_randr functions so that when 
running in Xephyr we get monitors that make sense. Change output_set and 
crtc_set functions to take the Ecore_X_Randr types. Set an aspect ratio on the 
frame (so it maintains during resize) Add function for telling monitor what the 
virtual size is. Add function [...]
    
    Signed-off-by: Christopher Michael <[email protected]>
    
    SVN revision: 84147
    Signed-off-by: Deon Thomas <[email protected]>
---
 src/modules/conf_randr/e_smart_monitor.c | 161 +++++++++++++++++++++++++++++--
 1 file changed, 154 insertions(+), 7 deletions(-)

diff --git a/src/modules/conf_randr/e_smart_monitor.c 
b/src/modules/conf_randr/e_smart_monitor.c
index e2f9de5..34a367c 100644
--- a/src/modules/conf_randr/e_smart_monitor.c
+++ b/src/modules/conf_randr/e_smart_monitor.c
@@ -12,14 +12,33 @@ struct _E_Smart_Data
    /* geometry */
    int x, y, w, h;
 
+   Evas_Coord vw, vh;
+
+   struct 
+     {
+        Evas_Coord mode_width, mode_height;
+     } min, max;
+
+   /* reference to the grid we are packed into */
+   Evas_Object *grid;
+
    /* test object */
+   /* Evas_Object *o_bg; */
+
+   /* base object */
    Evas_Object *o_base;
 
+   /* frame object */
+   Evas_Object *o_frame;
+
+   /* stand object */
+   Evas_Object *o_stand;
+
    /* crtc config */
-   E_Randr_Crtc_Config *crtc;
+   Ecore_X_Randr_Crtc crtc;
 
    /* output config */
-   E_Randr_Output_Config *output;
+   Ecore_X_Randr_Output output;
 
    /* list of modes */
    Eina_List *modes;
@@ -68,7 +87,7 @@ e_smart_monitor_add(Evas *evas)
 }
 
 void 
-e_smart_monitor_crtc_set(Evas_Object *obj, E_Randr_Crtc_Config *crtc)
+e_smart_monitor_crtc_set(Evas_Object *obj, Ecore_X_Randr_Crtc crtc)
 {
    E_Smart_Data *sd;
 
@@ -82,9 +101,14 @@ e_smart_monitor_crtc_set(Evas_Object *obj, 
E_Randr_Crtc_Config *crtc)
 }
 
 void 
-e_smart_monitor_output_set(Evas_Object *obj, E_Randr_Output_Config *output)
+e_smart_monitor_output_set(Evas_Object *obj, Ecore_X_Randr_Output output)
 {
    E_Smart_Data *sd;
+   Ecore_X_Randr_Mode_Info *mode;
+   Evas_Coord mw = 0, mh = 0;
+   Evas_Coord aw = 1, ah = 1;
+   unsigned char *edid = NULL;
+   unsigned long edid_length = 0;
 
    LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
@@ -96,6 +120,93 @@ e_smart_monitor_output_set(Evas_Object *obj, 
E_Randr_Output_Config *output)
 
    /* since we now have the output, let's be preemptive and fill in modes */
    _e_smart_monitor_modes_fill(sd);
+   if (!sd->modes) return;
+
+   /* get the largest mode */
+   mode = eina_list_last_data_get(sd->modes);
+   mw = mode->width;
+   mh = mode->height;
+
+   sd->max.mode_width = mw;
+   sd->max.mode_height = mh;
+
+   /* FIXME: ideally this should probably be based on the current mode */
+
+   /* get the edid for this output */
+   if ((edid = ecore_x_randr_output_edid_get(0, sd->output, &edid_length)))
+     {
+        Ecore_X_Randr_Edid_Aspect_Ratio aspect = 0;
+
+        /* get the aspect */
+        aspect = 
+          ecore_x_randr_edid_display_aspect_ratio_preferred_get(edid, 
+                                                                edid_length);
+
+        /* calculate aspect size */
+        switch (aspect)
+          {
+           case ECORE_X_RANDR_EDID_ASPECT_RATIO_4_3:
+             aw = 4;
+             ah = (3 * mh) / mw;
+             break;
+           case ECORE_X_RANDR_EDID_ASPECT_RATIO_16_9:
+             aw = 16;
+             ah = (9 * mh) / mw;
+             break;
+           case ECORE_X_RANDR_EDID_ASPECT_RATIO_16_10:
+             aw = 16;
+             ah = (10 * mh) / mw;
+             break;
+           case ECORE_X_RANDR_EDID_ASPECT_RATIO_5_4:
+             aw = 5;
+             ah = (4 * mh) / mw;
+             break;
+           case ECORE_X_RANDR_EDID_ASPECT_RATIO_15_9:
+             aw = 15;
+             ah = (9 * mh) / mw;
+             break;
+           default:
+             aw = mw;
+             ah = mh;
+             break;
+          }
+
+        /* set the aspect hints */
+        evas_object_size_hint_aspect_set(sd->o_frame, 
+                                         EVAS_ASPECT_CONTROL_BOTH, aw, ah);
+     }
+
+   /* set the align hints */
+   /* evas_object_size_hint_align_set(sd->o_base, 0.0, 0.0); */
+   evas_object_size_hint_align_set(sd->o_frame, 0.0, 0.0);
+
+   /* get the smallest mode */
+   mode = eina_list_nth(sd->modes, 0);
+   sd->min.mode_width = mode->width;
+   sd->min.mode_height = mode->height;
+}
+
+void 
+e_smart_monitor_virtual_size_set(Evas_Object *obj, Evas_Coord vw, Evas_Coord 
vh)
+{
+   E_Smart_Data *sd;
+
+   /* try to get the objects smart data */
+   if (!(sd = evas_object_smart_data_get(obj))) return;
+
+   sd->vw = vw;
+   sd->vh = vh;
+}
+
+void 
+e_smart_monitor_grid_set(Evas_Object *obj, Evas_Object *grid)
+{
+   E_Smart_Data *sd;
+
+   /* try to get the objects smart data */
+   if (!(sd = evas_object_smart_data_get(obj))) return;
+
+   sd->grid = grid;
 }
 
 /* smart functions */
@@ -112,8 +223,28 @@ _e_smart_add(Evas_Object *obj)
    /* grab the canvas */
    sd->evas = evas_object_evas_get(obj);
 
-   sd->o_base = evas_object_rectangle_add(sd->evas);
-   evas_object_color_set(sd->o_base, 255, 0, 0, 255);
+   /* create the bg test object */
+   /* sd->o_bg = evas_object_rectangle_add(sd->evas); */
+   /* evas_object_color_set(sd->o_bg, 255, 0, 0, 255); */
+   /* evas_object_smart_member_add(sd->o_bg, obj); */
+
+   /* create the base object */
+   sd->o_base = edje_object_add(sd->evas);
+   e_theme_edje_object_set(sd->o_base, "base/theme/widgets", 
+                           "e/conf/randr/main/monitor");
+   evas_object_smart_member_add(sd->o_base, obj);
+
+   /* create the frame object */
+   sd->o_frame = edje_object_add(sd->evas);
+   e_theme_edje_object_set(sd->o_frame, "base/theme/widgets", 
+                           "e/conf/randr/main/frame");
+   edje_object_part_swallow(sd->o_base, "e.swallow.frame", sd->o_frame);
+
+   /* create the stand */
+   sd->o_stand = edje_object_add(sd->evas);
+   e_theme_edje_object_set(sd->o_stand, "base/theme/widgets", 
+                           "e/conf/randr/main/stand");
+   edje_object_part_swallow(sd->o_base, "e.swallow.stand", sd->o_stand);
 
    /* set the objects smart data */
    evas_object_smart_data_set(obj, sd);
@@ -130,7 +261,10 @@ _e_smart_del(Evas_Object *obj)
    /* try to get the objects smart data */
    if (!(sd = evas_object_smart_data_get(obj))) return;
 
+   evas_object_del(sd->o_stand);
+   evas_object_del(sd->o_frame);
    evas_object_del(sd->o_base);
+   /* evas_object_del(sd->o_bg); */
 
    /* free the list of modes */
    EINA_LIST_FREE(sd->modes, mode)
@@ -159,6 +293,7 @@ _e_smart_move(Evas_Object *obj, Evas_Coord x, Evas_Coord y)
    sd->x = x;
    sd->y = y;
 
+   /* evas_object_move(sd->o_bg, x, y); */
    evas_object_move(sd->o_base, x, y);
 }
 
@@ -166,6 +301,7 @@ static void
 _e_smart_resize(Evas_Object *obj, Evas_Coord w, Evas_Coord h)
 {
    E_Smart_Data *sd;
+   /* Evas_Coord gx, gy, gw, gh; */
 
    LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
@@ -179,6 +315,7 @@ _e_smart_resize(Evas_Object *obj, Evas_Coord w, Evas_Coord 
h)
    sd->h = h;
 
    evas_object_resize(sd->o_base, w, h);
+   /* evas_object_resize(sd->o_bg, w, h + 30); */
 }
 
 static void 
@@ -194,7 +331,10 @@ _e_smart_show(Evas_Object *obj)
    /* if we are already visible, then nothing to do */
    if (sd->visible) return;
 
+   evas_object_show(sd->o_frame);
+   evas_object_show(sd->o_stand);
    evas_object_show(sd->o_base);
+   /* evas_object_show(sd->o_bg); */
 
    /* set visibility flag */
    sd->visible = EINA_TRUE;
@@ -213,7 +353,10 @@ _e_smart_hide(Evas_Object *obj)
    /* if we are already hidden, then nothing to do */
    if (!sd->visible) return;
 
+   evas_object_hide(sd->o_frame);
+   evas_object_hide(sd->o_stand);
    evas_object_hide(sd->o_base);
+   /* evas_object_hide(sd->o_bg); */
 
    /* set visibility flag */
    sd->visible = EINA_FALSE;
@@ -227,7 +370,9 @@ _e_smart_clip_set(Evas_Object *obj, Evas_Object *clip)
    /* try to get the objects smart data */
    if (!(sd = evas_object_smart_data_get(obj))) return;
 
+   evas_object_clip_set(sd->o_frame, clip);
    evas_object_clip_set(sd->o_base, clip);
+   /* evas_object_clip_set(sd->o_bg, clip); */
 }
 
 static void 
@@ -238,7 +383,9 @@ _e_smart_clip_unset(Evas_Object *obj)
    /* try to get the objects smart data */
    if (!(sd = evas_object_smart_data_get(obj))) return;
 
+   evas_object_clip_unset(sd->o_frame);
    evas_object_clip_unset(sd->o_base);
+   /* evas_object_clip_unset(sd->o_bg); */
 }
 
 /* local functions */
@@ -258,7 +405,7 @@ _e_smart_monitor_modes_fill(E_Smart_Data *sd)
    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);
+   modes = ecore_x_randr_output_modes_get(root, sd->output, &num, NULL);
    if (!modes) return;
 
    /* loop the returned modes */

-- 

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

Build for Windows Store.

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

Reply via email to