Table of Contents

介绍

接口:

atk_plug_get_id ()

atk_socket_embed ()

AtkPlug例子

ta-plug.c

ta-plug-accessible.c

ta-plug-accessible.h

ta-plug-vbox.c

ta-plug-vbox.h

Makefile

AtkSocket例子

ta-socket.c

ta-socket-accessible.c

ta-socket-accessible.h

ta-socket-label.c

ta-socket-label.h

Makefile


介绍

AtkPlug介绍:https://developer.gnome.org/atk/unstable/atk-AtkPlug.html

AtkSocket介绍:https://developer.gnome.org/atk/stable/atk-AtkSocket.html

  1. AtkPlug-嵌入其他进程的顶层
  2. AtkSocket-用于来自其他进程的atkPlug对象的容器

接口:

atk_plug_get_id ()

gchar *atk_plug_get_id (AtkPlug *plug);

获取atkPlug对象的唯一ID,该对象可用于使用atk_socket_embed()嵌入atkSocket的内部。

在内部,这会调用一个类函数,该函数应该由IPC层(通常是AT-SPI2-ATK)注册。atkPlug对象的实现者应该调用这个函数(在加载atk桥之后),并将值传递给实现atkSocket的进程,这样它就可以嵌入这个插件。

atk_socket_embed ()

void atk_socket_embed (AtkSocket *obj,gchar *plug_id);

嵌入atkPlug的子级作为atkSocket的子级。插头可能处于同一进程或不同进程中。

这个函数使用的类项应该由IPC层(通常是AT-SPI2-ATK)填充。atksocket的实现者应该调用这个函数并传递atk_plug_get_id()返回的插件ID。应用程序负责根据需要将插件ID传递给实现atksocket的进程。

AtkPlug例子

ta-plug.c

/** Copyright (C) 2011 Igalia S.L.* Authors: Mario Sanchez Prada <msanchez@igalia.com>** Based on a C# example written in C# by Mike Gorse:* http://mgorse.freeshell.org/plug-socket-test.tar.gz** This program is free software; you can redistribute it and/or* modify it under the terms of version 3 of the GNU General Public* License as published by the Free Software Foundation.** This program is distributed in the hope that it will be useful,* but WITHOUT ANY WARRANTY; without even the implied warranty of* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU* General Public License for more details.** You should have received a copy of the GNU General Public* License along with this program; if not, write to the* Free Software Foundation, Inc., 59 Temple Place - Suite 330,* Boston, MA 02111-1307, USA.**/
#include "ta-plug-vbox.h"#include <gtk/gtk.h>#define WINDOW_WIDTH 350
#define WINDOW_HEIGHT -1static void
_button_clicked_cb (GtkButton *button, gpointer data)
{GtkWindow *window = GTK_WINDOW (data);GtkWidget *dialog =gtk_message_dialog_new (window,GTK_DIALOG_MODAL,GTK_MESSAGE_INFO,GTK_BUTTONS_CLOSE,"I told you so:\nthe button does ALMOST nothing",NULL);gtk_dialog_run (GTK_DIALOG (dialog));gtk_widget_destroy (dialog);
}int
main (int argc, char**argv)
{GtkWidget *window = NULL;GtkWidget *hbox = NULL;GtkWidget *plug = NULL;GtkWidget *widget = NULL;gchar *plug_id = NULL;gchar *entry_txt = NULL;gtk_init (&argc, &argv);window = gtk_window_new (GTK_WINDOW_TOPLEVEL);g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);plug = ta_plug_vbox_new (FALSE, 0);plug_id = ta_plug_vbox_get_id (TA_PLUG_VBOX (plug));if (plug_id)g_print ("[PLUG] Id is %s\n", plug_id);elseg_print ("Not a valid ID found\n");hbox = gtk_hbox_new (FALSE, 0);widget = gtk_label_new ("Plug ID: ");gtk_box_pack_start (GTK_BOX (hbox), widget, FALSE, FALSE, 6);widget = gtk_entry_new ();entry_txt = g_strdup_printf ("%s", plug_id);gtk_entry_set_text (GTK_ENTRY (widget), entry_txt);gtk_box_pack_start (GTK_BOX (hbox), widget, TRUE, TRUE, 6);gtk_box_pack_start (GTK_BOX (plug), hbox, TRUE, TRUE, 6);widget = gtk_button_new_with_label ("A button which does almost nothing");g_signal_connect (widget, "clicked", G_CALLBACK (_button_clicked_cb), window);gtk_box_pack_start (GTK_BOX (plug), widget, FALSE, FALSE, 6);g_free (entry_txt);g_free (plug_id);gtk_container_add (GTK_CONTAINER (window), plug);gtk_window_set_default_size (GTK_WINDOW (window),WINDOW_WIDTH, WINDOW_HEIGHT);gtk_widget_show_all (window);gtk_main ();
}

ta-plug-accessible.c

/** Copyright (C) 2011 Igalia S.L.* Authors: Mario Sanchez Prada <msanchez@igalia.com>** Based on a C# example written in C# by Mike Gorse:* http://mgorse.freeshell.org/plug-socket-test.tar.gz** This program is free software; you can redistribute it and/or* modify it under the terms of version 3 of the GNU General Public* License as published by the Free Software Foundation.** This program is distributed in the hope that it will be useful,* but WITHOUT ANY WARRANTY; without even the implied warranty of* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU* General Public License for more details.** You should have received a copy of the GNU General Public* License along with this program; if not, write to the* Free Software Foundation, Inc., 59 Temple Place - Suite 330,* Boston, MA 02111-1307, USA.**/
#include "ta-plug-accessible.h"#include <atk/atk.h>
#include <glib.h>
#include <gtk/gtk.h>struct _TaPlugAccessiblePrivate {GtkWidget *widget;
};#define TA_PLUG_ACCESSIBLE_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), TA_TYPE_PLUG_ACCESSIBLE, TaPlugAccessiblePrivate))G_DEFINE_TYPE (TaPlugAccessible, ta_plug_accessible, ATK_TYPE_PLUG);static void ta_plug_accessible_initialize (AtkObject *object, gpointer data)
{g_return_if_fail (TA_IS_PLUG_ACCESSIBLE (object));TaPlugAccessible *plug = NULL;TaPlugAccessiblePrivate *priv = NULL;ATK_OBJECT_CLASS(ta_plug_accessible_parent_class)->initialize(object, data);plug = TA_PLUG_ACCESSIBLE (object);priv = TA_PLUG_ACCESSIBLE_GET_PRIVATE(plug);priv->widget = NULL;if (GTK_IS_WIDGET (data))priv->widget = GTK_WIDGET (data);
}static const gchar *ta_plug_accessible_get_name (AtkObject *object)
{g_return_val_if_fail(ATK_IS_OBJECT (object), NULL);return "The Plug";
}static AtkRole ta_plug_accessible_get_role (AtkObject *object)
{g_return_val_if_fail(ATK_IS_OBJECT (object), ATK_ROLE_UNKNOWN);return ATK_ROLE_PANEL;
}static gint ta_plug_accessible_get_n_children (AtkObject *object)
{g_return_val_if_fail (TA_IS_PLUG_ACCESSIBLE (object), 0);TaPlugAccessible *plug = NULL;TaPlugAccessiblePrivate *priv = NULL;GList *children = NULL;GList *item = NULL;gint n_children = 0;plug = TA_PLUG_ACCESSIBLE (object);priv = TA_PLUG_ACCESSIBLE_GET_PRIVATE(plug);if (!priv->widget)return 0;if (!GTK_IS_CONTAINER (priv->widget))return 0;children = gtk_container_get_children (GTK_CONTAINER (priv->widget));n_children = g_list_length (children);g_list_free (children);return n_children;
}static AtkObject *ta_plug_accessible_ref_child (AtkObject *object, gint i)
{g_return_val_if_fail (TA_IS_PLUG_ACCESSIBLE (object), NULL);TaPlugAccessible *plug = NULL;TaPlugAccessiblePrivate *priv = NULL;GList *children = NULL;GList *item = NULL;gint n_children = 0;GtkWidget *child = NULL;AtkObject *axChild = NULL;plug = TA_PLUG_ACCESSIBLE (object);priv = TA_PLUG_ACCESSIBLE_GET_PRIVATE(plug);if (!priv->widget)return NULL;if (!GTK_IS_CONTAINER (priv->widget))return NULL;children = gtk_container_get_children (GTK_CONTAINER (priv->widget));if (i < 0 || i >= g_list_length (children))return NULL;child = GTK_WIDGET (g_list_nth_data (children, i));if (!child)return NULL;g_list_free (children);axChild = gtk_widget_get_accessible (child);return g_object_ref (axChild);
}static void ta_plug_accessible_dispose (GObject *object)
{TaPlugAccessible *plug = NULL;TaPlugAccessiblePrivate *priv = NULL;plug = TA_PLUG_ACCESSIBLE (object);priv = TA_PLUG_ACCESSIBLE_GET_PRIVATE(plug);if (priv->widget){g_object_unref (priv->widget);priv->widget = NULL;}G_OBJECT_CLASS(ta_plug_accessible_parent_class)->dispose(object);
}static void ta_plug_accessible_class_init (TaPlugAccessibleClass *klass)
{GObjectClass *g_object_class = G_OBJECT_CLASS(klass);AtkObjectClass *atk_object_class = NULL;g_object_class->dispose = ta_plug_accessible_dispose;atk_object_class = ATK_OBJECT_CLASS (klass);atk_object_class->initialize = ta_plug_accessible_initialize;atk_object_class->get_name = ta_plug_accessible_get_name;atk_object_class->get_role = ta_plug_accessible_get_role;atk_object_class->get_n_children = ta_plug_accessible_get_n_children;atk_object_class->get_index_in_parent = NULL;atk_object_class->ref_child = ta_plug_accessible_ref_child;g_type_class_add_private(g_object_class, sizeof(TaPlugAccessiblePrivate));
}static void ta_plug_accessible_init(TaPlugAccessible *plug)
{
}AtkObject *ta_plug_accessible_new ()
{return ATK_OBJECT (g_object_new(TA_TYPE_PLUG_ACCESSIBLE, 0));
}

ta-plug-accessible.h

/** Copyright (C) 2011 Igalia S.L.* Authors: Mario Sanchez Prada <msanchez@igalia.com>** Based on a C# example written in C# by Mike Gorse:* http://mgorse.freeshell.org/plug-socket-test.tar.gz** This program is free software; you can redistribute it and/or* modify it under the terms of version 3 of the GNU General Public* License as published by the Free Software Foundation.** This program is distributed in the hope that it will be useful,* but WITHOUT ANY WARRANTY; without even the implied warranty of* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU* General Public License for more details.** You should have received a copy of the GNU General Public* License along with this program; if not, write to the* Free Software Foundation, Inc., 59 Temple Place - Suite 330,* Boston, MA 02111-1307, USA.**/
#ifndef TaPlugAccessible_h
#define TaPlugAccessible_h#include <atk/atk.h>G_BEGIN_DECLS#define TA_TYPE_PLUG_ACCESSIBLE                      (ta_plug_accessible_get_type ())
#define TA_PLUG_ACCESSIBLE(obj)           (G_TYPE_CHECK_INSTANCE_CAST ((obj), TA_TYPE_PLUG_ACCESSIBLE, TaPlugAccessible))
#define TA_PLUG_ACCESSIBLE_CLASS(klass)   (G_TYPE_CHECK_CLASS_CAST ((klass), TA_TYPE_PLUG_ACCESSIBLE, TaPlugAccessibleClass))
#define TA_IS_PLUG_ACCESSIBLE(obj)                   (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TA_TYPE_PLUG_ACCESSIBLE))
#define TA_IS_PLUG_ACCESSIBLE_CLASS(klass)           (G_TYPE_CHECK_CLASS_TYPE ((klass), TA_TYPE_PLUG_ACCESSIBLE))
#define TA_PLUG_ACCESSIBLE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TA_TYPE_PLUG_ACCESSIBLE, TaPlugAccessibleClass))typedef struct _TaPlugAccessible                TaPlugAccessible;
typedef struct _TaPlugAccessibleClass           TaPlugAccessibleClass;
typedef struct _TaPlugAccessiblePrivate         TaPlugAccessiblePrivate;struct _TaPlugAccessible {AtkPlug parent;
};struct _TaPlugAccessibleClass {AtkPlugClass parentClass;
};GType ta_plug_accessible_get_type(void) G_GNUC_CONST;AtkObject *ta_plug_accessible_new (void);G_END_DECLS#endif // TaPlugAccessible_h

ta-plug-vbox.c

/** Copyright (C) 2011 Igalia S.L.* Authors: Mario Sanchez Prada <msanchez@igalia.com>** Based on a C# example written in C# by Mike Gorse:* http://mgorse.freeshell.org/plug-socket-test.tar.gz** This program is free software; you can redistribute it and/or* modify it under the terms of version 3 of the GNU General Public* License as published by the Free Software Foundation.** This program is distributed in the hope that it will be useful,* but WITHOUT ANY WARRANTY; without even the implied warranty of* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU* General Public License for more details.** You should have received a copy of the GNU General Public* License along with this program; if not, write to the* Free Software Foundation, Inc., 59 Temple Place - Suite 330,* Boston, MA 02111-1307, USA.**/
#include "ta-plug-vbox.h"#include "ta-plug-accessible.h"#include <glib.h>
#include <gtk/gtk.h>G_DEFINE_TYPE (TaPlugVBox, ta_plug_vbox, GTK_TYPE_VBOX);static AtkObject *_get_accessible (GtkWidget *widget)
{static AtkObject *new = NULL;if (!new){new = ta_plug_accessible_new ();atk_object_initialize (new, G_OBJECT (widget));}return new;
}static void ta_plug_vbox_class_init (TaPlugVBoxClass *klass)
{GtkWidgetClass *widget_class = (GtkWidgetClass *)klass;widget_class->get_accessible = _get_accessible;
}static void ta_plug_vbox_init(TaPlugVBox *plug)
{
}GtkWidget *ta_plug_vbox_new (gboolean homogeneous, gint spacing)
{return GTK_WIDGET (g_object_new(TA_TYPE_PLUG_VBOX,"homogeneous", homogeneous,"spacing", spacing,0));
}gchar *ta_plug_vbox_get_id (TaPlugVBox *plug)
{AtkObject *plugAxObject = NULL;gchar *text_id = NULL;plugAxObject = gtk_widget_get_accessible (GTK_WIDGET (plug));if (ATK_IS_PLUG (plugAxObject))text_id = atk_plug_get_id (ATK_PLUG (plugAxObject));elseg_print ("Not an instance of AtkPlug\n");return text_id;
}

ta-plug-vbox.h

/** Copyright (C) 2011 Igalia S.L.* Authors: Mario Sanchez Prada <msanchez@igalia.com>** Based on a C# example written in C# by Mike Gorse:* http://mgorse.freeshell.org/plug-socket-test.tar.gz** This program is free software; you can redistribute it and/or* modify it under the terms of version 3 of the GNU General Public* License as published by the Free Software Foundation.** This program is distributed in the hope that it will be useful,* but WITHOUT ANY WARRANTY; without even the implied warranty of* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU* General Public License for more details.** You should have received a copy of the GNU General Public* License along with this program; if not, write to the* Free Software Foundation, Inc., 59 Temple Place - Suite 330,* Boston, MA 02111-1307, USA.**/
#ifndef TaPlugVBox_h
#define TaPlugVBox_h#include <gtk/gtk.h>G_BEGIN_DECLS#define TA_TYPE_PLUG_VBOX            (ta_plug_vbox_get_type ())
#define TA_PLUG_VBOX(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), TA_TYPE_PLUG_VBOX, TaPlugVBox))
#define TA_PLUG_VBOX_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), TA_TYPE_PLUG_VBOX, TaPlugVBoxClass))
#define TA_IS_PLUG_VBOX(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TA_TYPE_PLUG_VBOX))
#define TA_IS_PLUG_VBOX_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TA_TYPE_PLUG_VBOX))
#define TA_PLUG_VBOX_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), TA_TYPE_PLUG_VBOX, TaPlugVBoxClass))typedef struct _TaPlugVBox                TaPlugVBox;
typedef struct _TaPlugVBoxClass           TaPlugVBoxClass;
typedef struct _TaPlugVBoxPrivate         TaPlugVBoxPrivate;struct _TaPlugVBox {GtkVBox parent;
};struct _TaPlugVBoxClass {GtkVBoxClass parentClass;
};GType ta_plug_vbox_get_type(void) G_GNUC_CONST;GtkWidget *ta_plug_vbox_new (gboolean homogeneous, gint spacing);gchar *ta_plug_vbox_get_id (TaPlugVBox *plug);G_END_DECLS#endif // TaPlugVBox_h

Makefile

CC=gcc
TARGET=ta-plug
SOURCES=ta-plug.c \ta-plug-vbox.h \ta-plug-vbox.c \ta-plug-accessible.h \ta-plug-accessible.cLIBS=atk gtk+-3.0
CFLAGS=`pkg-config --cflags $(LIBS)`
LDFLAGS=`pkg-config --libs $(LIBS)`all: compilecompile:$(CC) -o $(TARGET) $(SOURCES) $(CFLAGS) $(LDFLAGS)clean:rm -rf $(TARGET)rm -rf *~

AtkSocket例子

ta-socket.c

/** Copyright (C) 2011 Igalia S.L.* Authors: Mario Sanchez Prada <msanchez@igalia.com>** Based on a C# example written in C# by Mike Gorse:* http://mgorse.freeshell.org/plug-socket-test.tar.gz** This program is free software; you can redistribute it and/or* modify it under the terms of version 3 of the GNU General Public* License as published by the Free Software Foundation.** This program is distributed in the hope that it will be useful,* but WITHOUT ANY WARRANTY; without even the implied warranty of* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU* General Public License for more details.** You should have received a copy of the GNU General Public* License along with this program; if not, write to the* Free Software Foundation, Inc., 59 Temple Place - Suite 330,* Boston, MA 02111-1307, USA.**/
#include "ta-socket-label.h"#include <gtk/gtk.h>#define WINDOW_WIDTH 300
#define WINDOW_HEIGHT -1static GtkWidget *entry = NULL;
static GtkWidget *button = NULL;
static GtkWidget *socket = NULL;static void
_button_clicked_cb (GtkButton *button, gpointer data)
{AtkObject *socketAxObject = NULL;gchar *text_id = NULL;text_id = g_strdup (gtk_entry_get_text (GTK_ENTRY (entry)));if (text_id && text_id[0] != '\0'){socketAxObject = gtk_widget_get_accessible (socket);if (ATK_IS_SOCKET (socketAxObject)){g_print ("[SOCKET] Embedding object with ID %s\n", text_id);atk_socket_embed (ATK_SOCKET (socketAxObject), text_id);g_print ("[SOCKET] Done\n");}elseg_print ("Not embedding anything: Not an instance of AtkSocket\n");}elseg_print ("Not embedding: you need to provide an ID\n");g_free (text_id);
}static void
_create_widgets (GtkWidget *window)
{GtkWidget *vbox = NULL;vbox = gtk_vbox_new (FALSE, 0);/* Label + entry */entry = gtk_entry_new ();gtk_box_pack_start (GTK_BOX (vbox), entry, TRUE, TRUE, 6);button = gtk_button_new_with_label ("Connect to plug");g_signal_connect (button, "clicked", G_CALLBACK (_button_clicked_cb), NULL);gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 6);/* Our socket accessible */socket = ta_socket_label_new ("Socket accessible goes here");gtk_box_pack_start (GTK_BOX (vbox), socket, FALSE, FALSE, 6);gtk_container_add (GTK_CONTAINER (window), vbox);
}int
main (int argc, char**argv)
{GtkWidget *window = NULL;gtk_init (&argc, &argv);window = gtk_window_new (GTK_WINDOW_TOPLEVEL);g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);_create_widgets (window);gtk_window_set_default_size (GTK_WINDOW (window),WINDOW_WIDTH, WINDOW_HEIGHT);gtk_widget_show_all (window);gtk_main ();
}

ta-socket-accessible.c

/** Copyright (C) 2011 Igalia S.L.* Authors: Mario Sanchez Prada <msanchez@igalia.com>** Based on a C# example written in C# by Mike Gorse:* http://mgorse.freeshell.org/plug-socket-test.tar.gz** This program is free software; you can redistribute it and/or* modify it under the terms of version 3 of the GNU General Public* License as published by the Free Software Foundation.** This program is distributed in the hope that it will be useful,* but WITHOUT ANY WARRANTY; without even the implied warranty of* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU* General Public License for more details.** You should have received a copy of the GNU General Public* License along with this program; if not, write to the* Free Software Foundation, Inc., 59 Temple Place - Suite 330,* Boston, MA 02111-1307, USA.**/
#include "ta-socket-accessible.h"#include <atk/atk.h>
#include <glib.h>
#include <gtk/gtk.h>G_DEFINE_TYPE (TaSocketAccessible, ta_socket_accessible, ATK_TYPE_SOCKET);static const gchar *ta_socket_accessible_get_name (AtkObject *object)
{g_return_val_if_fail(ATK_IS_OBJECT (object), NULL);return "The Socket";
}static AtkRole ta_socket_accessible_get_role (AtkObject *object)
{g_return_val_if_fail(ATK_IS_OBJECT (object), ATK_ROLE_UNKNOWN);return ATK_ROLE_PANEL;
}static void ta_socket_accessible_class_init (TaSocketAccessibleClass *klass)
{AtkObjectClass *atk_object_class = NULL;atk_object_class = ATK_OBJECT_CLASS (klass);atk_object_class->get_name = ta_socket_accessible_get_name;atk_object_class->get_role = ta_socket_accessible_get_role;
}static void ta_socket_accessible_init(TaSocketAccessible *socket)
{
}AtkObject *ta_socket_accessible_new (void)
{return ATK_OBJECT (g_object_new(TA_TYPE_SOCKET_ACCESSIBLE, 0));
}

ta-socket-accessible.h

/** Copyright (C) 2011 Igalia S.L.* Authors: Mario Sanchez Prada <msanchez@igalia.com>** Based on a C# example written in C# by Mike Gorse:* http://mgorse.freeshell.org/plug-socket-test.tar.gz** This program is free software; you can redistribute it and/or* modify it under the terms of version 3 of the GNU General Public* License as published by the Free Software Foundation.** This program is distributed in the hope that it will be useful,* but WITHOUT ANY WARRANTY; without even the implied warranty of* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU* General Public License for more details.** You should have received a copy of the GNU General Public* License along with this program; if not, write to the* Free Software Foundation, Inc., 59 Temple Place - Suite 330,* Boston, MA 02111-1307, USA.**/
#ifndef TaSocketAccessible_h
#define TaSocketAccessible_h#include <atk/atk.h>G_BEGIN_DECLS#define TA_TYPE_SOCKET_ACCESSIBLE                      (ta_socket_accessible_get_type ())
#define TA_SOCKET_ACCESSIBLE(obj)           (G_TYPE_CHECK_INSTANCE_CAST ((obj), TA_TYPE_SOCKET_ACCESSIBLE, TaSocketAccessible))
#define TA_SOCKET_ACCESSIBLE_CLASS(klass)   (G_TYPE_CHECK_CLASS_CAST ((klass), TA_TYPE_SOCKET_ACCESSIBLE, TaSocketAccessibleClass))
#define TA_IS_SOCKET_ACCESSIBLE(obj)                   (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TA_TYPE_SOCKET_ACCESSIBLE))
#define TA_IS_SOCKET_ACCESSIBLE_CLASS(klass)           (G_TYPE_CHECK_CLASS_TYPE ((klass), TA_TYPE_SOCKET_ACCESSIBLE))
#define TA_SOCKET_ACCESSIBLE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TA_TYPE_SOCKET_ACCESSIBLE, TaSocketAccessibleClass))typedef struct _TaSocketAccessible                TaSocketAccessible;
typedef struct _TaSocketAccessibleClass           TaSocketAccessibleClass;
typedef struct _TaSocketAccessiblePrivate         TaSocketAccessiblePrivate;struct _TaSocketAccessible {AtkSocket parent;
};struct _TaSocketAccessibleClass {AtkSocketClass parentClass;
};GType ta_socket_accessible_get_type(void) G_GNUC_CONST;AtkObject *ta_socket_accessible_new (void);G_END_DECLS#endif // TaSocketAccessible_h

ta-socket-label.c

/** Copyright (C) 2011 Igalia S.L.* Authors: Mario Sanchez Prada <msanchez@igalia.com>** Based on a C# example written in C# by Mike Gorse:* http://mgorse.freeshell.org/plug-socket-test.tar.gz** This program is free software; you can redistribute it and/or* modify it under the terms of version 3 of the GNU General Public* License as published by the Free Software Foundation.** This program is distributed in the hope that it will be useful,* but WITHOUT ANY WARRANTY; without even the implied warranty of* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU* General Public License for more details.** You should have received a copy of the GNU General Public* License along with this program; if not, write to the* Free Software Foundation, Inc., 59 Temple Place - Suite 330,* Boston, MA 02111-1307, USA.**/
#include "ta-socket-label.h"#include "ta-socket-accessible.h"#include <glib.h>
#include <gtk/gtk.h>G_DEFINE_TYPE (TaSocketLabel, ta_socket_label, GTK_TYPE_LABEL);static AtkObject *_get_accessible (GtkWidget *widget)
{static AtkObject *new = NULL;if (!new){new = ta_socket_accessible_new ();atk_object_initialize (new, G_OBJECT (widget));}return new;
}static void ta_socket_label_class_init (TaSocketLabelClass *klass)
{GtkWidgetClass *widget_class = (GtkWidgetClass *)klass;widget_class->get_accessible = _get_accessible;
}static void ta_socket_label_init(TaSocketLabel *socket)
{
}GtkWidget *ta_socket_label_new (const gchar *text)
{return GTK_WIDGET (g_object_new(TA_TYPE_SOCKET_LABEL,"label", text,0));
}

ta-socket-label.h

/** Copyright (C) 2011 Igalia S.L.* Authors: Mario Sanchez Prada <msanchez@igalia.com>** Based on a C# example written in C# by Mike Gorse:* http://mgorse.freeshell.org/plug-socket-test.tar.gz** This program is free software; you can redistribute it and/or* modify it under the terms of version 3 of the GNU General Public* License as published by the Free Software Foundation.** This program is distributed in the hope that it will be useful,* but WITHOUT ANY WARRANTY; without even the implied warranty of* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU* General Public License for more details.** You should have received a copy of the GNU General Public* License along with this program; if not, write to the* Free Software Foundation, Inc., 59 Temple Place - Suite 330,* Boston, MA 02111-1307, USA.**/
#ifndef TaSocketLabel_h
#define TaSocketLabel_h#include <gtk/gtk.h>G_BEGIN_DECLS#define TA_TYPE_SOCKET_LABEL            (ta_socket_label_get_type ())
#define TA_SOCKET_LABEL(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), TA_TYPE_SOCKET_LABEL, TaSocketLabel))
#define TA_SOCKET_LABEL_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), TA_TYPE_SOCKET_LABEL, TaSocketLabelClass))
#define TA_IS_SOCKET_LABEL(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TA_TYPE_SOCKET_LABEL))
#define TA_IS_SOCKET_LABEL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TA_TYPE_SOCKET_LABEL))
#define TA_SOCKET_LABEL_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), TA_TYPE_SOCKET_LABEL, TaSocketLabelClass))typedef struct _TaSocketLabel                TaSocketLabel;
typedef struct _TaSocketLabelClass           TaSocketLabelClass;
typedef struct _TaSocketLabelPrivate         TaSocketLabelPrivate;struct _TaSocketLabel {GtkLabel parent;
};struct _TaSocketLabelClass {GtkLabelClass parentClass;
};GType ta_socket_label_get_type(void) G_GNUC_CONST;GtkWidget *ta_socket_label_new (const gchar *text);G_END_DECLS#endif // TaSocketLabel_h

Makefile

RGET=ta-socket
SOURCES=ta-socket.c \ta-socket-label.h \ta-socket-label.c \ta-socket-accessible.h \ta-socket-accessible.cLIBS=atk gtk+-3.0
CFLAGS=`pkg-config --cflags $(LIBS)`
LDFLAGS=`pkg-config --libs $(LIBS)`all: compilecompile:$(CC) -o $(TARGET) $(SOURCES) $(CFLAGS) $(LDFLAGS)clean:rm -rf $(TARGET)rm -rf *~

ATK插件化开发:AtkPlug,AtkSocket相关推荐

  1. TinyFrame升级之八:实现简易插件化开发

    本章主要讲解如何为框架新增插件化开发功能. 在.net 4.0中,我们可以在Application开始之前,通过PreApplicationStartMethod方法加载所需要的任何东西.那么今天我们 ...

  2. Android插件化开发之解决OpenAtlas组件在宿主的注冊问题

    Android插件化开发之解决OpenAtlas组件在宿主的注冊问题 OpenAtlas有一个问题,就是四大组件必须在Manifest文件里进行注冊,那么就必定带来一个问题,插件中的组件都要反复在宿主 ...

  3. Android插件化开发之动态加载三个关键问题详解

    本文摘选自任玉刚著<Android开发艺术探索>,介绍了Android插件化技术的原理和三个关键问题,并给出了作者自己发起的开源插件化框架. 动态加载技术(也叫插件化技术)在技术驱动型的公 ...

  4. Android插件化开发指南——Hook技术(一)【长文】

    文章目录 1. 前言 2. 将外部dex加载到宿主app的dexElements中 3. 插件中四大组件的调用思路 4. Hook 2.1 对startActivity进行Hook 2.1.1 AMS ...

  5. Python为什么要使用包管理、插件化开发?

    一.包管理 1.为什么使用包管理 目的是为了便于共享.为了更多项目调用使用,或者共享给别人,就需要打包,目的是为了复用. Pypi(Python Package Index)公共的模块存储中心.htt ...

  6. android中使用tmf框架插件化开发的问题

    android中使用tmf框架插件化开发的问题 最近项目开发使用的是tmf框架,其中大多数都是通过源生和H5交互的方式来实现的,大体实现和别的三方框架是一样的,需要按照tmf的官方文档引入一些lib和 ...

  7. Android插件化开发之动态加载本地皮肤包进行换肤

    Android插件化开发之动态加载本地皮肤包进行换肤 前言: 本文主要讲解如何用开源换肤框架 android-skin-loader-lib来实现加载本地皮肤包文件进行换肤,具体可自行参考框架原理进行 ...

  8. Android插件化开发指南——插件化技术简介

    文章目录 1. 为什么需要插件化技术 2. 插件化技术的历史 3. 插件化实现思路 3.1 InfoQ:您在 GMTC 中的议题叫做<Android 插件化:从入门到放弃>,请问这个标题代 ...

  9. php 插件化开发模式,JavaScript_JavaScript插件化开发教程(六),一,开篇分析 今天这篇文章 - phpStudy...

    JavaScript插件化开发教程(六) 一,开篇分析 今天这篇文章我们说点什么那?嘿嘿嘿.我们接着上篇文章对不足的地方进行重构,以深入浅出的方式来逐步分析,让大家有一个循序渐进提高的过程.废话少说, ...

最新文章

  1. 2022年了我才发现Chrome原来可以直接生成二维码...
  2. 曲面屏敲代码飞起,包邮送到家!
  3. Faster RCNN minibatch.py解读
  4. Nacos(三)之架构
  5. dubbo-快速入门-分布式RPC框架Apache Dubbo
  6. R语言统计分布及模拟
  7. java在线聊天项目1.0版 异常处理——开启多个客户端,关闭一个客户端后,在其他客户端中再发出信息会出现异常的处理...
  8. 秒懂C#通过Emit动态生成代码
  9. 第十五周项目3-在OJ上玩指针
  10. 高德地图No implementation found for long com.autonavi.amap.mapcore.MapCore
  11. 华为手表表盘的数字什么意思_华为gt2表盘上的数字是什么意思
  12. HTML 盒子模型( box-sizing: border-box)
  13. 指数分布在生活中的应用_概率论中指数分布的应用
  14. 计算机的时钟设置错误,谷歌浏览器用不了显示电脑时钟错误解决方法
  15. 紫乌鸦服务器维护后多久刷,魔兽世界boss刷新时间(世界boss刷新机制详解)
  16. 勇闯迷塔小游戏(c++) 3.17更新
  17. 骐俊CAT1模组 - MQTT接入腾讯云平台篇
  18. HTML动画XYZ轴的用法详解
  19. 反编译插件jad和jd-jui
  20. 零基础Unreal Engine 4(UE4)图文笔记之准备篇(一)

热门文章

  1. 思维导图Vue组件 mindmap
  2. GBDT算法之流失预警模型
  3. PHP并发IO编程实践
  4. Oracle中on和where的区别
  5. CSS3与页面布局学习总结(八)——浏览器兼容与前端性能优化
  6. DataList分页访问FooterTemplate模板里的控件
  7. 通过Filter统一全站编码
  8. XML Drawable
  9. 三类MySQL_Mysql中的三类锁,你知道吗?
  10. bmp转换tiff c++代码_如何快速转换图片格式