2011-11-05 23:41:39 -07:00
# include "e_int_config_randr.h"
# include "e_randr.h"
# include "Ecore_X.h"
# ifndef ECORE_X_RANDR_1_2
2011-11-09 07:36:05 -08:00
# define ECORE_X_RANDR_1_2 ((1 << 16) | 2)
2011-11-05 23:41:39 -07:00
# endif
# ifndef ECORE_X_RANDR_1_3
2011-11-09 07:36:05 -08:00
# define ECORE_X_RANDR_1_3 ((1 << 16) | 3)
2011-11-05 23:41:39 -07:00
# endif
# ifndef Ecore_X_Randr_Unset
2011-11-09 07:36:05 -08:00
# define Ecore_X_Randr_Unset -1
2011-11-05 23:41:39 -07:00
# endif
# define DOUBLECLICK_TIMEOUT 0.2
2011-11-09 07:36:05 -08:00
# define CRTC_THUMB_SIZE_W 300
# define CRTC_THUMB_SIZE_H 300
2011-11-05 23:41:39 -07:00
2012-02-25 02:01:23 -08:00
Eina_Bool arrangement_widget_create_data ( E_Config_Dialog_Data * e_config_runtime_info ) ;
Evas_Object * arrangement_widget_basic_create_widgets ( Evas * canvas ) ;
Eina_Bool arrangement_widget_basic_check_changed ( E_Config_Dialog * cfd , E_Config_Dialog_Data * cfdata ) ;
Eina_Bool arrangement_widget_basic_apply_data ( E_Config_Dialog * cfd , E_Config_Dialog_Data * cfdata ) ;
void arrangement_widget_free_data ( E_Config_Dialog * cfd , E_Config_Dialog_Data * cfdata ) ;
//static inline E_Config_Randr_Dialog_Output_Dialog_Data *_arrangement_widget_rep_dialog_data_new (E_Randr_Crtc_Info *crtc_info, E_Randr_Output_Info *output_info);
2012-03-12 15:38:00 -07:00
static inline Evas_Object * _arrangement_widget_suggestion_add ( Evas * evas ) ;
2012-02-25 02:01:23 -08:00
static inline void _arrangement_widget_make_suggestion ( Evas_Object * obj ) ;
static Evas_Object * _arrangement_widget_rep_add ( Evas * canvas , E_Config_Randr_Dialog_Output_Dialog_Data * output_dialog_data ) ;
2012-03-12 15:37:55 -07:00
static void _arrangement_widget_rep_del ( E_Config_Randr_Dialog_Output_Dialog_Data * output_dialog_data ) ;
2012-02-25 02:01:23 -08:00
static void _arrangement_widget_rep_mouse_down_cb ( void * data , Evas * e , Evas_Object * obj , void * event_info ) ;
static void _arrangement_widget_rep_mouse_move_cb ( void * data , Evas * e , Evas_Object * obj , void * event_info ) ;
static void _arrangement_widget_rep_mouse_up_cb ( void * data , Evas * e , Evas_Object * obj , void * event_info ) ;
static void _arrangement_widget_check_mouse_down_cb ( void * data , Evas * e , Evas_Object * obj , void * event_info ) ;
static void _arrangement_widget_update ( void ) ;
2011-11-05 23:41:39 -07:00
extern E_Config_Dialog_Data * e_config_runtime_info ;
2011-12-20 17:23:16 -08:00
extern Config * randr_dialog_config ;
2011-11-05 23:41:39 -07:00
extern char _theme_file_path [ ] ;
2011-11-09 07:36:05 -08:00
static void
2012-02-25 02:01:23 -08:00
_arrangement_widget_rep_dialog_data_fill ( E_Config_Randr_Dialog_Output_Dialog_Data * odd )
2011-11-05 23:41:39 -07:00
{
if ( ! odd ) return ;
if ( odd - > crtc )
{
//already enabled screen
odd - > previous_pos . x = odd - > crtc - > geometry . x ;
odd - > previous_pos . y = odd - > crtc - > geometry . y ;
odd - > previous_mode = odd - > crtc - > current_mode ;
}
else if ( odd - > output )
{
//disabled monitor
2011-12-14 09:37:17 -08:00
odd - > previous_mode = NULL ;
2012-02-18 08:49:17 -08:00
if ( odd - > output - > monitor )
{
//try to get a mode from the preferred list, else use default list
if ( ! ( odd - > preferred_mode = ( Ecore_X_Randr_Mode_Info * ) eina_list_data_get ( eina_list_last ( odd - > output - > monitor - > preferred_modes ) ) ) )
{
if ( odd - > output - > monitor - > modes )
odd - > preferred_mode = ( Ecore_X_Randr_Mode_Info * ) eina_list_data_get ( eina_list_last ( odd - > output - > monitor - > modes ) ) ;
}
}
else
2011-11-18 00:07:48 -08:00
{
2012-02-18 08:49:17 -08:00
odd - > preferred_mode = NULL ;
2011-11-18 00:07:48 -08:00
}
2012-02-25 02:01:30 -08:00
odd - > previous_pos . x = 0 ;
odd - > previous_pos . y = 0 ;
2011-11-05 23:41:39 -07:00
}
}
2011-12-20 17:23:16 -08:00
void
2012-02-25 02:01:23 -08:00
_arrangement_widget_update ( void )
2011-12-20 17:23:16 -08:00
{
2012-02-25 02:01:30 -08:00
static Evas_Object * area = NULL ;
E_Config_Randr_Dialog_Output_Dialog_Data * odd = NULL ;
static Eina_Rectangle default_geo ;
Eina_Rectangle geo = { . x = 0 , . y = 0 , . w = 0 , . h = 0 } ;
static char * edje_data_item = NULL ;
2011-12-20 17:23:16 -08:00
Eina_List * iter ;
2012-02-25 02:01:30 -08:00
area = e_config_runtime_info - > gui . widgets . arrangement . area ;
2011-12-20 17:23:16 -08:00
if ( ! e_config_runtime_info | | ! e_config_runtime_info - > gui . canvas | | ! e_config_runtime_info - > output_dialog_data_list | | ! area ) return ;
2012-02-25 02:01:30 -08:00
fprintf ( stderr , " CONF_RANDR: Display disconnected outputs: %s \n " , ( randr_dialog_config - > display_disconnected_outputs ? " YES " : " NO " ) ) ;
2012-02-18 08:49:17 -08:00
2012-02-25 02:01:30 -08:00
if ( ! edje_data_item )
2011-12-20 17:23:16 -08:00
{
2012-02-25 02:01:30 -08:00
if ( ! ( edje_data_item = edje_file_data_get ( _theme_file_path , " disabled_output_width " ) ) )
edje_data_item = " 1024 " ;
default_geo . w = atoi ( edje_data_item ) ;
if ( ! ( edje_data_item = edje_file_data_get ( _theme_file_path , " disabled_output_height " ) ) )
edje_data_item = " 768 " ;
default_geo . h = atoi ( edje_data_item ) ;
default_geo . x = e_randr_screen_info . rrvd_info . randr_info_12 - > max_size . width - default_geo . w ;
default_geo . y = 0 ;
2011-12-20 17:23:16 -08:00
}
2012-02-25 02:01:30 -08:00
e_layout_freeze ( area ) ;
e_layout_unpack ( area ) ;
e_layout_virtual_size_set ( area , e_randr_screen_info . rrvd_info . randr_info_12 - > max_size . width , e_randr_screen_info . rrvd_info . randr_info_12 - > max_size . height ) ;
fprintf ( stderr , " CONF_RANDR: Set virtual size of arrangement e_layout to %dx%d \n " , e_randr_screen_info . rrvd_info . randr_info_12 - > max_size . width , e_randr_screen_info . rrvd_info . randr_info_12 - > max_size . height ) ;
EINA_LIST_FOREACH ( e_config_runtime_info - > output_dialog_data_list , iter , odd )
2011-12-20 17:23:16 -08:00
{
2012-03-12 15:37:55 -07:00
_arrangement_widget_rep_del ( odd ) ;
2011-12-20 17:23:16 -08:00
2012-02-25 02:01:30 -08:00
if ( ! odd - > crtc & &
( ! odd - > output - > monitor & & ( randr_dialog_config & & ! randr_dialog_config - > display_disconnected_outputs ) ) )
continue ;
2011-12-20 17:23:16 -08:00
2012-02-25 02:50:19 -08:00
if ( ! ( odd - > rep = _arrangement_widget_rep_add ( e_config_runtime_info - > gui . canvas , odd ) ) )
2012-03-12 15:37:55 -07:00
{
fprintf ( stderr , " CONF_RANDR: Could not add rep for CRTC %p/ output %p. \n " , odd - > crtc , odd - > output ) ;
continue ;
}
2012-02-25 02:01:30 -08:00
if ( odd - > crtc & & odd - > crtc - > current_mode )
{
geo . x = odd - > crtc - > geometry . x ;
geo . y = odd - > crtc - > geometry . y ;
geo . w = odd - > crtc - > geometry . w ;
geo . h = odd - > crtc - > geometry . h ;
}
else
{
memcpy ( & geo , & default_geo , sizeof ( geo ) ) ;
}
2012-03-12 15:38:00 -07:00
evas_object_data_set ( odd - > rep , " rep_info " , odd ) ;
2012-03-08 00:27:32 -08:00
evas_object_show ( odd - > rep ) ;
e_layout_pack ( area , odd - > rep ) ;
2012-02-25 02:01:30 -08:00
e_layout_child_raise ( odd - > rep ) ;
e_layout_child_resize ( odd - > rep , geo . w , geo . h ) ;
e_layout_child_move ( odd - > rep , geo . x , geo . y ) ;
2011-12-20 17:23:16 -08:00
2012-02-25 02:01:30 -08:00
fprintf ( stderr , " CONF_RANDR: Representation (%p) added with geo %d.%d %dx%d. \n " , odd - > rep , geo . x , geo . y , geo . w , geo . h ) ;
2011-12-20 17:23:16 -08:00
}
2012-03-12 15:38:00 -07:00
if ( e_config_runtime_info - > gui . widgets . arrangement . suggestion )
{
e_layout_pack ( area , e_config_runtime_info - > gui . widgets . arrangement . suggestion ) ;
}
2012-02-25 02:01:30 -08:00
e_layout_thaw ( area ) ;
2011-12-20 17:23:16 -08:00
}
2012-03-08 03:37:54 -08:00
Eina_Bool
2012-02-25 02:01:23 -08:00
arrangement_widget_create_data ( E_Config_Dialog_Data * data )
2011-11-05 23:41:39 -07:00
{
Eina_List * iter ;
E_Config_Randr_Dialog_Output_Dialog_Data * dialog_data ;
2011-11-09 08:13:26 -08:00
EINA_LIST_FOREACH ( data - > output_dialog_data_list , iter , dialog_data )
2011-11-05 23:41:39 -07:00
{
2012-02-25 02:01:23 -08:00
_arrangement_widget_rep_dialog_data_fill ( dialog_data ) ;
2011-11-05 23:41:39 -07:00
}
return EINA_TRUE ;
}
2011-11-09 07:36:05 -08:00
Evas_Object *
2012-02-25 02:01:23 -08:00
arrangement_widget_basic_create_widgets ( Evas * canvas )
2011-11-05 23:41:39 -07:00
{
2012-02-25 02:50:19 -08:00
Evas_Object * widget , * scrollframe , * area , * check ;
2011-11-05 23:41:39 -07:00
if ( ! canvas | | ! e_config_runtime_info | | ! e_config_runtime_info - > output_dialog_data_list ) return NULL ;
2012-03-12 15:37:55 -07:00
widget = e_widget_list_add ( canvas , 0 , 0 ) ;
2012-02-25 02:01:30 -08:00
fprintf ( stderr , " CONF_RANDR: Arrangement widget added (%p). \n " , widget ) ;
2011-12-20 17:23:16 -08:00
//Add checkbox
2012-02-25 02:01:30 -08:00
check = e_widget_check_add ( canvas , _ ( " Display disconnected outputs " ) , & e_config_runtime_info - > gui . widgets . arrangement . check_val_display_disconnected_outputs ) ;
2011-12-20 17:23:16 -08:00
if ( randr_dialog_config )
2012-02-18 08:49:17 -08:00
e_widget_check_checked_set ( check , randr_dialog_config - > display_disconnected_outputs ) ;
2012-02-25 02:01:23 -08:00
evas_object_event_callback_add ( check , EVAS_CALLBACK_MOUSE_DOWN , _arrangement_widget_check_mouse_down_cb , NULL ) ;
2012-02-25 02:01:30 -08:00
e_config_runtime_info - > gui . widgets . arrangement . check_display_disconnected_outputs = check ;
2011-12-20 17:23:16 -08:00
2012-02-25 02:01:30 -08:00
area = e_layout_add ( canvas ) ;
e_config_runtime_info - > gui . widgets . arrangement . area = area ;
2012-03-12 15:38:00 -07:00
e_layout_virtual_size_set ( area , e_randr_screen_info . rrvd_info . randr_info_12 - > max_size . width , e_randr_screen_info . rrvd_info . randr_info_12 - > max_size . height ) ;
evas_object_resize ( area , 500 , 500 ) ;
2012-02-25 02:50:19 -08:00
evas_object_show ( area ) ;
2011-11-05 23:41:39 -07:00
2012-03-12 15:38:00 -07:00
// Add suggestion element, hidden
e_config_runtime_info - > gui . widgets . arrangement . suggestion = _arrangement_widget_suggestion_add ( canvas ) ;
_arrangement_widget_update ( ) ;
2012-02-25 02:50:19 -08:00
scrollframe = e_scrollframe_add ( canvas ) ;
e_scrollframe_child_set ( scrollframe , area ) ;
e_config_runtime_info - > gui . widgets . arrangement . scrollframe = scrollframe ;
2011-12-20 17:23:16 -08:00
// Append both objects to widget list
2012-03-08 00:27:32 -08:00
e_widget_list_object_append ( widget , scrollframe , 1 , 1 , 0.0 ) ;
2012-02-25 02:01:30 -08:00
e_widget_list_object_append ( widget , check , 0 , 0 , 1.0 ) ;
e_config_runtime_info - > gui . widgets . arrangement . widget_list = widget ;
2011-11-05 23:41:39 -07:00
2012-02-25 02:01:30 -08:00
return widget ;
2011-11-05 23:41:39 -07:00
}
2011-11-09 07:36:05 -08:00
static Evas_Object *
2012-02-25 02:01:23 -08:00
_arrangement_widget_rep_add ( Evas * canvas , E_Config_Randr_Dialog_Output_Dialog_Data * output_dialog_data )
2011-11-05 23:41:39 -07:00
{
E_Randr_Output_Info * output_info ;
2011-12-20 17:23:16 -08:00
Evas_Object * rep ;
2012-03-12 15:37:55 -07:00
const char * output_name = NULL , * state_signal ;
2011-11-05 23:41:39 -07:00
if ( ! canvas | | ! output_dialog_data | | ! e_config_runtime_info ) return NULL ;
2011-12-20 17:23:16 -08:00
rep = edje_object_add ( canvas ) ;
2011-11-05 23:41:39 -07:00
//set theme for monitor representation
2012-02-25 02:50:14 -08:00
EINA_SAFETY_ON_FALSE_GOTO ( edje_object_file_set ( rep , _theme_file_path , " e/conf/randr/dialog/widget/arrangement/output " ) , _arrangement_widget_rep_add_edje_set_fail ) ;
2011-11-05 23:41:39 -07:00
//indicate monitor state
2012-02-25 02:01:30 -08:00
if ( ! ( output_dialog_data - > crtc & & output_dialog_data - > crtc - > current_mode ) )
2011-12-16 06:19:41 -08:00
state_signal = " disabled " ;
2011-11-05 23:41:39 -07:00
else
2011-12-16 06:19:41 -08:00
state_signal = " enabled " ;
2011-12-20 17:23:16 -08:00
edje_object_signal_emit ( rep , state_signal , " e " ) ;
//for now use deskpreview widget as background of rep, maybe change this to
2011-11-05 23:41:39 -07:00
//live image from comp module
output_dialog_data - > bg = e_widget_deskpreview_add ( canvas , 1 , 1 ) ;
2012-02-25 02:01:30 -08:00
//output_dialog_data->bg = e_livethumb_add(canvas);
2011-12-20 17:23:16 -08:00
edje_object_part_swallow ( rep , " e.swallow.content " , output_dialog_data - > bg ) ;
2011-11-05 23:41:39 -07:00
2012-03-12 15:37:55 -07:00
//Try to get the name of the monitor connected to the CRTC's first output via edid
2011-11-05 23:41:39 -07:00
//else use the output's name
if ( output_dialog_data - > crtc )
2012-02-20 11:14:16 -08:00
output_info = ( E_Randr_Output_Info * ) eina_list_data_get ( output_dialog_data - > crtc - > outputs ) ;
2011-11-05 23:41:39 -07:00
else
output_info = output_dialog_data - > output ;
if ( output_info )
{
2012-02-20 11:14:16 -08:00
if ( output_info - > monitor )
2012-02-18 08:49:17 -08:00
output_name = ecore_x_randr_edid_display_name_get ( output_info - > monitor - > edid , output_info - > monitor - > edid_length ) ;
2012-02-20 11:14:16 -08:00
if ( ! output_name & & output_info - > name )
2011-11-05 23:41:39 -07:00
output_name = output_info - > name ;
}
if ( output_name )
2011-12-20 17:23:16 -08:00
edje_object_part_text_set ( rep , " output_txt " , output_name ) ;
2011-11-05 23:41:39 -07:00
2012-02-25 02:01:23 -08:00
evas_object_event_callback_add ( rep , EVAS_CALLBACK_MOUSE_DOWN , _arrangement_widget_rep_mouse_down_cb , NULL ) ;
evas_object_event_callback_add ( rep , EVAS_CALLBACK_MOUSE_MOVE , _arrangement_widget_rep_mouse_move_cb , NULL ) ;
evas_object_event_callback_add ( rep , EVAS_CALLBACK_MOUSE_UP , _arrangement_widget_rep_mouse_up_cb , NULL ) ;
2011-12-20 17:23:16 -08:00
return rep ;
2011-11-05 23:41:39 -07:00
2012-02-25 02:01:23 -08:00
_arrangement_widget_rep_add_edje_set_fail :
2011-12-20 17:23:16 -08:00
evas_object_del ( rep ) ;
2011-11-05 23:41:39 -07:00
return NULL ;
}
2011-12-20 17:23:16 -08:00
static void
2012-03-12 15:37:55 -07:00
_arrangement_widget_rep_del ( E_Config_Randr_Dialog_Output_Dialog_Data * odd )
2011-12-20 17:23:16 -08:00
{
2012-03-12 15:37:55 -07:00
if ( ! odd )
2012-02-25 02:01:30 -08:00
return ;
2011-12-20 17:23:16 -08:00
2012-03-12 15:37:55 -07:00
evas_object_hide ( odd - > rep ) ;
2011-12-20 17:23:16 -08:00
2012-03-12 15:37:55 -07:00
evas_object_event_callback_del ( odd - > rep , EVAS_CALLBACK_MOUSE_DOWN , _arrangement_widget_rep_mouse_down_cb ) ;
evas_object_event_callback_del ( odd - > rep , EVAS_CALLBACK_MOUSE_MOVE , _arrangement_widget_rep_mouse_move_cb ) ;
evas_object_event_callback_del ( odd - > rep , EVAS_CALLBACK_MOUSE_UP , _arrangement_widget_rep_mouse_up_cb ) ;
2011-12-20 17:23:16 -08:00
2012-02-25 02:01:30 -08:00
//get instance data for output
2012-03-12 15:37:55 -07:00
edje_object_part_unswallow ( odd - > rep , odd - > bg ) ;
evas_object_del ( odd - > bg ) ;
odd - > bg = NULL ;
2011-11-05 23:41:39 -07:00
2012-02-25 02:01:30 -08:00
//update output orientation
orientation_widget_update_edje ( NULL ) ;
2011-11-05 23:41:39 -07:00
2012-03-12 15:37:55 -07:00
evas_object_del ( odd - > rep ) ;
odd - > rep = NULL ;
2011-12-20 17:23:16 -08:00
}
static void
2012-02-25 02:01:23 -08:00
_arrangement_widget_check_mouse_down_cb ( void * data __UNUSED__ , Evas * e __UNUSED__ , Evas_Object * obj , void * event_info __UNUSED__ )
2011-12-20 17:23:16 -08:00
{
if ( ! obj | | ! e_config_runtime_info | | ! randr_dialog_config ) return ;
2012-02-25 02:01:30 -08:00
if ( obj = = e_config_runtime_info - > gui . widgets . arrangement . check_display_disconnected_outputs )
2011-12-20 17:23:16 -08:00
{
//this is bad. The events are called _before_ the value is updated.
2012-02-18 08:49:17 -08:00
randr_dialog_config - > display_disconnected_outputs ^ = EINA_TRUE ;
2012-02-25 02:01:23 -08:00
_arrangement_widget_update ( ) ;
2011-11-05 23:41:39 -07:00
}
}
2011-11-09 07:36:05 -08:00
static void
2012-02-25 02:01:23 -08:00
_arrangement_widget_rep_mouse_down_cb ( void * data __UNUSED__ , Evas * e __UNUSED__ , Evas_Object * obj , void * event_info __UNUSED__ )
2011-11-05 23:41:39 -07:00
{
2012-03-12 15:38:00 -07:00
E_Config_Randr_Dialog_Output_Dialog_Data * odd = NULL ;
2011-11-05 23:41:39 -07:00
Eina_List * iter ;
2012-03-12 15:38:00 -07:00
EINA_LIST_FOREACH ( e_config_runtime_info - > output_dialog_data_list , iter , odd )
2011-11-05 23:41:39 -07:00
{
2012-03-12 15:38:00 -07:00
if ( odd - > rep = = obj )
2012-02-25 02:01:30 -08:00
continue ;
2012-03-12 15:38:00 -07:00
edje_object_signal_emit ( odd - > rep , " deselect " , " e " ) ;
2012-02-25 02:01:30 -08:00
}
2011-11-05 23:41:39 -07:00
2012-02-25 02:01:30 -08:00
edje_object_signal_emit ( obj , " select " , " e " ) ;
//update data for other dialogs
e_config_runtime_info - > gui . selected_eo = obj ;
2012-03-12 15:38:00 -07:00
e_config_runtime_info - > gui . selected_output_dd = ( E_Config_Randr_Dialog_Output_Dialog_Data * ) evas_object_data_get ( obj , " rep_info " ) ;
2011-11-05 23:41:39 -07:00
2012-02-25 02:01:30 -08:00
//update resolutions list
resolution_widget_update_list ( obj ) ;
2011-11-05 23:41:39 -07:00
2012-02-25 02:01:30 -08:00
//update orientation radio buttons
orientation_widget_update_radio_buttons ( obj ) ;
2011-11-05 23:41:39 -07:00
2012-02-25 02:01:30 -08:00
//update policy radio buttons
policy_widget_update_radio_buttons ( obj ) ;
2011-11-05 23:41:39 -07:00
}
2011-11-09 07:36:05 -08:00
static void
2012-02-25 02:01:23 -08:00
_arrangement_widget_rep_mouse_move_cb ( void * data __UNUSED__ , Evas * e __UNUSED__ , Evas_Object * obj , void * event_info )
2011-11-05 23:41:39 -07:00
{
Evas_Event_Mouse_Move * ev = event_info ;
Eina_Rectangle geo , parent ;
Evas_Coord_Point delta , new ;
2011-11-09 08:08:31 -08:00
if ( ev - > buttons ! = 1 ) return ;
2012-03-12 15:38:00 -07:00
evas_object_geometry_get ( e_config_runtime_info - > gui . widgets . arrangement . area , & parent . x , & parent . y , NULL , NULL ) ;
e_layout_virtual_size_get ( e_config_runtime_info - > gui . widgets . arrangement . area , & parent . w , & parent . h ) ;
2012-02-25 02:01:30 -08:00
2011-11-09 08:08:31 -08:00
delta . x = ev - > cur . canvas . x - ev - > prev . canvas . x ;
delta . y = ev - > cur . canvas . y - ev - > prev . canvas . y ;
2012-03-12 15:38:00 -07:00
//add parent.x and parent.y to delta, as they are subtraced in the e_layouts'
//coord transformation
e_layout_coord_canvas_to_virtual ( e_config_runtime_info - > gui . widgets . arrangement . area , ( parent . x + delta . x ) , ( parent . y + delta . y ) , & new . x , & new . y ) ;
2011-11-09 08:08:31 -08:00
2012-03-12 15:38:00 -07:00
e_layout_child_geometry_get ( obj , & geo . x , & geo . y , & geo . w , & geo . h ) ;
new . x + = geo . x ;
new . y + = geo . y ;
2011-11-09 08:08:31 -08:00
//respect container borders
if ( new . x < parent . x + 1 )
new . x = parent . x + 1 ;
else if ( new . x > parent . x + parent . w - geo . w )
new . x = parent . x + parent . w - geo . w ;
if ( new . y < parent . y + 1 )
new . y = parent . y + 1 ;
else if ( new . y > parent . y + parent . h - geo . h )
new . y = parent . y + parent . h - geo . h ;
//only take action if position changed
if ( ( geo . x ! = new . x ) | | ( geo . y ! = new . y ) )
2011-11-05 23:41:39 -07:00
{
2012-03-12 15:38:00 -07:00
e_layout_child_move ( obj , new . x , new . y ) ;
2012-02-25 02:01:23 -08:00
_arrangement_widget_make_suggestion ( obj ) ;
2011-11-05 23:41:39 -07:00
}
}
2011-11-09 07:36:05 -08:00
static void
2012-02-25 02:01:23 -08:00
_arrangement_widget_rep_mouse_up_cb ( void * data __UNUSED__ , Evas * e __UNUSED__ , Evas_Object * obj , void * event_info __UNUSED__ )
2011-11-05 23:41:39 -07:00
{
Evas_Coord_Point coords ;
2012-02-25 02:01:30 -08:00
if ( evas_object_visible_get ( e_config_runtime_info - > gui . widgets . arrangement . suggestion ) )
2011-11-05 23:41:39 -07:00
{
2012-02-25 02:01:30 -08:00
edje_object_signal_emit ( e_config_runtime_info - > gui . widgets . arrangement . suggestion , " hide " , " e " ) ;
2012-03-12 15:38:00 -07:00
evas_object_hide ( e_config_runtime_info - > gui . widgets . arrangement . suggestion ) ;
e_layout_child_geometry_get ( e_config_runtime_info - > gui . widgets . arrangement . suggestion , & coords . x , & coords . y , NULL , NULL ) ;
e_layout_child_move ( obj , coords . x , coords . y ) ;
2011-11-05 23:41:39 -07:00
}
}
2012-03-12 15:38:00 -07:00
Evas_Object *
2012-02-25 02:01:23 -08:00
_arrangement_widget_suggestion_add ( Evas * evas )
2011-11-05 23:41:39 -07:00
{
2012-03-12 15:38:00 -07:00
Evas_Object * sug = NULL ;
2011-11-05 23:41:39 -07:00
const char * theme_data_item = NULL ;
2012-03-12 15:38:00 -07:00
int min_dist = 0 ;
Evas_Coord parent_x ;
2011-11-05 23:41:39 -07:00
2012-03-12 15:38:00 -07:00
evas_object_geometry_get ( e_config_runtime_info - > gui . widgets . arrangement . area , & parent_x , NULL , NULL , NULL ) ;
sug = edje_object_add ( evas ) ;
edje_object_file_set ( sug , _theme_file_path , " e/conf/randr/dialog/widget/arrangement/suggestion " ) ;
if ( ( theme_data_item = edje_object_data_get ( sug , " distance_min " ) ) )
min_dist = MAX ( atoi ( theme_data_item ) , 0 ) ;
2011-11-05 23:41:39 -07:00
else
2012-03-12 15:38:00 -07:00
min_dist = 20 ;
e_layout_coord_canvas_to_virtual ( e_config_runtime_info - > gui . widgets . arrangement . area , ( parent_x + min_dist ) , 0 , & e_config_runtime_info - > gui . widgets . arrangement . suggestion_dist_min , NULL ) ;
return sug ;
2011-11-05 23:41:39 -07:00
}
2011-11-09 07:36:05 -08:00
void
2012-02-25 02:01:23 -08:00
_arrangement_widget_make_suggestion ( Evas_Object * obj )
2011-11-05 23:41:39 -07:00
{
2012-03-12 15:38:00 -07:00
E_Config_Randr_Dialog_Output_Dialog_Data * odd = NULL ;
2012-02-25 02:01:30 -08:00
Evas_Object * rep = NULL ;
Eina_Rectangle p_geo = { . x = 0 , . y = 0 , . w = 0 , . h = 0 } , geo , rep_geo , s_geo ;
int dxa = INT_MAX , dya = INT_MAX , tmp , min_dist ;
Eina_List * li ;
2011-11-05 23:41:39 -07:00
if ( ! obj ) return ;
2012-02-25 02:01:30 -08:00
min_dist = e_config_runtime_info - > gui . widgets . arrangement . suggestion_dist_min ;
2011-11-05 23:41:39 -07:00
2012-02-25 02:01:30 -08:00
e_layout_child_geometry_get ( obj , & geo . x , & geo . y , & geo . w , & geo . h ) ;
2012-03-12 15:38:00 -07:00
e_layout_virtual_size_get ( e_config_runtime_info - > gui . widgets . arrangement . area , & p_geo . w , & p_geo . h ) ;
2011-11-05 23:41:39 -07:00
s_geo . x = geo . x ;
s_geo . y = geo . y ;
s_geo . w = geo . w ;
s_geo . h = geo . h ;
//compare possible positions
//aritifical (relative) 0x0 element
tmp = s_geo . x ;
if ( ( tmp < dxa ) & & ( tmp < min_dist ) )
{
s_geo . x = p_geo . x ;
dxa = tmp ;
}
tmp = s_geo . y ;
if ( ( tmp < dya ) & & ( tmp < min_dist ) )
{
s_geo . y = p_geo . y ;
dya = tmp ;
}
2012-03-12 15:38:00 -07:00
2012-02-25 02:01:30 -08:00
//iterate rep list
2012-03-12 15:38:00 -07:00
EINA_LIST_FOREACH ( e_config_runtime_info - > output_dialog_data_list , li , odd )
2011-11-05 23:41:39 -07:00
{
2012-03-12 15:38:00 -07:00
if ( ! odd ) continue ;
rep = odd - > rep ;
if ( ! rep | | ( rep = = obj ) )
continue ;
2012-02-25 02:01:30 -08:00
e_layout_child_geometry_get ( rep , & rep_geo . x , & rep_geo . y , & rep_geo . w , & rep_geo . h ) ;
2011-11-05 23:41:39 -07:00
//X-Axis
2012-02-25 02:01:30 -08:00
tmp = abs ( s_geo . x - rep_geo . x ) ;
2011-11-05 23:41:39 -07:00
if ( ( tmp < dxa ) & & ( tmp < min_dist ) )
{
2012-02-25 02:01:30 -08:00
s_geo . x = rep_geo . x ;
dxa = abs ( s_geo . x - rep_geo . x ) ;
2011-11-05 23:41:39 -07:00
}
2012-02-25 02:01:30 -08:00
tmp = abs ( s_geo . x - ( rep_geo . x + rep_geo . w ) ) ;
2011-11-05 23:41:39 -07:00
if ( ( tmp < dxa ) & & ( tmp < min_dist ) )
{
2012-02-25 02:01:30 -08:00
s_geo . x = ( rep_geo . x + rep_geo . w ) ;
2011-11-05 23:41:39 -07:00
dxa = tmp ;
}
2012-02-25 02:01:30 -08:00
tmp = abs ( ( s_geo . x + s_geo . w ) - ( rep_geo . x - 1 ) ) ;
2011-11-05 23:41:39 -07:00
if ( ( tmp < dxa ) & & ( tmp < min_dist ) )
{
2012-02-25 02:01:30 -08:00
s_geo . x = ( rep_geo . x - s_geo . w ) ;
2011-11-05 23:41:39 -07:00
dxa = tmp ;
}
2012-02-25 02:01:30 -08:00
tmp = abs ( ( s_geo . x + s_geo . w ) - ( rep_geo . x + rep_geo . w ) ) ;
2011-11-05 23:41:39 -07:00
if ( ( tmp < dxa ) & & ( tmp < min_dist ) )
{
2012-02-25 02:01:30 -08:00
s_geo . x = ( rep_geo . x + rep_geo . w - s_geo . w ) ;
2011-11-05 23:41:39 -07:00
dxa = tmp ;
}
//Y-Axis
2012-02-25 02:01:30 -08:00
tmp = abs ( s_geo . y - rep_geo . y ) ;
2011-11-05 23:41:39 -07:00
if ( ( tmp < dya ) & & ( tmp < min_dist ) )
{
2012-02-25 02:01:30 -08:00
s_geo . y = rep_geo . y ;
dya = abs ( s_geo . y - rep_geo . y ) ;
2011-11-05 23:41:39 -07:00
}
2012-02-25 02:01:30 -08:00
tmp = abs ( s_geo . y - ( rep_geo . y + rep_geo . h ) ) ;
2011-11-05 23:41:39 -07:00
if ( ( tmp < dya ) & & ( tmp < min_dist ) )
{
2012-02-25 02:01:30 -08:00
s_geo . y = ( rep_geo . y + rep_geo . h ) ;
2011-11-05 23:41:39 -07:00
dya = tmp ;
}
2012-02-25 02:01:30 -08:00
tmp = abs ( ( s_geo . y + s_geo . h ) - ( rep_geo . y - 1 ) ) ;
2011-11-05 23:41:39 -07:00
if ( ( tmp < dya ) & & ( tmp < min_dist ) )
{
2012-02-25 02:01:30 -08:00
s_geo . y = ( rep_geo . y - s_geo . h ) ;
2011-11-05 23:41:39 -07:00
dya = tmp ;
}
2012-02-25 02:01:30 -08:00
tmp = abs ( ( s_geo . y + s_geo . h ) - ( rep_geo . y + rep_geo . h ) ) ;
2011-11-05 23:41:39 -07:00
if ( ( tmp < dya ) & & ( tmp < min_dist ) )
{
2012-02-25 02:01:30 -08:00
s_geo . y = ( rep_geo . y + rep_geo . h - s_geo . h ) ;
2011-11-05 23:41:39 -07:00
dya = tmp ;
}
}
2012-03-12 15:38:00 -07:00
if ( ( s_geo . x ! = geo . x ) | | ( s_geo . y ! = geo . y ) )
2011-11-05 23:41:39 -07:00
{
if ( s_geo . x < p_geo . x ) s_geo . x = p_geo . x ;
if ( ( s_geo . x + s_geo . w ) > ( p_geo . x + p_geo . w ) ) s_geo . x = ( ( p_geo . x + p_geo . w ) - s_geo . w ) ;
if ( s_geo . y < p_geo . y ) s_geo . y = p_geo . y ;
if ( ( s_geo . y + s_geo . h ) > ( p_geo . y + p_geo . h ) ) s_geo . y = ( ( p_geo . y + p_geo . h ) - s_geo . h ) ;
2012-02-25 02:01:30 -08:00
if ( ! evas_object_visible_get ( e_config_runtime_info - > gui . widgets . arrangement . suggestion ) )
2011-11-09 07:36:05 -08:00
{
2012-02-25 02:01:30 -08:00
evas_object_show ( e_config_runtime_info - > gui . widgets . arrangement . suggestion ) ;
edje_object_signal_emit ( e_config_runtime_info - > gui . widgets . arrangement . suggestion , " show " , " e " ) ;
2011-11-09 07:36:05 -08:00
}
2011-11-05 23:41:39 -07:00
2012-03-12 15:38:00 -07:00
e_layout_child_resize ( e_config_runtime_info - > gui . widgets . arrangement . suggestion , s_geo . w , s_geo . h ) ;
e_layout_child_move ( e_config_runtime_info - > gui . widgets . arrangement . suggestion , s_geo . x , s_geo . y ) ;
e_layout_child_raise ( e_config_runtime_info - > gui . widgets . arrangement . suggestion ) ;
2011-11-05 23:41:39 -07:00
}
else
{
2012-02-25 02:01:30 -08:00
edje_object_signal_emit ( e_config_runtime_info - > gui . widgets . arrangement . suggestion , " hide " , " e " ) ;
evas_object_hide ( e_config_runtime_info - > gui . widgets . arrangement . suggestion ) ;
2011-11-05 23:41:39 -07:00
}
}
2011-11-09 07:36:05 -08:00
void
2012-02-25 02:01:23 -08:00
arrangement_widget_free_data ( E_Config_Dialog * cfd __UNUSED__ , E_Config_Dialog_Data * cfdata )
2011-11-05 23:41:39 -07:00
{
E_Config_Randr_Dialog_Output_Dialog_Data * dialog_data ;
2012-02-18 08:49:17 -08:00
Eina_List * iter ;
2011-11-05 23:41:39 -07:00
EINA_SAFETY_ON_NULL_RETURN ( cfdata ) ;
2012-02-18 08:49:17 -08:00
EINA_LIST_FOREACH ( cfdata - > output_dialog_data_list , iter , dialog_data )
2011-11-05 23:41:39 -07:00
{
2011-11-09 07:34:52 -08:00
if ( dialog_data - > bg )
2011-11-05 23:41:39 -07:00
{
2011-11-09 07:34:52 -08:00
evas_object_del ( dialog_data - > bg ) ;
dialog_data - > bg = NULL ;
2011-11-05 23:41:39 -07:00
}
}
}
2011-11-09 07:36:05 -08:00
Eina_Bool
2012-02-25 02:01:30 -08:00
arrangement_widget_basic_apply_data ( E_Config_Dialog * cfd , E_Config_Dialog_Data * cfdata )
2011-11-05 23:41:39 -07:00
{
E_Config_Randr_Dialog_Output_Dialog_Data * odd ;
2012-02-25 02:01:30 -08:00
Evas_Coord_Point pos = { . x = 0 , . y = 0 } ;
Eina_Bool success = EINA_TRUE ;
Eina_List * iter ;
2011-11-05 23:41:39 -07:00
2012-02-25 02:01:30 -08:00
EINA_LIST_FOREACH ( cfdata - > output_dialog_data_list , iter , odd )
2011-11-05 23:41:39 -07:00
{
2012-02-25 02:01:30 -08:00
if ( ! odd - > crtc | | ! odd - > crtc - > current_mode )
continue ;
e_layout_child_geometry_get ( odd - > rep , & pos . x , & pos . y , NULL , NULL ) ;
2012-03-12 15:38:00 -07:00
fprintf ( stderr , " CONF_RANDR: Rearranging CRTC %d to %d,%d \n " , odd - > crtc - > xid , pos . x , pos . y ) ;
2012-02-25 02:01:30 -08:00
/*
# define EQL(c) (pos.c == odd->crtc->geometry.c)
if ( ! EQL ( x ) | | ! EQL ( y ) )
success | = ecore_x_randr_crtc_pos_set ( cfd - > con - > manager - > root , odd - > crtc - > xid , pos . x , pos . y ) ;
# undef EQL
*/
odd - > previous_pos . x = odd - > crtc - > geometry . x ;
odd - > previous_pos . y = odd - > crtc - > geometry . y ;
2011-11-05 23:41:39 -07:00
}
2012-02-25 02:01:30 -08:00
/*
if ( success )
ecore_x_randr_screen_reset ( cfd - > con - > manager - > root ) ;
*/
return success ;
2011-11-05 23:41:39 -07:00
}
2011-11-09 07:36:05 -08:00
Eina_Bool
2012-02-25 02:01:23 -08:00
arrangement_widget_basic_check_changed ( E_Config_Dialog * cfd __UNUSED__ , E_Config_Dialog_Data * cfdata )
2011-11-05 23:41:39 -07:00
{
2012-02-25 02:01:30 -08:00
E_Config_Randr_Dialog_Output_Dialog_Data * odd = NULL ;
Evas_Coord_Point pos = { . x = 0 , . y = 0 } ;
2011-11-05 23:41:39 -07:00
Eina_List * iter ;
2012-02-25 02:01:30 -08:00
EINA_LIST_FOREACH ( cfdata - > output_dialog_data_list , iter , odd )
2011-11-05 23:41:39 -07:00
{
2012-02-25 02:01:30 -08:00
if ( ! odd - > crtc | | ! odd - > crtc - > current_mode )
continue ;
e_layout_child_geometry_get ( odd - > rep , & pos . x , & pos . y , NULL , NULL ) ;
2012-03-12 15:38:00 -07:00
fprintf ( stderr , " CONF_RANDR: Checking coord of CRTC %d. They are: %d,%d \n " , odd - > crtc - > xid , pos . x , pos . y ) ;
2012-02-25 02:01:30 -08:00
# define EQL(c) (pos.c == odd->crtc->geometry.c)
if ( ! EQL ( x ) | | ! EQL ( y ) )
return EINA_TRUE ;
# undef EQL
2011-11-05 23:41:39 -07:00
}
return EINA_FALSE ;
}
2011-11-09 07:36:05 -08:00
void
2012-02-25 02:01:30 -08:00
arrangement_widget_keep_changes ( E_Config_Dialog_Data * cfdata __UNUSED__ )
2011-11-05 23:41:39 -07:00
{
2012-02-25 02:01:30 -08:00
return ;
2011-11-05 23:41:39 -07:00
}
2011-11-09 07:36:05 -08:00
void
2012-02-25 02:01:23 -08:00
arrangement_widget_discard_changes ( E_Config_Dialog_Data * cfdata )
2011-11-05 23:41:39 -07:00
{
E_Config_Randr_Dialog_Output_Dialog_Data * odd ;
Eina_List * iter ;
if ( ! cfdata ) return ;
2011-11-09 08:13:26 -08:00
EINA_LIST_FOREACH ( cfdata - > output_dialog_data_list , iter , odd )
2011-11-05 23:41:39 -07:00
{
if ( ! odd - > crtc | | ( ( odd - > previous_pos . x = = Ecore_X_Randr_Unset ) | | ( odd - > previous_pos . y = = Ecore_X_Randr_Unset ) ) ) continue ;
if ( ecore_x_randr_crtc_pos_set ( cfdata - > manager - > root , odd - > crtc - > xid , odd - > previous_pos . x , odd - > previous_pos . y ) )
{
2012-02-25 02:01:30 -08:00
# define EQL(c) (odd->previous_pos.c == odd->crtc->geometry.c)
if ( ! EQL ( x ) | | ! EQL ( y ) )
ecore_x_randr_crtc_pos_set ( cfdata - > manager - > root , odd - > crtc - > xid , odd - > previous_pos . x , odd - > previous_pos . y ) ;
# undef EQL
2011-11-05 23:41:39 -07:00
ecore_x_randr_screen_reset ( cfdata - > manager - > root ) ;
}
}
}
2011-11-09 07:36:05 -08:00