From 82b72e45dede504fad4bc5a27f5125d44b5a524d Mon Sep 17 00:00:00 2001 From: Nick Gasson Date: Mon, 4 Jan 2010 21:32:13 +0000 Subject: [PATCH] Add `think' support to daemon --- ChangeLog | 6 ++++++ src/Cowsay_glue.h | 5 +++-- src/cowsay.xml | 6 ++++++ src/display_cow.c | 17 ++++++++++++++++- src/xcowsayd.c | 27 +++++++++++++++++++-------- 5 files changed, 50 insertions(+), 11 deletions(-) diff --git a/ChangeLog b/ChangeLog index e3400bb..2e42e5e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -21,6 +21,12 @@ we can't parse Pango attributes. This may arise from valid input e.g. '1 < 0'. + * src/xcowsayd.c (cow_display_thread, wait_for_request) + (enqueue_request): Store the cow mode in request objects inside + the daemon. + (cowsay_think): New DBus method to implement + uk.me.doof.Cowsay.Think + 2010-01-03 Nick Gasson * src/xcowsay.c (main): Add --at option to specify cow location diff --git a/src/Cowsay_glue.h b/src/Cowsay_glue.h index 6840ee4..1602af5 100644 --- a/src/Cowsay_glue.h +++ b/src/Cowsay_glue.h @@ -107,13 +107,14 @@ G_END_DECLS #include static const DBusGMethodInfo dbus_glib_cowsay_methods[] = { { (GCallback) cowsay_show_cow, dbus_glib_marshal_cowsay_BOOLEAN__STRING_POINTER, 0 }, + { (GCallback) cowsay_think, dbus_glib_marshal_cowsay_BOOLEAN__STRING_POINTER, 38 }, }; const DBusGObjectInfo dbus_glib_cowsay_object_info = { 0, dbus_glib_cowsay_methods, - 1, -"uk.me.doof.Cowsay\0ShowCow\0S\0mess\0I\0s\0\0\0", + 2, +"uk.me.doof.Cowsay\0ShowCow\0S\0mess\0I\0s\0\0uk.me.doof.Cowsay\0Think\0S\0mess\0I\0s\0\0\0", "\0", "\0" }; diff --git a/src/cowsay.xml b/src/cowsay.xml index 771f20e..9b221e2 100644 --- a/src/cowsay.xml +++ b/src/cowsay.xml @@ -6,10 +6,16 @@ + + + + + + diff --git a/src/display_cow.c b/src/display_cow.c index f5ebcb3..9b0b135 100644 --- a/src/display_cow.c +++ b/src/display_cow.c @@ -334,8 +334,23 @@ bool try_dbus(bool debug, const char *text, cowmode_t mode) XCOWSAY_PATH, XCOWSAY_NAMESPACE); g_assert(proxy); + const char *method = NULL; + switch (mode) { + case COWMODE_NORMAL: + method = "ShowCow"; + break; + case COWMODE_THINK: + method = "Think"; + break; + case COWMODE_DREAM: + method = "Dream"; + break; + default: + g_assert(false); + } + error = NULL; - if (!dbus_g_proxy_call(proxy, "ShowCow", &error, G_TYPE_STRING, text, + if (!dbus_g_proxy_call(proxy, method, &error, G_TYPE_STRING, text, G_TYPE_INVALID, G_TYPE_INVALID)) { debug_err("ShowCow failed: %s\n", error->message); g_error_free(error); diff --git a/src/xcowsayd.c b/src/xcowsayd.c index c82c964..1c6e70a 100644 --- a/src/xcowsayd.c +++ b/src/xcowsayd.c @@ -43,6 +43,7 @@ static void cowsayd_init(Cowsay *server); static void cowsayd_class_init(CowsayClass *class); static gboolean cowsay_show_cow(Cowsay *obj, const gchar *mess, GError **error); +static gboolean cowsay_think(Cowsay *obj, const gchar *mess, GError **error); G_DEFINE_TYPE(Cowsay, cowsayd, G_TYPE_OBJECT); @@ -51,6 +52,7 @@ G_DEFINE_TYPE(Cowsay, cowsayd, G_TYPE_OBJECT); typedef struct _cowsay_queue_t { struct _cowsay_queue_t *next; char *message; + cowmode_t mode; } cowsay_queue_t; static cowsay_queue_t *requests = NULL; @@ -64,11 +66,12 @@ static GCond *display_complete = NULL; #define REQUEST_READY_WAIT g_cond_wait(request_ready, queue_lock) #define REQUEST_READY_SIGNAL g_cond_signal(request_ready) -static void enqueue_request(const char *mess) +static void enqueue_request(const char *mess, cowmode_t mode) { cowsay_queue_t *req = (cowsay_queue_t*)malloc(sizeof(cowsay_queue_t)); req->next = NULL; req->message = malloc(strlen(mess)+1); + req->mode = mode; g_assert(req->message); strcpy(req->message, mess); @@ -88,18 +91,17 @@ static void enqueue_request(const char *mess) QUEUE_MUTEX_UNLOCK; } -static const char *wait_for_request(void) +static void wait_for_request(const char** mess, cowmode_t *mode) { - const char *r = NULL; QUEUE_MUTEX_LOCK; { while (NULL == requests) { REQUEST_READY_WAIT; } - r = requests->message; + *mess = requests->message; + *mode = requests->mode; } QUEUE_MUTEX_UNLOCK; - return r; } static void request_complete() @@ -122,14 +124,16 @@ static gpointer cow_display_thread(gpointer data) debug_msg("In the cow display thread\n"); for (;;) { - const char *mess = wait_for_request(); + const char *mess; + cowmode_t mode; + wait_for_request(&mess, &mode); debug_msg("Processing request: %s\n", mess); // We need to wrap the GTK+ stuff in gdk_threads_X since // GTK assumes it is being called from the main thread // (and it isn't here) gdk_threads_enter(); - display_cow(debug, mess, false, COWMODE_NORMAL); + display_cow(debug, mess, false, mode); gdk_threads_leave(); g_cond_wait(display_complete, display_lock); @@ -187,7 +191,14 @@ static void cowsayd_init(Cowsay *server) static gboolean cowsay_show_cow(Cowsay *obj, const gchar *mess, GError **error) { printf("cowsay_show_cow mess=%s\n", mess); - enqueue_request(mess); + enqueue_request(mess, COWMODE_NORMAL); + return true; +} + +static gboolean cowsay_think(Cowsay *obj, const gchar *mess, GError **error) +{ + printf("cowsay_think mess=%s\n", mess); + enqueue_request(mess, COWMODE_THINK); return true; } -- 2.39.2