Enlightenment CVS committal Author : codewarrior Project : e17 Module : proto
Dir : e17/proto/etk/src/lib Modified Files: etk_types.h etk_widget.c etk_window.c etk_window.h Log Message: - this started out as a patch from ezek, but got heavily modified to allow new window positioning according to mouse and center on parent (if parent = another window, then center on that, if not, center on root window) =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/etk_types.h,v retrieving revision 1.29 retrieving revision 1.30 diff -u -3 -r1.29 -r1.30 --- etk_types.h 15 Feb 2006 18:36:55 -0000 1.29 +++ etk_types.h 27 Feb 2006 22:14:48 -0000 1.30 @@ -45,6 +45,7 @@ typedef enum _Etk_Pointer_Type Etk_Pointer_Type; typedef struct _Etk_Toplevel_Widget Etk_Toplevel_Widget; typedef struct _Etk_Window Etk_Window; +typedef enum _Etk_Window_Position Etk_Window_Position; typedef struct _Etk_Dialog Etk_Dialog; typedef enum _Etk_Dialog_Response_ID Etk_Dialog_Response_ID; typedef struct _Etk_Container Etk_Container; =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/etk_widget.c,v retrieving revision 1.40 retrieving revision 1.41 diff -u -3 -r1.40 -r1.41 --- etk_widget.c 27 Feb 2006 22:00:17 -0000 1.40 +++ etk_widget.c 27 Feb 2006 22:14:49 -0000 1.41 @@ -517,10 +517,11 @@ if (!widget) return; - if (!widget->visibility_locked) - etk_widget_show(widget); for (l = widget->children; l; l = l->next) etk_widget_show_all(ETK_WIDGET(l->data)); + + if (!widget->visibility_locked) + etk_widget_show(widget); } /** =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/etk_window.c,v retrieving revision 1.13 retrieving revision 1.14 diff -u -3 -r1.13 -r1.14 --- etk_window.c 16 Feb 2006 01:40:16 -0000 1.13 +++ etk_window.c 27 Feb 2006 22:14:50 -0000 1.14 @@ -460,6 +460,63 @@ return ETK_TRUE; } +/** + * @brief Moves the window to a defined position + * @param window a window + * @param position + */ +void etk_window_position_set(Etk_Window *window, Etk_Window_Position position) +{ +#if HAVE_ECORE_X + int w, h; + int x2, y2, w2, h2; + + if (!window) + return; + + switch (position) + { + case ETK_WINDOW_POSITION_CENTER: + + if(!(ETK_WIDGET(window))->visible) + { + window->position = ETK_WINDOW_POSITION_CENTER; + break; + } + + if(window->parent) + ecore_evas_geometry_get(window->parent->ecore_evas, + &x2, &y2, &w2, &h2); + else + ecore_x_window_geometry_get(ecore_x_window_root_first_get(), + &x2, &y2, &w2, &h2); + + ecore_evas_geometry_get(window->ecore_evas, NULL, NULL, &w, &h); + ecore_evas_move(window->ecore_evas, x2 + (w2 - w) / 2, + y2 + (h2 - h) / 2); + break; + + case ETK_WINDOW_POSITION_MOUSE: + ecore_x_pointer_xy_get(ecore_x_window_root_first_get(), &x2, &y2); + ecore_evas_move(window->ecore_evas, x2, y2); + break; + } +#endif +} + +/** + * @brief Sets the window's parent + * @param window a window + * @param parent a window + */ +void etk_window_parent_set(Etk_Window *window, Etk_Window *parent) +{ + if(!window || !parent) + return; + + window->parent = parent; +} + /************************** * * Etk specific functions @@ -474,8 +531,10 @@ window->delete_event = _etk_window_delete_event_handler; - window->ecore_evas = ecore_evas_software_x11_new(NULL, 0, 0, 0, 0, 0); + window->ecore_evas = ecore_evas_software_x11_new(0, 0, 0, 0, 0, 0); window->x_window = ecore_evas_software_x11_window_get(window->ecore_evas); + window->position = -1; + window->parent = NULL; /* TODO: free!! */ #if HAVE_ECORE_X @@ -501,7 +560,7 @@ /* TODO: font path */ evas_font_path_append(ETK_TOPLEVEL_WIDGET(window)->evas, PACKAGE_DATA_DIR "/fonts/"); ecore_evas_data_set(window->ecore_evas, "etk_window", window); - ecore_evas_callback_resize_set(window->ecore_evas, _etk_window_move_cb); + ecore_evas_callback_move_set(window->ecore_evas, _etk_window_move_cb); ecore_evas_callback_resize_set(window->ecore_evas, _etk_window_resize_cb); ecore_evas_callback_focus_in_set(window->ecore_evas, _etk_window_focus_in_cb); ecore_evas_callback_focus_out_set(window->ecore_evas, _etk_window_focus_out_cb); @@ -535,6 +594,16 @@ if (!(window = ETK_WINDOW(ecore_evas_data_get(ecore_evas, "etk_window")))) return; etk_signal_emit(_etk_window_signals[ETK_WINDOW_MOVE_SIGNAL], ETK_OBJECT(window), NULL); + + switch(window->position) + { + case ETK_WINDOW_POSITION_CENTER: + etk_window_position_set(window, ETK_WINDOW_POSITION_CENTER); + break; + + default: + break; + } } /* Called when the window is resized */ @@ -545,7 +614,7 @@ if (!(window = ETK_WINDOW(ecore_evas_data_get(ecore_evas, "etk_window")))) return; etk_signal_emit(_etk_window_signals[ETK_WINDOW_RESIZE_SIGNAL], ETK_OBJECT(window), NULL); - etk_widget_redraw_queue(ETK_WIDGET(window)); + etk_widget_redraw_queue(ETK_WIDGET(window)); } /* Called when the window is focused in */ =================================================================== RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/etk_window.h,v retrieving revision 1.5 retrieving revision 1.6 diff -u -3 -r1.5 -r1.6 --- etk_window.h 11 Feb 2006 10:27:14 -0000 1.5 +++ etk_window.h 27 Feb 2006 22:14:50 -0000 1.6 @@ -20,6 +20,16 @@ /** @brief Check if the object is an Etk_Window */ #define ETK_IS_WINDOW(obj) (ETK_OBJECT_CHECK_TYPE((obj), ETK_WINDOW_TYPE)) +/** + * @enum Etk_Window_Position + * @brief The position of a window + */ +enum _Etk_Window_Position +{ + ETK_WINDOW_POSITION_CENTER, + ETK_WINDOW_POSITION_MOUSE +}; + struct _Etk_Window { /* private: */ @@ -28,7 +38,10 @@ Ecore_Evas *ecore_evas; Ecore_X_Window x_window; - + + Etk_Window_Position position; + Etk_Window *parent; + Etk_Bool (*delete_event)(Etk_Window *window); }; @@ -53,20 +66,23 @@ void etk_window_focus(Etk_Window *window); void etk_window_unfocus(Etk_Window *window); -void etk_window_decorated_set(Etk_Window *window, Etk_Bool decorated); +void etk_window_decorated_set(Etk_Window *window, Etk_Bool decorated); Etk_Bool etk_window_decorated_get(Etk_Window *window); -void etk_window_shaped_set(Etk_Window *window, Etk_Bool shaped); +void etk_window_shaped_set(Etk_Window *window, Etk_Bool shaped); Etk_Bool etk_window_shaped_get(Etk_Window *window); -void etk_window_skip_taskbar_hint_set(Etk_Window *window, Etk_Bool skip_taskbar_hint); +void etk_window_skip_taskbar_hint_set(Etk_Window *window, Etk_Bool skip_taskbar_hint); Etk_Bool etk_window_skip_taskbar_hint_get(Etk_Window *window); -void etk_window_skip_pager_hint_set(Etk_Window *window, Etk_Bool skip_pager_hint); +void etk_window_skip_pager_hint_set(Etk_Window *window, Etk_Bool skip_pager_hint); Etk_Bool etk_window_skip_pager_hint_get(Etk_Window *window); -void etk_window_dnd_aware_set(Etk_Window *window, Etk_Bool on); +void etk_window_dnd_aware_set(Etk_Window *window, Etk_Bool on); Etk_Bool etk_window_hide_on_delete(Etk_Object *window, void *data); +void etk_window_position_set(Etk_Window *window, Etk_Window_Position position); +void etk_window_parent_set(Etk_Window *window, Etk_Window *parent); + /** @} */ #endif ------------------------------------------------------- This SF.Net email is sponsored by xPML, a groundbreaking scripting language that extends applications into web and mobile media. Attend the live webcast and join the prime developer group breaking into this new coding territory! http://sel.as-us.falkag.net/sel?cmd=lnk&kid=110944&bid=241720&dat=121642 _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs