ATK插件化开发:AtkPlug,AtkSocket
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
- AtkPlug-嵌入其他进程的顶层
- 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相关推荐
- TinyFrame升级之八:实现简易插件化开发
本章主要讲解如何为框架新增插件化开发功能. 在.net 4.0中,我们可以在Application开始之前,通过PreApplicationStartMethod方法加载所需要的任何东西.那么今天我们 ...
- Android插件化开发之解决OpenAtlas组件在宿主的注冊问题
Android插件化开发之解决OpenAtlas组件在宿主的注冊问题 OpenAtlas有一个问题,就是四大组件必须在Manifest文件里进行注冊,那么就必定带来一个问题,插件中的组件都要反复在宿主 ...
- Android插件化开发之动态加载三个关键问题详解
本文摘选自任玉刚著<Android开发艺术探索>,介绍了Android插件化技术的原理和三个关键问题,并给出了作者自己发起的开源插件化框架. 动态加载技术(也叫插件化技术)在技术驱动型的公 ...
- Android插件化开发指南——Hook技术(一)【长文】
文章目录 1. 前言 2. 将外部dex加载到宿主app的dexElements中 3. 插件中四大组件的调用思路 4. Hook 2.1 对startActivity进行Hook 2.1.1 AMS ...
- Python为什么要使用包管理、插件化开发?
一.包管理 1.为什么使用包管理 目的是为了便于共享.为了更多项目调用使用,或者共享给别人,就需要打包,目的是为了复用. Pypi(Python Package Index)公共的模块存储中心.htt ...
- android中使用tmf框架插件化开发的问题
android中使用tmf框架插件化开发的问题 最近项目开发使用的是tmf框架,其中大多数都是通过源生和H5交互的方式来实现的,大体实现和别的三方框架是一样的,需要按照tmf的官方文档引入一些lib和 ...
- Android插件化开发之动态加载本地皮肤包进行换肤
Android插件化开发之动态加载本地皮肤包进行换肤 前言: 本文主要讲解如何用开源换肤框架 android-skin-loader-lib来实现加载本地皮肤包文件进行换肤,具体可自行参考框架原理进行 ...
- Android插件化开发指南——插件化技术简介
文章目录 1. 为什么需要插件化技术 2. 插件化技术的历史 3. 插件化实现思路 3.1 InfoQ:您在 GMTC 中的议题叫做<Android 插件化:从入门到放弃>,请问这个标题代 ...
- php 插件化开发模式,JavaScript_JavaScript插件化开发教程(六),一,开篇分析
今天这篇文章 - phpStudy...
JavaScript插件化开发教程(六) 一,开篇分析 今天这篇文章我们说点什么那?嘿嘿嘿.我们接着上篇文章对不足的地方进行重构,以深入浅出的方式来逐步分析,让大家有一个循序渐进提高的过程.废话少说, ...
最新文章
- 2022年了我才发现Chrome原来可以直接生成二维码...
- 曲面屏敲代码飞起,包邮送到家!
- Faster RCNN minibatch.py解读
- Nacos(三)之架构
- dubbo-快速入门-分布式RPC框架Apache Dubbo
- R语言统计分布及模拟
- java在线聊天项目1.0版 异常处理——开启多个客户端,关闭一个客户端后,在其他客户端中再发出信息会出现异常的处理...
- 秒懂C#通过Emit动态生成代码
- 第十五周项目3-在OJ上玩指针
- 高德地图No implementation found for long com.autonavi.amap.mapcore.MapCore
- 华为手表表盘的数字什么意思_华为gt2表盘上的数字是什么意思
- HTML 盒子模型( box-sizing: border-box)
- 指数分布在生活中的应用_概率论中指数分布的应用
- 计算机的时钟设置错误,谷歌浏览器用不了显示电脑时钟错误解决方法
- 紫乌鸦服务器维护后多久刷,魔兽世界boss刷新时间(世界boss刷新机制详解)
- 勇闯迷塔小游戏(c++) 3.17更新
- 骐俊CAT1模组 - MQTT接入腾讯云平台篇
- HTML动画XYZ轴的用法详解
- 反编译插件jad和jd-jui
- 零基础Unreal Engine 4(UE4)图文笔记之准备篇(一)