Trigger detach events.
authorSadrul Habib Chowdhury <sadrul@users.sourceforge.net>
Thu, 11 Jun 2009 16:33:06 +0000 (11 12:33 -0400)
committerSadrul Habib Chowdhury <sadrul@users.sourceforge.net>
Thu, 11 Jun 2009 16:33:06 +0000 (11 12:33 -0400)
For detach-events, it's not enough to just listen to 'detach'
command, since this command is not used for remote detaches. So
scripts looking to do something on a detach event need to hook to
this event, instead of hooking to 'cmdexecuted' event and looking
for 'detach' command.

src/lua.c
src/process.c
src/screen.c
src/script.c

index 161b47e..5c827f8 100644 (file)
--- a/src/lua.c
+++ b/src/lua.c
@@ -789,6 +789,13 @@ LuaPushParams(lua_State *L, const char *params, va_list va)
           break;
         case 'i':
           lua_pushinteger(L, va_arg(va, int));
+         break;
+       case 'd':
+         {
+           struct display *d = va_arg(va, struct display *);
+           push_display(L, &d);
+           break;
+         }
         }
       params++;
       num++;
index 65ffe8b..a4991a8 100644 (file)
@@ -4438,7 +4438,6 @@ int key;
 #ifdef SCRIPT
   if (nr < RC_LAST)
     trigger_sevent(&globalevents.cmdexecuted, comms[nr].name, args);
-    
 #endif
 
   if (display != odisplay)
index 49a79bb..0506b6e 100644 (file)
@@ -1904,6 +1904,7 @@ int mode;
     case D_DETACH:
       AddStrSock("detached");
       sign = SIG_BYE;
+      trigger_sevent(&globalevents.detached, display, 0x0);
       break;
 #ifdef BSDJOBS
     case D_STOP:
@@ -1914,6 +1915,7 @@ int mode;
     case D_REMOTE:
       AddStrSock("remote detached");
       sign = SIG_BYE;
+      trigger_sevent(&globalevents.detached, display, 0x1);
       break;
 #endif
 #ifdef POW_DETACH
@@ -1925,6 +1927,7 @@ int mode;
          AddStr("\r\n");
        }
       sign = SIG_POWER_BYE;
+      trigger_sevent(&globalevents.detached, display, 0x2);
       break;
 #ifdef REMOTE_DETACH
     case D_REMOTE_POWER:
@@ -1935,6 +1938,7 @@ int mode;
          AddStr("\r\n");
        }
       sign = SIG_POWER_BYE;
+      trigger_sevent(&globalevents.detached, display, 0x1 | 0x2); /* Remote and power */
       break;
 #endif
 #endif
index 22b8a27..6df0a78 100644 (file)
@@ -139,7 +139,7 @@ struct gevents globalevents;
  * s: string (char *)
  * S: string array (char **)
  * i: signed int
- * 
+ * d: display
  */
 
 struct sev_description {
@@ -147,8 +147,14 @@ struct sev_description {
     char *params;
     int offset;
 } event_table[] = {
+      /* Global events */
       {"global_cmdexecuted", "sS", offsetof(struct gevents, cmdexecuted)},
-      {"global_detached", "", offsetof(struct gevents, detached)},
+      {"global_detached", "di", offsetof(struct gevents, detached)},
+         /* The command "detach" triggers both 'cmdexecuted' and 'detached' events.
+            However, we need the 'detached' event to trigger callbacks from remote detaches.
+          */
+
+      /* Window events */
       {"window_resize", "", offsetof(struct win, w_sev.resize)},
       {"window_can_resize", "", offsetof(struct win, w_sev.canresize)}
 };