well - skeleton work.. going to work on exebuf...
authorCarsten Haitzler <raster@rasterman.com>
Tue, 6 Dec 2005 14:25:57 +0000 (14:25 +0000)
committerCarsten Haitzler <raster@rasterman.com>
Tue, 6 Dec 2005 14:25:57 +0000 (14:25 +0000)
SVN revision: 18876

src/bin/Makefile.am
src/bin/e_exebuf.c [new file with mode: 0644]
src/bin/e_exebuf.h [new file with mode: 0644]
src/bin/e_includes.h

index aa68afb..822eac6 100644 (file)
@@ -121,7 +121,8 @@ e_widget_slider.h \
 e_int_config_window_manipulation.h \
 e_int_config_window_display.h \
 e_int_config_background.h \
-e_deskpreview.h
+e_deskpreview.h \
+e_exebuf.h
 
 enlightenment_src = \
 e_user.c \
@@ -224,6 +225,7 @@ e_int_config_window_manipulation.c \
 e_int_config_window_display.c \
 e_int_config_background.c \
 e_deskpreview.c \
+e_exebuf.c \
 $(ENLIGHTENMENTHEADERS)
 
 enlightenment_SOURCES = \
diff --git a/src/bin/e_exebuf.c b/src/bin/e_exebuf.c
new file mode 100644 (file)
index 0000000..c828f4f
--- /dev/null
@@ -0,0 +1,171 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+#include "e.h"
+
+/* local subsystem functions */
+
+static int _e_exebuf_cb_key_down(void *data, int type, void *event);
+static int _e_exebuf_cb_mouse_down(void *data, int type, void *event);
+static int _e_exebuf_cb_mouse_up(void *data, int type, void *event);
+static int _e_exebuf_cb_mouse_wheel(void *data, int type, void *event);
+
+/* local subsystem globals */
+static E_Popup *exebuf = NULL;
+static Evas_Object *bg_object = NULL;
+static Evas_List *handlers = NULL;
+static Ecore_X_Window input_window = 0;
+
+/* externally accessible functions */
+int
+e_exebuf_init(void)
+{
+   return 1;
+}
+
+int
+e_exebuf_shutdown(void)
+{
+   e_exebuf_hide();
+   return 1;
+}
+
+int
+e_exebuf_show(E_Zone *zone)
+{
+   Evas_Object *o;
+   int x, y, w, h;
+   
+   E_OBJECT_CHECK_RETURN(zone, 0);
+   E_OBJECT_TYPE_CHECK_RETURN(zone, E_ZONE_TYPE, 0);
+   
+   if (exebuf) return 0;
+
+   input_window = ecore_x_window_input_new(zone->container->win, 0, 0, 1, 1);
+   ecore_x_window_show(input_window);
+   e_grabinput_get(input_window, 0, input_window);
+
+   x = zone->x + 20;
+   y = zone->y + 20 + ((zone->h - 20 - 20 - 20) / 2);
+   w = zone->w - 20 - 20;
+   h = 20;
+   
+   exebuf = e_popup_new(zone, x, y, w, h); 
+   if (!exebuf) return 0;
+   e_popup_layer_set(exebuf, 255);
+   evas_event_freeze(exebuf->evas);
+   o = edje_object_add(exebuf->evas);
+   bg_object = o;
+   e_theme_edje_object_set(o, "base/theme/exebuf",
+                          "widgets/exebuf/main");
+   evas_object_move(o, 0, 0);
+   evas_object_resize(o, w, h);
+   evas_object_show(o);
+   e_popup_edje_bg_object_set(exebuf, o);
+
+   evas_event_thaw(exebuf->evas);
+
+   handlers = evas_list_append
+     (handlers, ecore_event_handler_add
+      (ECORE_X_EVENT_KEY_DOWN, _e_exebuf_cb_key_down, NULL));
+   handlers = evas_list_append
+     (handlers, ecore_event_handler_add
+      (ECORE_X_EVENT_MOUSE_BUTTON_DOWN, _e_exebuf_cb_mouse_down, NULL));
+   handlers = evas_list_append
+     (handlers, ecore_event_handler_add
+      (ECORE_X_EVENT_MOUSE_BUTTON_UP, _e_exebuf_cb_mouse_up, NULL));
+   handlers = evas_list_append
+     (handlers, ecore_event_handler_add
+      (ECORE_X_EVENT_MOUSE_WHEEL, _e_exebuf_cb_mouse_wheel, NULL));
+   
+   e_popup_show(exebuf);
+   return 1;
+}
+
+void
+e_exebuf_hide(void)
+{
+   if (!exebuf) return;
+   
+   evas_event_freeze(exebuf->evas);
+   e_popup_hide(exebuf);
+   evas_object_del(bg_object);
+   bg_object = NULL;
+   evas_event_thaw(exebuf->evas);
+   e_object_del(E_OBJECT(exebuf));
+   exebuf = NULL;
+   while (handlers)
+     {
+       ecore_event_handler_del(handlers->data);
+       handlers = evas_list_remove_list(handlers, handlers);
+     }
+   ecore_x_window_del(input_window);
+   e_grabinput_release(input_window, input_window);
+   input_window = 0;
+}
+
+/* local subsystem functions */
+
+static int
+_e_exebuf_cb_key_down(void *data, int type, void *event)
+{
+   Ecore_X_Event_Key_Down *ev;
+   
+   ev = event;
+   if (ev->win != input_window) return 1;
+   if      (!strcmp(ev->keysymbol, "Up"))
+     e_exebuf_hide();
+   else if (!strcmp(ev->keysymbol, "Down"))
+     e_exebuf_hide();
+   else if (!strcmp(ev->keysymbol, "Left"))
+     e_exebuf_hide();
+   else if (!strcmp(ev->keysymbol, "Right"))
+     e_exebuf_hide();
+   else if (!strcmp(ev->keysymbol, "Return"))
+     e_exebuf_hide();
+   else if (!strcmp(ev->keysymbol, "Escape"))
+     e_exebuf_hide();
+   return 1;
+}
+
+static int
+_e_exebuf_cb_mouse_down(void *data, int type, void *event)
+{
+   Ecore_X_Event_Mouse_Button_Down *ev;
+   
+   ev = event;
+   if (ev->win != input_window) return 1;
+   return 1;
+}
+
+static int
+_e_exebuf_cb_mouse_up(void *data, int type, void *event)
+{
+   Ecore_X_Event_Mouse_Button_Up *ev;
+   
+   ev = event;
+   if (ev->win != input_window) return 1;
+   return 1;
+}
+
+static int
+_e_exebuf_cb_mouse_wheel(void *data, int type, void *event)
+{
+   Ecore_X_Event_Mouse_Wheel *ev;
+   
+   ev = event;
+   if (ev->win != input_window) return 1;
+   if (ev->z < 0) /* up */
+     {
+       int i;
+       
+       for (i = ev->z; i < 0; i++) e_exebuf_hide();
+     }
+   else if (ev->z > 0) /* down */
+     {
+       int i;
+       
+       for (i = ev->z; i > 0; i--) e_exebuf_hide();
+     }
+   return 1;
+}
diff --git a/src/bin/e_exebuf.h b/src/bin/e_exebuf.h
new file mode 100644 (file)
index 0000000..935d9fb
--- /dev/null
@@ -0,0 +1,17 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+#ifdef E_TYPEDEFS
+
+#else
+#ifndef E_EXEBUF_H
+#define E_EXEBUF_H
+
+EAPI int e_exebuf_init(void);
+EAPI int e_exebuf_shutdown(void);
+
+EAPI int  e_exebuf_show(E_Zone *zone);
+EAPI void e_exebuf_hide(void);
+
+#endif
+#endif
index be9245a..6cb216d 100644 (file)
 #include "e_int_config_window_display.h"
 #include "e_int_config_background.h"
 #include "e_deskpreview.h"
+#include "e_exebuf.h"