summaryrefslogtreecommitdiffstats
path: root/xparts/src/gtk/gtkpart.c
diff options
context:
space:
mode:
authortoma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2009-11-25 17:56:58 +0000
committertoma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2009-11-25 17:56:58 +0000
commit90825e2392b2d70e43c7a25b8a3752299a933894 (patch)
treee33aa27f02b74604afbfd0ea4f1cfca8833d882a /xparts/src/gtk/gtkpart.c
downloadtdebindings-90825e2392b2d70e43c7a25b8a3752299a933894.tar.gz
tdebindings-90825e2392b2d70e43c7a25b8a3752299a933894.zip
Copy the KDE 3.5 branch to branches/trinity for new KDE 3.5 features.
BUG:215923 git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdebindings@1054174 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'xparts/src/gtk/gtkpart.c')
-rw-r--r--xparts/src/gtk/gtkpart.c299
1 files changed, 299 insertions, 0 deletions
diff --git a/xparts/src/gtk/gtkpart.c b/xparts/src/gtk/gtkpart.c
new file mode 100644
index 00000000..740910fb
--- /dev/null
+++ b/xparts/src/gtk/gtkpart.c
@@ -0,0 +1,299 @@
+
+#include "gtkpart.h"
+
+#include <gdk/gdkx.h>
+
+#include <dcopc/util.h>
+#include <dcopc/marshal.h>
+#include <dcopc/dcopc.h>
+
+#include <string.h>
+#include <stdio.h>
+#include <assert.h>
+#include <stdlib.h>
+
+typedef struct _GtkXPartPrivate GtkXPartPrivate;
+
+struct _GtkXPartPrivate {
+ GtkWidget *widget;
+ gchar *host_app_id;
+ gchar *host_obj_id;
+ DcopClient *client;
+};
+
+#define P ((GtkXPartPrivate *)(part->data))
+#define CLASS(obj) GTK_XPART_CLASS(GTK_OBJECT(obj)->klass)
+
+
+/* class and instance initialization */
+
+static void
+gtk_xpart_class_init(GtkXPartClass *klass);
+
+static void
+gtk_xpart_init(GtkXPart *part);
+
+static void
+gtk_xpart_destroy( GtkObject *obj );
+
+/* dcop handlers */
+
+gboolean gtk_xpart_dcop_process( DcopObject *obj, const char *fun, dcop_data *data,
+ char **reply_type, dcop_data **reply_data );
+
+GList *gtk_xpart_dcop_functions( DcopObject *obj );
+
+GList *gtk_xpart_dcop_interfaces( DcopObject *obj );
+
+static DcopObjectClass *parent_class = 0;
+
+/* --------------------------- implementations --------------------------------------- */
+
+/* type information */
+GtkType
+gtk_xpart_get_type(void)
+{
+ static GtkType part_type = 0;
+ if (!part_type)
+ {
+ static const GtkTypeInfo part_info =
+ {
+ "GtkXPart",
+ sizeof(GtkXPart),
+ sizeof(GtkXPartClass),
+ (GtkClassInitFunc)gtk_xpart_class_init,
+ (GtkObjectInitFunc)gtk_xpart_init,
+ 0,
+ 0,
+ 0
+ };
+ part_type = gtk_type_unique(DCOP_TYPE_OBJECT, &part_info);
+ }
+ return part_type;
+}
+
+/* class and instance initialization */
+static void
+gtk_xpart_class_init(GtkXPartClass *klass)
+{
+ GtkObjectClass *object_class = (GtkObjectClass *)klass;
+ DcopObjectClass *dcop_class = DCOP_OBJECT_CLASS(klass);
+
+ parent_class = (DcopObjectClass *)gtk_type_class(dcop_object_get_type());
+
+ object_class->destroy = gtk_xpart_destroy;
+
+ dcop_class->process = gtk_xpart_dcop_process;
+ dcop_class->functions = gtk_xpart_dcop_functions;
+ dcop_class->interfaces = gtk_xpart_dcop_interfaces;
+
+ klass->open_url = 0;
+ klass->close_url = 0;
+ klass->query_extension = 0;
+
+ g_message( "gtk_xpart_class_init\n" );
+}
+
+static void
+gtk_xpart_init(GtkXPart *part)
+{
+ GtkXPartPrivate *d;
+ d = g_new( GtkXPartPrivate, 1 );
+ part->data = d;
+
+ dcop_object_set_id( DCOP_OBJECT(part), "XPartClient" );
+
+ d->widget = 0;
+ d->client = 0;
+ d->host_app_id = 0;
+ d->host_obj_id = 0;
+
+ g_message( "gtk_xpart_init\n" );
+}
+
+GtkXPart *gtk_xpart_new (void)
+{
+ return (GtkXPart *) gtk_type_new(gtk_xpart_get_type());
+}
+
+
+void gtk_xpart_set_widget( GtkXPart *part, GtkWidget *widget )
+{
+ GtkXPartPrivate *d = (GtkXPartPrivate *)part->data;
+ d->widget = widget;
+ gtk_object_ref( GTK_OBJECT( widget ) );
+}
+
+
+
+gboolean gtk_xpart_dcop_process( DcopObject *obj, const char *fun, dcop_data *data,
+ char **reply_type, dcop_data **reply_data )
+{
+ GtkXPart *part = GTK_XPART(obj);
+ GtkXPartPrivate *d = (GtkXPartPrivate *)part->data;
+ GtkXPartClass *klass = GTK_XPART_CLASS(GTK_OBJECT(part)->klass);
+ gboolean b;
+
+ if ( strcmp( fun, "windowId()" ) == 0 )
+ {
+ *reply_type = strdup( "Q_UINT32" );
+ *reply_data = dcop_data_ref( dcop_data_new() );
+
+ fprintf( stderr, "returning window id %ld\n", GDK_WINDOW_XWINDOW( d->widget->window ) );
+ dcop_marshal_uint32( *reply_data, GDK_WINDOW_XWINDOW( d->widget->window ) );
+
+ return True;
+ }
+ else if ( strcmp( fun, "show()" ) == 0 )
+ {
+ fprintf( stderr, "show %p!\n", d->widget );
+ gtk_widget_show_all( d->widget );
+ return True;
+ }
+ else if ( strcmp( fun, "openURL(QCString)" ) == 0 )
+ {
+ char *url;
+ fprintf( stderr, "openURL!\n" );
+ dcop_demarshal_string( data, &url );
+ b = FALSE;
+ if ( klass->open_url )
+ b = klass->open_url( part, url );
+ *reply_type = strdup( "bool" );
+ *reply_data = dcop_data_ref( dcop_data_new() );
+ dcop_marshal_boolean( *reply_data, b );
+ return True;
+ }
+ else if ( strcmp( fun, "closeURL()" ) == 0 )
+ {
+ fprintf( stderr, "closeURL!\n" );
+ b = FALSE;
+ if ( klass->close_url )
+ b = klass->close_url( part );
+ *reply_type = strdup( "bool" );
+ *reply_data = dcop_data_ref( dcop_data_new() );
+ dcop_marshal_boolean( *reply_data, b );
+ return True;
+ }
+ else if ( strcmp( fun, "activateAction(QCString,int)" ) == 0 )
+ {
+ char *name;
+ uint state;
+ dcop_demarshal_string( data, &name );
+ dcop_demarshal_uint32( data, &state );
+ fprintf( stderr, "activateAction %s state=%d\n", name, state );
+ gtk_signal_emit_by_name( GTK_OBJECT(part), name, state);
+ return True;
+ }
+ else if ( strcmp( fun, "queryExtension(QCString)" ) == 0 ) {
+ char *name;
+ char *extension = NULL;
+ dcop_demarshal_string( data, &name );
+ if ( klass->query_extension )
+ extension = klass->query_extension( part, name );
+ *reply_type = strdup( "DCOPRef" );
+ *reply_data = dcop_data_ref( dcop_data_new() );
+ dcop_marshal_string( *reply_data, dcop_client_app_id( P->client ) );
+ dcop_marshal_string( *reply_data, extension );
+ return True;
+ }
+
+ return parent_class->process( obj, fun, data, reply_type, reply_data );
+}
+
+GList *gtk_xpart_dcop_functions( DcopObject *obj )
+{
+ GList *res = parent_class->functions( obj );
+ res = g_list_append( res, g_strdup( "windowId()" ) );
+ res = g_list_append( res, g_strdup( "show()" ) );
+ res = g_list_append( res, g_strdup( "bool openURL(QString url)" ) );
+ res = g_list_append( res, g_strdup( "bool closeURL()" ) );
+ res = g_list_append( res, g_strdup( "queryExtension(QCString)" ) );
+ return res;
+}
+
+GList *gtk_xpart_dcop_interfaces( DcopObject *obj )
+{
+ GList *res = parent_class->interfaces( obj );
+ res = g_list_append( res, g_strdup( "XPart" ) );
+ return res;
+}
+
+void gtk_xpart_destroy( GtkObject *obj )
+{
+ GtkXPart *part = GTK_XPART(obj);
+ GtkXPartPrivate *d = (GtkXPartPrivate *) part->data;
+ g_free( d->host_app_id );
+ g_free( d->host_obj_id );
+
+ gtk_object_destroy( GTK_OBJECT( d->widget ) );
+
+ GTK_OBJECT_CLASS(parent_class)->destroy(obj);
+}
+
+void gtk_xpart_set_dcop_client( GtkXPart *part, DcopClient *client )
+{
+ P->client = client;
+}
+
+
+gboolean gtk_xpart_register( GtkXPart *part, const gchar *host_app_id, const gchar *host_obj_id)
+{
+ dcop_data *reply_data;
+ char *reply_type;
+ dcop_data *data = dcop_data_ref( dcop_data_new() );
+ GtkXPartPrivate *d = (GtkXPartPrivate *)part->data;
+
+ if(!P->client)
+ fprintf(stderr, "register a dcop client first!\n");
+
+ dcop_marshal_string( data, dcop_client_app_id( P->client ) );
+ dcop_marshal_string( data, DCOP_ID(DCOP_OBJECT(part)) );
+
+ if ( !dcop_client_call( P->client, host_app_id, host_obj_id, "registerXPart(DCOPRef)", data,
+ &reply_type, &reply_data ) ) {
+ fprintf( stderr, "cannot register with shell %s / %s\n", host_app_id, host_obj_id );
+ gtk_exit( 1 );
+ }
+ g_message( "back from registration call!" );
+
+ /*assert( strcmp( reply_type, "DCOPRef" ) == 0 );*/
+
+#if 0
+ /* this is wrong. but as we have the ref anyway, let's ignore the return value*/
+ dcop_demarshal_string( data, &d->host_app_id );
+ dcop_demarshal_string( data, &d->host_obj_id );
+
+ printf("appid=%s, objid=%s\n", d->host_app_id, d->host_obj_id);
+#endif
+ d->host_obj_id = g_strdup( host_obj_id );
+ d->host_app_id = g_strdup( host_app_id );
+
+ dcop_data_reset( reply_data );
+
+ dcop_data_deref( data );
+ g_message( "returning from gtk_xpart_register" );
+ return TRUE;
+}
+
+
+gboolean gtk_xpart_initialize_actions( GtkXPart *part, const char * actions )
+{
+ GtkXPartPrivate *d = (GtkXPartPrivate *) part->data;
+ dcop_data *data = 0;
+
+ g_message( "gtk_xpart_initialize_actions\n" );
+
+ if(!P->client)
+ g_message( "register a dcop client first!\n" );
+
+ data = dcop_data_ref( dcop_data_new() );
+ dcop_marshal_string( data, actions );
+
+ if( !dcop_client_send( d->client, d->host_app_id, d->host_obj_id, "createActions(QCString)", data ) ) {
+ fprintf( stderr, "could not create actions\n" );
+ dcop_data_deref( data );
+ return FALSE;
+ }
+ dcop_data_deref( data );
+ return TRUE;
+}