[236] in BarnOwl Developers

home help back first fref pref prev next nref lref last post

[D-O-H] r413 - trunk/owl

daemon@ATHENA.MIT.EDU (nelhage@MIT.EDU)
Thu Oct 29 18:03:59 2009

Resent-From: nelhage@mit.edu
Resent-To: barnowl-dev-mtg@charon.mit.edu
Date: Fri, 27 Oct 2006 15:08:01 -0400
To: dirty-owl-hackers@MIT.EDU
From: nelhage@MIT.EDU
Reply-To: dirty-owl-hackers@MIT.EDU

Author: nelhage
Date: 2006-10-27 15:07:59 -0400 (Fri, 27 Oct 2006)
New Revision: 413

Modified:
   trunk/owl/commands.c
   trunk/owl/functions.c
   trunk/owl/global.c
   trunk/owl/perlconfig.c
   trunk/owl/perlglue.xs
Log:
Exposing edit window hooks to perl

Modified: trunk/owl/commands.c
===================================================================
--- trunk/owl/commands.c	2006-10-27 19:01:06 UTC (rev 412)
+++ trunk/owl/commands.c	2006-10-27 19:07:59 UTC (rev 413)
@@ -2505,14 +2505,12 @@
 
 void owl_command_editresponse_done(owl_editwin *e)
 {
-  owl_global_set_response(&g, owl_editwin_get_text(e));
+  owl_function_run_buffercommand();
 
   owl_global_set_typwin_inactive(&g);
   owl_editwin_fullclear(e);
   wnoutrefresh(owl_editwin_get_curswin(e));
   owl_global_set_needrefresh(&g);
-
-  owl_function_run_buffercommand();
 }
 
 

Modified: trunk/owl/functions.c
===================================================================
--- trunk/owl/functions.c	2006-10-27 19:01:06 UTC (rev 412)
+++ trunk/owl/functions.c	2006-10-27 19:07:59 UTC (rev 413)
@@ -949,7 +949,7 @@
 
 void owl_callback_aimlogin(owl_editwin *e) {
   owl_function_aimlogin(owl_editwin_get_command(e),
-                        owl_global_get_response(&g));
+                        owl_editwin_get_text(e));
 }
 
 void owl_function_aimlogin(char *user, char *passwd) {

Modified: trunk/owl/global.c
===================================================================
--- trunk/owl/global.c	2006-10-27 19:01:06 UTC (rev 412)
+++ trunk/owl/global.c	2006-10-27 19:07:59 UTC (rev 413)
@@ -98,7 +98,6 @@
   owl_timer_create_countdown(&(g->aim_buddyinfo_timer), 60);
   owl_buddylist_init(&(g->buddylist));
     
-  g->response=NULL;
   g->havezephyr=0;
   g->haveaim=0;
   owl_global_set_no_doaimevents(g);
@@ -813,19 +812,6 @@
 			  s, (void(*)(void*))owl_style_free);
 }
 
-char *owl_global_get_response(owl_global *g)
-{
-  if (g->response==NULL) return("");
-  return(g->response);
-}
-
-void owl_global_set_response(owl_global *g, char *resp)
-{
-  if (g->response) owl_free(g->response);
-  g->response=owl_strdup(resp);
-}
-
-
 void owl_global_set_haveaim(owl_global *g)
 {
   g->haveaim=1;

Modified: trunk/owl/perlconfig.c
===================================================================
--- trunk/owl/perlconfig.c	2006-10-27 19:01:06 UTC (rev 412)
+++ trunk/owl/perlconfig.c	2006-10-27 19:07:59 UTC (rev 413)
@@ -377,3 +377,28 @@
 {
   SvREFCNT_dec(cmd);
 }
+
+void owl_perlconfig_edit_callback(owl_editwin *e)
+{
+  SV *cb = (SV*)(e->cbdata);
+  if(cb == NULL) {
+    owl_function_error("Perl callback is NULL!");
+  }
+
+  dSP;
+
+  ENTER;
+  SAVETMPS;
+
+  PUSHMARK(SP);
+  XPUSHs(sv_2mortal(newSVpv(owl_editwin_get_text(e), 0)));
+  PUTBACK;
+  
+  call_sv(cb, G_DISCARD);
+
+  FREETMPS;
+  LEAVE;
+
+  SvREFCNT_dec(cb);
+  e->cbdata = NULL;
+}

Modified: trunk/owl/perlglue.xs
===================================================================
--- trunk/owl/perlglue.xs	2006-10-27 19:01:06 UTC (rev 412)
+++ trunk/owl/perlglue.xs	2006-10-27 19:07:59 UTC (rev 413)
@@ -10,6 +10,8 @@
 #include "owl.h"
 SV *owl_perlconfig_curmessage2hashref(void);
 
+#define SV_IS_CODEREF(sv) (SvROK((sv)) && SvTYPE(SvRV((sv))) == SVt_PVCV)
+
 MODULE = owl		PACKAGE = owl		
 
 char *
@@ -83,6 +85,10 @@
 	PREINIT:
 		owl_cmd cmd;
 	CODE:
+	{
+		if(!SV_IS_CODEREF(func)) {
+			croak("Command function must be a coderef!");
+		}
 		SvREFCNT_inc(func);
 		cmd.name = name;
 		cmd.cmd_perl = func;
@@ -98,6 +104,7 @@
 		cmd.cmd_ctxv_fn = NULL;
 		cmd.cmd_ctxi_fn = NULL;
 		owl_cmddict_add_cmd(owl_global_get_cmddict(&g), &cmd);
+	   }
 
 void queue_message(msg) 
 	SV *msg
@@ -139,3 +146,61 @@
 
 		owl_global_messagequeue_addmsg(&g, m);
 	}
+
+void start_question(line, callback)
+	char *line
+	SV *callback
+	PREINIT:
+	CODE:
+	{
+		if(!SV_IS_CODEREF(callback))
+			croak("Callback must be a subref");
+
+		owl_function_start_question(line);
+
+		SvREFCNT_inc(callback);
+		owl_editwin_set_cbdata(owl_global_get_typwin(&g), callback);
+		owl_editwin_set_callback(owl_global_get_typwin(&g), owl_perlconfig_edit_callback);
+	}
+
+void start_password(line, callback)
+	char *line
+	SV *callback
+	PREINIT:
+	CODE:
+	{
+		if(!SV_IS_CODEREF(callback))
+			croak("Callback must be a subref");
+
+		owl_function_start_password(line);
+
+		SvREFCNT_inc(callback);
+		owl_editwin_set_cbdata(owl_global_get_typwin(&g), callback);
+		owl_editwin_set_callback(owl_global_get_typwin(&g), owl_perlconfig_edit_callback);
+	}
+
+void start_edit_win(line, callback)
+	char *line
+	SV *callback
+	PREINIT:
+		owl_editwin * e;
+		char buff[1024];
+	CODE:
+	{
+		if(!SV_IS_CODEREF(callback))
+			croak("Callback must be a subref");
+
+		e = owl_global_get_typwin(&g);
+		owl_editwin_new_style(e, OWL_EDITWIN_STYLE_MULTILINE,
+				      owl_global_get_msg_history(&g));
+		owl_editwin_clear(e);
+		owl_editwin_set_dotsend(e);
+		snprintf(buff, 1023, "----> %s\n", line);
+		owl_editwin_set_locktext(e, buff);
+
+		owl_global_set_typwin_active(&g);
+
+		SvREFCNT_inc(callback);
+		owl_editwin_set_cbdata(owl_global_get_typwin(&g), callback);
+		owl_editwin_set_callback(owl_global_get_typwin(&g), owl_perlconfig_edit_callback);
+	}


home help back first fref pref prev next nref lref last post