Enlightenment CVS committal

Author  : lok
Project : e_modules
Module  : notification

Dir     : e_modules/notification/src


Modified Files:
        Makefile.am e_mod_config.c e_mod_main.c e_mod_main.h 
Added Files:
        e_mod_box.c e_mod_box.h e_mod_config_item.c 
        e_mod_config_item.h e_mod_macro.h e_mod_popup.c e_mod_popup.h 
        e_mod_types.h 


Log Message:
Notification Module 0.2
Now also works with box for less intrusive notification.
A left click on the icon will focus the application source of the event.
A mouse_in during 0.5s will (re-)show depending of the config the popup.
There is two different config dialogs, one by box, and one for the popups.

===================================================================
RCS file: /cvs/e/e_modules/notification/src/Makefile.am,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -3 -r1.2 -r1.3
--- Makefile.am 17 Jan 2008 22:01:58 -0000      1.2
+++ Makefile.am 2 Mar 2008 01:33:28 -0000       1.3
@@ -9,7 +9,15 @@
 pkg_LTLIBRARIES = module.la
 module_la_SOURCES = e_mod_main.h \
                    e_mod_main.c \
-                   e_mod_config.c
+                   e_mod_macro.h \
+                   e_mod_types.h \
+                   e_mod_box.h \
+                   e_mod_box.c \
+                   e_mod_popup.h \
+                   e_mod_popup.c \
+                   e_mod_config.c \
+                   e_mod_config_item.h \
+                   e_mod_config_item.c
 
 module_la_LIBADD = @e_libs@ @ENOTIFY_LIBS@
 module_la_LDFLAGS = -module -avoid-version
===================================================================
RCS file: /cvs/e/e_modules/notification/src/e_mod_config.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -3 -r1.1 -r1.2
--- e_mod_config.c      17 Jan 2008 22:01:58 -0000      1.1
+++ e_mod_config.c      2 Mar 2008 01:33:28 -0000       1.2
@@ -1,9 +1,11 @@
-#include <e.h>
 #include "e_mod_main.h"
 
 struct _E_Config_Dialog_Data 
 {
    int direction;
+   int show_low;
+   int show_normal;
+   int show_critical;
    int gap;
    struct 
      {
@@ -64,22 +66,35 @@
 static void 
 _fill_data(E_Config_Dialog_Data *cfdata) 
 {
-   cfdata->direction   = notification_cfg->direction;
-   cfdata->gap         = notification_cfg->gap;
-   cfdata->placement.x = notification_cfg->placement.x;
-   cfdata->placement.y = notification_cfg->placement.y;
+   cfdata->show_low      = notification_cfg->show_low;
+   cfdata->show_normal   = notification_cfg->show_normal;
+   cfdata->show_critical = notification_cfg->show_critical;
+   cfdata->direction     = notification_cfg->direction;
+   cfdata->gap           = notification_cfg->gap;
+   cfdata->placement.x   = notification_cfg->placement.x;
+   cfdata->placement.y   = notification_cfg->placement.y;
 }
 
 static Evas_Object *
 _basic_create(E_Config_Dialog *cfd __UNUSED__, Evas *evas, 
E_Config_Dialog_Data *cfdata) 
 {
-   Evas_Object *o = NULL, *of = NULL;
-   Evas_Object *ow = NULL;
+   Evas_Object *o = NULL, *of = NULL, *ow = NULL;
    E_Radio_Group *rg;
    E_Manager *man;
 
-   man = e_manager_current_get();
    o = e_widget_list_add(evas, 0, 0);
+   of = e_widget_framelist_add(evas, D_("Urgency"), 0);
+   ow = e_widget_label_add(evas, D_("Levels of urgency to popup : "));
+   e_widget_framelist_object_append(of, ow);
+   ow = e_widget_check_add(evas, D_("low"), &(cfdata->show_low));
+   e_widget_framelist_object_append(of, ow);
+   ow = e_widget_check_add(evas, D_("normal"), &(cfdata->show_normal));
+   e_widget_framelist_object_append(of, ow);
+   ow = e_widget_check_add(evas, D_("critical"), &(cfdata->show_critical));
+   e_widget_framelist_object_append(of, ow);
+   e_widget_list_object_append(o, of, 1, 1, 0.5);
+
+   man = e_manager_current_get();
    of = e_widget_framelist_add(evas, D_("Placement"), 0);
    ow = e_widget_slider_add(evas, 1, 0, D_("%2.0f x"), 0.0, man->w, 1.0, 0, 
                             NULL, &(cfdata->placement.x), 200);
@@ -113,10 +128,13 @@
 static int 
 _basic_apply(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata) 
 {
-   notification_cfg->direction   = cfdata->direction;
-   notification_cfg->gap         = cfdata->gap;
-   notification_cfg->placement.x = cfdata->placement.x;
-   notification_cfg->placement.y = cfdata->placement.y;
+   notification_cfg->show_low      = cfdata->show_low;
+   notification_cfg->show_normal   = cfdata->show_normal;
+   notification_cfg->show_critical = cfdata->show_critical;
+   notification_cfg->direction     = cfdata->direction;
+   notification_cfg->gap           = cfdata->gap;
+   notification_cfg->placement.x   = cfdata->placement.x;
+   notification_cfg->placement.y   = cfdata->placement.y;
 
    e_modapi_save(notification_mod);
    return 1;
===================================================================
RCS file: /cvs/e/e_modules/notification/src/e_mod_main.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -3 -r1.6 -r1.7
--- e_mod_main.c        25 Feb 2008 07:23:57 -0000      1.6
+++ e_mod_main.c        2 Mar 2008 01:33:28 -0000       1.7
@@ -1,59 +1,158 @@
-#include <E_Notification_Daemon.h>
-#include <e.h>
 #include "e_mod_main.h"
 
-typedef struct _Popup_Data Popup_Data;
-struct _Popup_Data
+/* Gadcon function protos */
+static E_Gadcon_Client *_gc_init      (E_Gadcon *gc, 
+                                       const char *name, 
+                                       const char *id, 
+                                       const char *style);
+static void             _gc_shutdown  (E_Gadcon_Client *gcc);
+static char            *_gc_label     (void);
+static Evas_Object     *_gc_icon      (Evas *evas);
+static const char      *_gc_id_new    (void);
+static void             _gc_id_del    (const char *id);
+
+/* Callback function protos */
+static int  _notification_cb_notify              (E_Notification_Daemon 
*daemon, 
+                                                  E_Notification *n);
+static void _notification_cb_close_notification  (E_Notification_Daemon 
*daemon, 
+                                                  unsigned int id);
+
+/* Config function protos */
+static Config *_notification_cfg_new   (void);
+static void    _notification_cfg_free  (Config *cfg);
+
+/* Global variables */
+E_Module *notification_mod = NULL;
+Config   *notification_cfg = NULL;
+int       uuid             = 0;
+
+static E_Config_DD  *conf_edd      = NULL;
+static E_Config_DD  *conf_item_edd = NULL;
+
+/* Gadcon Api Functions */
+const E_Gadcon_Client_Class _gc_class = 
 {
-  E_Notification *notif;
-  E_Win *win;
-  Evas *e;
-  Evas_Object *theme;
-  const char *app_name;
-  Evas_Object *app_icon;
-  Ecore_Timer *timer;
+   GADCON_CLIENT_CLASS_VERSION, "notification", 
+     {_gc_init, _gc_shutdown, _gc_orient, _gc_label, _gc_icon, _gc_id_new, 
_gc_id_del},
+   E_GADCON_CLIENT_STYLE_PLAIN
 };
 
-typedef struct _Daemon_Data Daemon_Data;
-struct _Daemon_Data
+static E_Gadcon_Client *
+_gc_init(E_Gadcon *gc, const char *name, const char *id, const char *style)
 {
-  E_Notification_Daemon *daemon;
-  Evas_List *popups;
-  
-  float default_timeout;
-  int next_id;
-};
+   Notification_Box *b;
+   E_Gadcon_Client *gcc;
+   Config_Item *ci;
+   Instance *inst;
+
+   inst = E_NEW(Instance, 1);
+   ci   = notification_box_config_item_get(id);
+   b    = notification_box_get(ci->id, gc->evas);
+
+   inst->ci    = ci;
+   b->inst     = inst;
+   inst->n_box = b;
+
+   gcc = e_gadcon_client_new(gc, name, id, style, b->o_box);
+   gcc->data = inst;
+   inst->gcc = gcc;
+   
+   evas_object_event_callback_add(b->o_box, EVAS_CALLBACK_MOVE,
+                                  notification_box_cb_obj_moveresize, inst);
+   evas_object_event_callback_add(b->o_box, EVAS_CALLBACK_RESIZE,
+                                  notification_box_cb_obj_moveresize, inst);
+   notification_cfg->instances = evas_list_append(notification_cfg->instances, 
inst);
+   return gcc;
+}
 
-/* local function protos */
-static int  _notification_cb_notify(E_Notification_Daemon *daemon, 
E_Notification *n);
-static void _notification_cb_close_notification(E_Notification_Daemon *daemon, 
-                                                unsigned int id);
-static int  _notification_timer_cb(void *data);
-static void _notification_theme_cb_deleted(void *data, Evas_Object *obj, 
-                                           const char *emission, const char 
*source);
-static void _notification_theme_cb_close(void *data, Evas_Object *obj, 
-                                         const char *emission, const char 
*source);
-static void _notification_theme_cb_find(void *data, Evas_Object *obj, 
-                                        const char *emission, const char 
*source);
-
-static Popup_Data *_notification_popup_new(E_Notification *n);
-static void        _notification_popup_place(Popup_Data *popup, int num);
-static void        _notification_popup_refresh(Popup_Data *popup);
-static Popup_Data *_notification_popup_find(unsigned int id);
-static void        _notification_popup_del(unsigned int id, 
-                                           E_Notification_Closed_Reason 
reason);
-static void        _notification_popdown(Popup_Data *popup, 
-                                         E_Notification_Closed_Reason reason);
+static void
+_gc_shutdown(E_Gadcon_Client *gcc)
+{
+   Instance *inst;
 
-static char *_notification_format_message(E_Notification *n);
+   inst = gcc->data;
+   notification_box_hide(inst->n_box);
+   notification_cfg->instances = evas_list_remove(notification_cfg->instances, 
inst);
+   free(inst);
+}
+
+void
+_gc_orient(E_Gadcon_Client *gcc)
+{
+   Instance *inst;
+
+   inst = gcc->data;
+   switch (gcc->gadcon->orient)
+     {
+      case E_GADCON_ORIENT_FLOAT:
+      case E_GADCON_ORIENT_HORIZ:
+      case E_GADCON_ORIENT_TOP:
+      case E_GADCON_ORIENT_BOTTOM:
+      case E_GADCON_ORIENT_CORNER_TL:
+      case E_GADCON_ORIENT_CORNER_TR:
+      case E_GADCON_ORIENT_CORNER_BL:
+      case E_GADCON_ORIENT_CORNER_BR:
+       notification_box_orient_set(inst->n_box, 1);
+       e_gadcon_client_aspect_set(gcc, evas_list_count(inst->n_box->icons) * 
16, 16);
+       break;
+      case E_GADCON_ORIENT_VERT:
+      case E_GADCON_ORIENT_LEFT:
+      case E_GADCON_ORIENT_RIGHT:
+      case E_GADCON_ORIENT_CORNER_LT:
+      case E_GADCON_ORIENT_CORNER_RT:
+      case E_GADCON_ORIENT_CORNER_LB:
+      case E_GADCON_ORIENT_CORNER_RB:
+       notification_box_orient_set(inst->n_box, 0);
+       e_gadcon_client_aspect_set(gcc, 16, evas_list_count(inst->n_box->icons) 
* 16);
+       break;
+      default:
+       break;
+     }
+   e_gadcon_client_min_size_set(gcc, 16, 16);
+}
 
-static Config *_notification_cfg_new(void);
-static void    _notification_cfg_free(Config *cfg);
-/* Global variables */
-static Daemon_Data *dd;
-static E_Config_DD *conf_edd = NULL;
-E_Module *notification_mod = NULL;
-Config   *notification_cfg = NULL;
+static char *
+_gc_label(void)
+{
+   return D_("Notification Box");
+}
+
+static Evas_Object *
+_gc_icon(Evas *evas)
+{
+   Evas_Object *o;
+   char buf[4096];
+
+   o = edje_object_add(evas);
+   snprintf(buf, sizeof(buf), "%s/e-module-notification.edj",
+           e_module_dir_get(notification_mod));
+   edje_object_file_set(o, buf, "icon");
+   return o;
+}
+
+static const char *
+_gc_id_new(void)
+{
+   Config_Item *ci;
+
+   ci = notification_box_config_item_get(NULL);
+   return ci->id;
+}
+
+static void
+_gc_id_del(const char *id)
+{
+   Config_Item *ci;
+
+   notification_box_del(id);
+   ci = notification_box_config_item_get(id);
+   if (ci)
+     {
+       if (ci->id) evas_stringshare_del(ci->id);
+       notification_cfg->items = evas_list_remove(notification_cfg->items, ci);
+        free(ci);
+     }
+}
 
 /* Module Api Functions */
 EAPI E_Module_Api e_modapi = {E_MODULE_API_VERSION, "Notification"};
@@ -62,25 +161,40 @@
 e_modapi_init(E_Module *m) 
 {
    E_Notification_Daemon *d;
+   char buf[PATH_MAX];
 
-   dd = calloc(1, sizeof(Daemon_Data));
-
+   snprintf(buf, sizeof(buf), "%s/e-module-notification.edj", m->dir);
    /* register config panel entry */
    e_configure_registry_category_add("extensions", 90, D_("Extensions"), NULL, 
                                      "enlightenment/extensions");
    e_configure_registry_item_add("extensions/notification", 30, 
D_("Notification"), NULL, 
-                                 "enlightenment/e", 
e_int_config_notification_module);
+                                 buf, e_int_config_notification_module);
 
-   conf_edd = E_CONFIG_DD_NEW("Config", Config);
+   conf_item_edd = E_CONFIG_DD_NEW("Notification_Config_Item", Config_Item);
+   #undef T
+   #undef D
+   #define T Config_Item
+   #define D conf_item_edd
+   E_CONFIG_VAL(D, T, id, STR);
+   E_CONFIG_VAL(D, T, show_label, INT);
+   E_CONFIG_VAL(D, T, store_low, INT);
+   E_CONFIG_VAL(D, T, store_normal, INT);
+   E_CONFIG_VAL(D, T, store_critical, INT);
+
+   conf_edd = E_CONFIG_DD_NEW("Notification_Config", Config);
    #undef T
    #undef D
    #define T Config
    #define D conf_edd
    E_CONFIG_VAL(D, T, version, INT);
+   E_CONFIG_VAL(D, T, show_low, INT);
+   E_CONFIG_VAL(D, T, show_normal, INT);
+   E_CONFIG_VAL(D, T, show_critical, INT);
    E_CONFIG_VAL(D, T, direction, INT);
    E_CONFIG_VAL(D, T, gap, INT);
    E_CONFIG_VAL(D, T, placement.x, INT);
    E_CONFIG_VAL(D, T, placement.y, INT);
+   E_CONFIG_LIST(D, T, items, conf_item_edd);
 
    notification_cfg = e_config_domain_load("module.notification", conf_edd);
    if (notification_cfg)
@@ -126,48 +240,91 @@
           }
      }
 
-   if (!notification_cfg) notification_cfg = _notification_cfg_new();
+   if (!notification_cfg) 
+     {
+       notification_cfg = _notification_cfg_new();
+     }
+   else
+     {
+       Config_Item *ci;
+       const char *p;
 
-   /* set up the daemon */
+       /* Init uuid */
+       ci = evas_list_last(notification_cfg->items)->data;
+       p = strrchr(ci->id, '.');
+       if (p) uuid = atoi(p + 1);
+     }
+
+   /* set up the notification daemon */
    d = e_notification_daemon_add("e_notification_module", "Enlightenment");
-   e_notification_daemon_data_set(d, dd);
-   dd->daemon = d;
-   dd->default_timeout = 5.0;
+   notification_cfg->daemon = d;
+   notification_cfg->default_timeout = 5.0;
+   e_notification_daemon_data_set(d, notification_cfg);
    e_notification_daemon_callback_notify_set(d, _notification_cb_notify);
    e_notification_daemon_callback_close_notification_set(d, 
_notification_cb_close_notification);
 
+   /* set up the borders events callbacks */
+   notification_cfg->handlers = evas_list_append
+     (notification_cfg->handlers, ecore_event_handler_add
+      (E_EVENT_BORDER_REMOVE, notification_box_cb_border_remove, NULL));
+
    notification_mod = m;
+   e_gadcon_provider_register(&_gc_class);
    return m;
 }
 
 EAPI int 
 e_modapi_shutdown(E_Module *m __UNUSED__) 
 {
-   Popup_Data *popup;
-   Evas_List *l, *next;
+   e_gadcon_provider_unregister(&_gc_class);
+
+   while (notification_cfg->handlers)
+     {
+       ecore_event_handler_del(notification_cfg->handlers->data);
+       notification_cfg->handlers = 
evas_list_remove_list(notification_cfg->handlers,
+                                                          
notification_cfg->handlers);
+     }
 
    if (notification_cfg->cfd) e_object_del(E_OBJECT(notification_cfg->cfd));
    e_configure_registry_item_del("extensions/notification");
    e_configure_registry_category_del("extensions");
 
-   for (l = dd->popups; l && (popup = l->data); l = next)
+   if (notification_cfg->menu)
      {
-       next = l->next;
-       _notification_popdown(popup, E_NOTIFICATION_CLOSED_REQUESTED);
-       dd->popups = evas_list_remove_list(dd->popups, l);
+       e_menu_post_deactivate_callback_set(notification_cfg->menu, NULL, NULL);
+       e_object_del(E_OBJECT(notification_cfg->menu));
+       notification_cfg->menu = NULL;
      }
-   e_notification_daemon_free(dd->daemon);
-   free(dd);
-   notification_mod = NULL;
+
+   while (notification_cfg->items)
+     {
+       Config_Item *ci;
+
+       ci = notification_cfg->items->data;
+       notification_cfg->items = evas_list_remove_list(notification_cfg->items,
+                                                       
notification_cfg->items);
+       if (ci->id) evas_stringshare_del(ci->id);
+       free(ci);
+     }
+
+   notification_box_shutdown();
+   notification_popup_shutdown();
+
+   e_notification_daemon_free(notification_cfg->daemon);
    _notification_cfg_free(notification_cfg);
+   E_CONFIG_DD_FREE(conf_item_edd);
    E_CONFIG_DD_FREE(conf_edd);
+   notification_mod = NULL;
+
    return 1;
 }
 
 EAPI int 
 e_modapi_save(E_Module *m __UNUSED__) 
 {
-   return e_config_domain_save("module.notification", conf_edd, 
notification_cfg);
+   int ret;
+   ret = e_config_domain_save("module.notification", conf_edd, 
notification_cfg);
+   return ret;
 }
 
 /* Callbacks */
@@ -176,37 +333,21 @@
 {
    unsigned int replaces_id;
    unsigned int new_id;
-   int timeout;
-   Popup_Data *popup = NULL;
-   
+   int stacked, popuped;
+
    replaces_id = e_notification_replaces_id_get(n);
-   if (replaces_id && (popup = _notification_popup_find(replaces_id))) 
-     {
-       if (popup->notif) e_notification_unref(popup->notif);
-       e_notification_ref(n);
-       popup->notif = n;
-       edje_object_signal_emit(popup->theme, "notification,del", 
"notification");
-     }
+   new_id = notification_cfg->next_id++;
+   e_notification_id_set(n, new_id);
 
-   if (!popup)
+   popuped = notification_popup_notify(n, replaces_id, new_id);
+   stacked = notification_box_notify(n, replaces_id, new_id);
+   
+   if (!popuped && !stacked)
      {
-       popup = _notification_popup_new(n);
-       dd->popups = evas_list_append(dd->popups, popup);
-       edje_object_signal_emit(popup->theme, "notification,new", 
"notification");
+       e_notification_hint_urgency_set(n, 4);
+       notification_popup_notify(n, replaces_id, new_id);
      }
    
-   new_id = dd->next_id++;
-   e_notification_id_set(n, new_id);
-   
-   if (popup->timer) ecore_timer_del(popup->timer);
-   timeout = e_notification_timeout_get(popup->notif);
-   if (timeout == 0)
-     popup->timer = NULL;
-   else
-     popup->timer = ecore_timer_add(timeout == -1 ? dd->default_timeout : 
(float)timeout / 1000, 
-                                    _notification_timer_cb, 
-                                    popup);
-   
    return new_id;
 }
 
@@ -214,344 +355,7 @@
 _notification_cb_close_notification(E_Notification_Daemon *daemon __UNUSED__, 
                                     unsigned int id)
 {
-   _notification_popup_del(id, 
-                           E_NOTIFICATION_CLOSED_REQUESTED);
-}
-
-static int
-_notification_timer_cb(void *data)
-{
-   Popup_Data *popup = data;
-   _notification_popup_del(e_notification_id_get(popup->notif), 
-                           E_NOTIFICATION_CLOSED_EXPIRED);
-   return 0;
-}
-
-static void
-_notification_theme_cb_deleted(void *data, 
-                               Evas_Object *obj __UNUSED__, 
-                               const char *emission __UNUSED__, 
-                               const char *source __UNUSED__)
-{
-  Popup_Data *popup = data;
-  _notification_popup_refresh(popup);
-  edje_object_signal_emit(popup->theme, "notification,new", "notification");
-}
-
-static void
-_notification_theme_cb_close(void *data, 
-                             Evas_Object *obj __UNUSED__, 
-                             const char *emission __UNUSED__, 
-                             const char *source __UNUSED__)
-{
-  Popup_Data *popup = data;
-  _notification_popup_del(e_notification_id_get(popup->notif), 
-                          E_NOTIFICATION_CLOSED_DISMISSED);
-}
-
-static void
-_notification_theme_cb_find(void *data, 
-                            Evas_Object *obj __UNUSED__, 
-                            const char *emission __UNUSED__, 
-                            const char *source __UNUSED__)
-{
-  Popup_Data *popup = data;
-  Evas_List *l;
-
-  if (!popup->app_name) return;
-
-  for (l = e_border_client_list(); l; l = l->next)
-    {
-      int compare_len;
-      E_Border *bd = l->data;
-
-      compare_len = strlen(popup->app_name);
-      if (strlen(bd->client.icccm.name) < compare_len)
-        compare_len = strlen(bd->client.icccm.name);
-
-      /* We can't be sure that the app_name really match the application name.
-       * Some plugin put their name instead. But this search gives some good
-       * results.
-       */
-      if (!strncasecmp(bd->client.icccm.name, popup->app_name, compare_len))
-        {
-          e_desk_show(bd->desk);
-          e_border_show(bd);
-          e_border_raise(bd);
-          e_border_focus_set_with_pointer(bd);
-          break;
-        }
-    }
-}
-
-/* Local functions */
-static Popup_Data *
-_notification_popup_new(E_Notification *n)
-{
-   E_Container *con;
-   Popup_Data *popup;
-   char buf[PATH_MAX];
-   const char *shape_option;
-   int shaped;
-   Ecore_X_Window_State state[5] = { 
-     ECORE_X_WINDOW_STATE_STICKY,
-     ECORE_X_WINDOW_STATE_SKIP_TASKBAR,
-     ECORE_X_WINDOW_STATE_SKIP_PAGER,
-     ECORE_X_WINDOW_STATE_HIDDEN,
-     ECORE_X_WINDOW_STATE_ABOVE
-   };
-
-   popup = calloc(1, sizeof(Popup_Data));
-   if (!popup) return NULL;
-   e_notification_ref(n);
-   popup->notif = n;
-
-   con = e_container_current_get(e_manager_current_get());
-
-   /* Create the popup window */
-   popup->win = e_win_new(con);
-   e_win_name_class_set(popup->win, "E", "_notification_dialog");
-   e_win_title_set(popup->win, "Event Notification");
-   e_win_borderless_set(popup->win, 1);
-   e_win_placed_set(popup->win, 1);
-   e_win_sticky_set(popup->win, 1);
-   ecore_x_icccm_transient_for_set(popup->win->evas_win, con->win);
-   ecore_x_icccm_protocol_set(popup->win->evas_win, 
ECORE_X_WM_PROTOCOL_TAKE_FOCUS, 0);
-
-   ecore_x_netwm_window_type_set(popup->win->evas_win, 
ECORE_X_WINDOW_TYPE_DOCK);
-   ecore_x_netwm_window_state_set(popup->win->evas_win, state, 6);
-
-   popup->e = e_win_evas_get(popup->win);
-
-   /* Setup the theme */
-   snprintf(buf, sizeof(buf), "%s/e-module-notification.edj", 
notification_mod->dir);
-   popup->theme = edje_object_add(popup->e);
-   if (!e_theme_edje_object_set(popup->theme, 
"base/theme/modules/notification",
-                                "modules/notification/main"))
-     edje_object_file_set(popup->theme, buf, "modules/notification/main");
-   evas_object_show(popup->theme);
-   edje_object_signal_callback_add(popup->theme, "notification,deleted", 
"theme", 
-                                   _notification_theme_cb_deleted, popup);
-   edje_object_signal_callback_add(popup->theme, "notification,close", 
"theme", 
-                                   _notification_theme_cb_close, popup);
-   edje_object_signal_callback_add(popup->theme, "notification,find", "theme", 
-                                   _notification_theme_cb_find, popup);
-
-   shape_option = edje_object_data_get(popup->theme, "shaped");
-   if (shape_option)
-     {
-       if (!strcmp(shape_option, "1"))
-         shaped = 1;
-       else
-         shaped = 0;
-       if (e_config->use_composite)
-         {
-            ecore_evas_alpha_set(popup->win->ecore_evas, shaped);
-             e_container_window_raise(popup->win->container,
-                     
ecore_evas_software_x11_window_get(popup->win->ecore_evas),
-                     ecore_evas_layer_get(popup->win->ecore_evas));
-         }
-       else
-          {
-             e_win_shaped_set(popup->win, shaped);
-             e_win_avoid_damage_set(popup->win, shaped);
-          }
-     }
-
-   _notification_popup_refresh(popup);
-   _notification_popup_place(popup, evas_list_count(dd->popups));
-   e_win_show(popup->win);
-
-   return popup;
-}
-
-static void
-_notification_popup_place(Popup_Data *popup, int num)
-{
-   int x, y, w, h, dir = 0;
-
-   evas_object_geometry_get(popup->theme, NULL, NULL, &w, &h);
-   if (e_notification_hint_xy_get(popup->notif, &x, &y))
-     {
-       if (!popup->win->container) return;
-
-       if (x + w > popup->win->container->w)
-         x -= w;
-       if (y + h > popup->win->container->h)
-         y -= h;
-       e_win_move(popup->win, x, y);
-     }
-   else
-     {
-       switch (notification_cfg->direction)
-         {
-         case DIRECTION_DOWN:
-         case DIRECTION_RIGHT:
-           dir = 1;
-           break;
-         case DIRECTION_UP:
-         case DIRECTION_LEFT:
-           dir = -1;
-           break;
-         }
-
-       if (notification_cfg->direction == DIRECTION_DOWN ||
-           notification_cfg->direction == DIRECTION_UP)
-         e_win_move(popup->win, 
-                    notification_cfg->placement.x, 
-                    notification_cfg->placement.y 
-                    + dir * num * (h + notification_cfg->gap));
-       else
-         e_win_move(popup->win, 
-                    notification_cfg->placement.x 
-                    + dir * num * (w + notification_cfg->gap), 
-                    notification_cfg->placement.y);
-     }
-}
-
-static void
-_notification_popup_refresh(Popup_Data *popup)
-{
-   const char *icon_path;
-   char *msg;
-   void *img;
-   int w, h;
-
-   if (!popup) return;
-
-   popup->app_name = e_notification_app_name_get(popup->notif);
-
-   if (popup->app_icon) 
-     {
-       edje_object_part_unswallow(popup->theme, popup->app_icon);
-       evas_object_del(popup->app_icon);
-     }
-
-   /* Check if the app specify an icon either by a path or by a hint */
-   if ((icon_path = e_notification_app_icon_get(popup->notif)) && *icon_path)
-     {
-       popup->app_icon = evas_object_image_add(popup->e);
-       evas_object_image_load_scale_down_set(popup->app_icon, 1);
-       evas_object_image_load_size_set(popup->app_icon, 80, 80);
-       evas_object_image_file_set(popup->app_icon, icon_path, NULL);
-       evas_object_image_fill_set(popup->app_icon, 0, 0, 80, 80);
-     }
-   else if ((img = e_notification_hint_icon_data_get(popup->notif)))
-     {
-       popup->app_icon = e_notification_image_evas_object_add(popup->e, img);
-     }
-   evas_object_image_size_get(popup->app_icon, &w, &h);
-   edje_extern_object_min_size_set(popup->app_icon, w, h);
-   edje_extern_object_max_size_set(popup->app_icon, w, h);
-   edje_object_part_swallow(popup->theme, "notification.swallow.app_icon", 
popup->app_icon);
-
-   /* Fill up the event message */
-   msg = _notification_format_message(popup->notif);
-   edje_object_part_text_set(popup->theme, "notification.textblock.message", 
msg);
-   free(msg);
-
-   /* Compute the new size of the popup */
-   edje_object_size_min_calc(popup->theme, &w, &h);
-   e_win_size_min_set(popup->win, w, h);
-   e_win_size_max_set(popup->win, w, h);
-   e_win_resize(popup->win, w, h);
-   evas_object_resize(popup->theme, w, h);
-   edje_object_calc_force(popup->theme);
-}
-
-static Popup_Data *
-_notification_popup_find(unsigned int id)
-{
-   Evas_List *l;
-   Popup_Data *popup;
-
-   for (l = dd->popups; l && (popup = l->data); l = l->next)
-     if (e_notification_id_get(popup->notif) == id) return popup;
-
-   return NULL;
-}
-
-static void
-_notification_popup_del(unsigned int id, E_Notification_Closed_Reason reason)
-{
-   Popup_Data *popup;
-   Evas_List *l, *next;
-   int i;
-
-   for (l = dd->popups, i = 0; l && (popup = l->data); l = next)
-     {
-       next = l->next;
-       if (e_notification_id_get(popup->notif) == id)
-         {
-           _notification_popdown(popup, reason);
-           dd->popups = evas_list_remove_list(dd->popups, l);
-         }
-       else
-         {
-           _notification_popup_place(popup, i);
-           i++;
-         }
-     }
-}
-
-static void
-_notification_popdown(Popup_Data *popup, E_Notification_Closed_Reason reason)
-{
-   ecore_timer_del(popup->timer);
-   e_win_hide(popup->win);
-   evas_object_del(popup->app_icon);
-   evas_object_del(popup->theme);
-   e_object_del(E_OBJECT(popup->win));
-   e_notification_closed_set(popup->notif, 1);
-   e_notification_daemon_signal_notification_closed(dd->daemon, 
-                                                    
e_notification_id_get(popup->notif), 
-                                                    reason);
-   e_notification_unref(popup->notif);
-   free(popup);
-}
-
-static char *
-_notification_format_message(E_Notification *n)
-{
-   char *msg;
-   const char *orig;
-   char *dest;
-   int len;
-   int size = 512;
-
-   msg = calloc(1, 512);
-   snprintf(msg, 511, "<subject>%s</subject><br><body>",
-            e_notification_summary_get(n));
-   len = strlen(msg);
-
-   for (orig = e_notification_body_get(n), dest = msg + strlen(msg); orig && 
*orig; orig++)
-     {
-       if (len >= size - 4)
-         {
-           size = len + 512;
-           msg = realloc(msg, size);
-           msg = memset(msg + len, 0, size - len);
-           dest = msg + len;
-         }
-
-       if (*orig == '\n')
-         {
-           dest[0] = '<'; 
-           dest[1] = 'b'; 
-           dest[2] = 'r'; 
-           dest[3] = '>';
-           len += 4;
-           dest += 4;
-         }
-       else
-         {
-           *dest = *orig;
-           len++;
-           dest++;
-         }
-     }
-
-   return msg;
+   notification_popup_close(id);
 }
 
 static Config *
@@ -560,12 +364,15 @@
   Config *cfg;
 
   cfg = E_NEW(Config, 1);
-  cfg->cfd         = NULL;
-  cfg->version     = MOD_CFG_FILE_VERSION;
-  cfg->direction   = DIRECTION_DOWN;
-  cfg->gap         = 10;
-  cfg->placement.x = 10;
-  cfg->placement.y = 10;
+  cfg->cfd           = NULL;
+  cfg->version       = MOD_CFG_FILE_VERSION;
+  cfg->show_low      = 0;
+  cfg->show_normal   = 1;
+  cfg->show_critical = 1;
+  cfg->direction     = DIRECTION_DOWN;
+  cfg->gap           = 10;
+  cfg->placement.x   = 10;
+  cfg->placement.y   = 10;
   e_modapi_save(notification_mod);
 
   return cfg;
===================================================================
RCS file: /cvs/e/e_modules/notification/src/e_mod_main.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -3 -r1.2 -r1.3
--- e_mod_main.h        17 Jan 2008 22:01:58 -0000      1.2
+++ e_mod_main.h        2 Mar 2008 01:33:28 -0000       1.3
@@ -1,19 +1,18 @@
-#define D_(str) dgettext(PACKAGE, str)
-
 #ifndef E_MOD_MAIN_H
 #define E_MOD_MAIN_H
 
+#define HAVE_EDBUS 1
+#include <E_Notification_Daemon.h>
+#include <e.h>
+#include <Evas.h>
+
+#include "e_mod_macro.h"
+#include "e_mod_types.h"
+#include "e_mod_config_item.h"
+#include "e_mod_box.h"
+#include "e_mod_popup.h"
 #include "config.h"
 
-#define MOD_CFG_FILE_EPOCH 0x0001
-#define MOD_CFG_FILE_GENERATION 0x0001
-#define MOD_CFG_FILE_VERSION \
-   ((MOD_CFG_FILE_EPOCH << 16) | MOD_CFG_FILE_GENERATION)
-
-#undef __UNUSED__
-#define __UNUSED__ __attribute__((unused))
-
-typedef enum _Popup_Direction Popup_Direction;
 enum _Popup_Direction
 {
   DIRECTION_UP,
@@ -22,12 +21,14 @@
   DIRECTION_RIGHT
 };
 
-typedef struct _Config Config;
 struct _Config 
 {
    E_Config_Dialog *cfd;
 
    int version;
+   int show_low;
+   int show_normal;
+   int show_critical;
    Popup_Direction direction;
    int gap;
    struct 
@@ -35,6 +36,34 @@
         int x;
         int y;
      } placement;
+
+   E_Notification_Daemon *daemon;
+
+   Evas_List  *instances;
+   Evas_List  *n_box;
+   Evas_List  *config_dialog;
+   E_Menu     *menu;
+   Evas_List  *handlers;
+   Evas_List  *items;
+   Evas_List  *popups;
+   float       default_timeout;
+   int         next_id;
+};
+
+struct _Config_Item 
+{
+   const char *id;
+   int show_label;
+   int store_low;
+   int store_normal;
+   int store_critical;
+};
+
+struct _Instance 
+{
+   E_Gadcon_Client  *gcc;
+   Notification_Box *n_box;
+   Config_Item      *ci;
 };
 
 EAPI extern E_Module_Api e_modapi;
@@ -43,10 +72,14 @@
 EAPI int    e_modapi_shutdown(E_Module *m);
 EAPI int    e_modapi_save(E_Module *m);
 
+void             _gc_orient    (E_Gadcon_Client *gcc);
+
 EAPI E_Config_Dialog *e_int_config_notification_module(E_Container *con, 
                                                        const char *params 
__UNUSED__);
 
 extern E_Module *notification_mod;
 extern Config   *notification_cfg;
+extern const E_Gadcon_Client_Class _gc_class;
+extern int uuid;
 
 #endif



-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to