/* * Copyright (c) 2004, 2014, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. * * This code 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 * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ /* * @summary Native window for TaskXEmbedListeners and TaskXEmbedMemory. */ #include #include #include #include int n_children = 0; GSList *sockets = NULL; GtkWidget *window; GtkWidget *vbox; typedef struct { GtkWidget *box; GtkWidget *frame; GtkWidget *socket; } Socket; static void quit_cb (gpointer callback_data, guint callback_action, GtkWidget *widget) { GtkWidget *message_dialog = gtk_message_dialog_new (GTK_WINDOW (window), 0, GTK_MESSAGE_QUESTION, GTK_BUTTONS_NONE, "Really Quit?"); gtk_dialog_add_buttons (GTK_DIALOG (message_dialog), GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_QUIT, GTK_RESPONSE_YES, NULL); gtk_dialog_set_default_response (GTK_DIALOG (message_dialog), GTK_RESPONSE_YES); if (gtk_dialog_run (GTK_DIALOG (message_dialog)) == GTK_RESPONSE_YES) gtk_widget_destroy (window); gtk_widget_destroy (message_dialog); } static void socket_destroyed (GtkWidget *widget, Socket *socket) { sockets = g_slist_remove (sockets, socket); g_free (socket); } static void plug_added (GtkWidget *widget, Socket *socket) { g_print ("Plug added to socket\n"); gtk_widget_show (socket->socket); gtk_widget_hide (socket->frame); } static gboolean plug_removed (GtkWidget *widget, Socket *socket) { g_print ("Plug removed from socket\n"); gtk_widget_hide (socket->socket); gtk_widget_show (socket->frame); return TRUE; } static Socket * create_socket (void) { GtkWidget *label; Socket *socket = g_new (Socket, 1); socket->box = gtk_vbox_new (FALSE, 0); socket->socket = gtk_socket_new (); gtk_box_pack_start (GTK_BOX (socket->box), socket->socket, TRUE, TRUE, 0); socket->frame = gtk_frame_new (NULL); gtk_frame_set_shadow_type (GTK_FRAME (socket->frame), GTK_SHADOW_IN); gtk_box_pack_start (GTK_BOX (socket->box), socket->frame, TRUE, TRUE, 0); gtk_widget_show (socket->frame); label = gtk_label_new (NULL); gtk_label_set_markup (GTK_LABEL (label), "Empty"); gtk_container_add (GTK_CONTAINER (socket->frame), label); gtk_widget_show (label); sockets = g_slist_prepend (sockets, socket); g_signal_connect (G_OBJECT (socket->socket), "destroy", G_CALLBACK (socket_destroyed), socket); g_signal_connect (G_OBJECT (socket->socket), "plug_added", G_CALLBACK (plug_added), socket); g_signal_connect (G_OBJECT (socket->socket), "plug_removed", G_CALLBACK (plug_removed), socket); return socket; } void remove_child (void) { if (sockets) { Socket *socket = sockets->data; gtk_widget_destroy (socket->box); } } static gboolean child_read_watch (GIOChannel *channel, GIOCondition cond, gpointer data) { GIOStatus status; GError *error = NULL; char *line; gsize term; int xid; status = g_io_channel_read_line (channel, &line, NULL, &term, &error); switch (status) { case G_IO_STATUS_NORMAL: line[term] = '\0'; xid = strtol (line, NULL, 0); if (xid == 0) { fprintf (stderr, "Invalid window id '%s'\n", line); } else { Socket *socket = create_socket (); gtk_box_pack_start (GTK_BOX (vbox), socket->box, TRUE, TRUE, 0); gtk_widget_show (socket->box); gtk_socket_add_id (GTK_SOCKET (socket->socket), xid); } g_free (line); return TRUE; case G_IO_STATUS_AGAIN: return TRUE; case G_IO_STATUS_EOF: n_children--; g_io_channel_shutdown (channel, FALSE, NULL); return FALSE; case G_IO_STATUS_ERROR: fprintf (stderr, "Error reading fd from child: %s\n", error->message); exit (1); return FALSE; default: g_assert_not_reached (); return FALSE; } } int main (int argc, char *argv[]) { GtkWidget *hbox; Socket *socket; char buffer[20]; FILE *idFile; gtk_init (&argc, &argv); window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_widget_set_size_request (window, 300, 300); gtk_widget_set_uposition (window, 100, 100); g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); gtk_window_set_title (GTK_WINDOW (window), "XEmbed Test"); gtk_container_set_border_width (GTK_CONTAINER (window), 0); vbox = gtk_vbox_new (FALSE, 0); hbox = gtk_hbox_new (FALSE, 0); gtk_container_add (GTK_CONTAINER (window), vbox); gtk_box_pack_start (GTK_BOX(vbox), hbox, FALSE, FALSE, 0); socket = create_socket (); gtk_box_pack_start (GTK_BOX (vbox), socket->box, TRUE, TRUE, 0); sprintf(buffer, "%#lx", (gulong) gtk_socket_get_id (GTK_SOCKET (socket->socket))); idFile = fopen("window_id", "w"); if (idFile != NULL) { fprintf(idFile, "%s", buffer); fclose(idFile); } else { exit(1); } gtk_widget_show_all (window); gtk_main (); if (n_children) { g_print ("Waiting for children to exit\n"); while (n_children) g_main_context_iteration (NULL, TRUE); } return 0; }