static void
egg_tray_manager_handle_dock_request (EggTrayManager       *manager,
				      XClientMessageEvent  *xevent)
{
  GtkWidget *socket;
  Window *window;
  
  socket = gtk_socket_new ();
  
  /* We need to set the child window here
   * so that the client can call _get functions
   * in the signal handler
   */
  window = g_new (Window, 1);
  *window = xevent->data.l[2];
      
  g_object_set_data_full (G_OBJECT (socket),
			  "egg-tray-child-window",
			  window, g_free);
  g_signal_emit (manager, manager_signals[TRAY_ICON_ADDED], 0,
		 socket);

  /* Add the socket only if it's been attached */
  if (GTK_IS_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (socket))))
    {
      g_signal_connect (socket, "plug_removed",
			G_CALLBACK (egg_tray_manager_plug_removed), manager);
      
      gtk_socket_add_id (GTK_SOCKET (socket), xevent->data.l[2]);

      g_hash_table_insert (manager->socket_table, GINT_TO_POINTER (xevent->data.l[2]), socket);
    }
  else
    gtk_widget_destroy (socket);
}
static void
gtk_xtbin_realize (GtkWidget *widget)
{
  GtkXtBin     *xtbin;
  GtkAllocation allocation = { 0, 0, 200, 200 };
#if GTK_CHECK_VERSION(2, 18, 0)
  GtkAllocation widget_allocation;
#endif

#ifdef DEBUG_XTBIN
  printf("gtk_xtbin_realize()\n");
#endif

  g_return_if_fail (GTK_IS_XTBIN (widget));

  xtbin = GTK_XTBIN (widget);

  /* caculate the allocation before realize */
#if GTK_CHECK_VERSION(2, 24, 0)
  allocation.width = gdk_window_get_width(xtbin->parent_window);
  allocation.height = gdk_window_get_height(xtbin->parent_window);
#else
  gint  x, y, w, h, d; /* geometry of window */
  gdk_window_get_geometry(xtbin->parent_window, &x, &y, &w, &h, &d);
  allocation.width = w;
  allocation.height = h;
#endif
  gtk_widget_size_allocate (widget, &allocation);

#ifdef DEBUG_XTBIN
  printf("initial allocation %d %d %d %d\n", x, y, w, h);
#endif

#if GTK_CHECK_VERSION(2, 18, 0)
  gtk_widget_get_allocation(widget, &widget_allocation);
  xtbin->width = widget_allocation.width;
  xtbin->height = widget_allocation.height;
#else
  xtbin->width = widget->allocation.width;
  xtbin->height = widget->allocation.height;
#endif

  /* use GtkSocket's realize */
  (*GTK_WIDGET_CLASS(parent_class)->realize)(widget);

  /* create the Xt client widget */
  xt_client_create(&(xtbin->xtclient), 
       gtk_socket_get_id(GTK_SOCKET(xtbin)), 
       xtbin->height, 
       xtbin->width);
  xtbin->xtwindow = XtWindow(xtbin->xtclient.child_widget);

  gdk_flush();

  /* now that we have created the xt client, add it to the socket. */
  gtk_socket_add_id(GTK_SOCKET(widget), xtbin->xtwindow);
}
int main(int argc, char **argv)
{
  GtkWidget *window, *button, *textview, *vbox;
  GtkWidget *socket, *plug, *socket_box;

  unsigned long     kb_xid;

  gtk_init (&argc, &argv);

  install_signal_handlers();

  kb_xid = launch_keyboard();

  if (!kb_xid)
    {
      perror ("### 'matchbox-keyboard --xid', failed to return valid window ID. ### ");
      exit(-1);
    }

  /* Window */

  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);

  gtk_window_set_default_size (GTK_WINDOW (window), 640, 480);
  gtk_container_set_border_width (GTK_CONTAINER (window), 10);

  g_signal_connect (G_OBJECT (window), "destroy",
		    G_CALLBACK (widget_destroy), NULL);

  /* Container and textview */

  vbox = gtk_vbox_new(FALSE, 5);
  gtk_container_add (GTK_CONTAINER (window), vbox);
  
  textview = gtk_text_view_new();
  gtk_box_pack_start (GTK_BOX(vbox), textview, TRUE, TRUE, 2);

  /* Socket ( XEMBED ) stuff */

  socket_box = gtk_event_box_new ();
  gtk_widget_show (socket_box);
  
  socket = gtk_socket_new ();

  gtk_container_add (GTK_CONTAINER (socket_box), socket);
  gtk_box_pack_start (GTK_BOX (vbox), GTK_WIDGET(socket_box), TRUE, TRUE, 0);
  gtk_socket_add_id(GTK_SOCKET(socket), kb_xid); 

  /* FIXME: handle "plug-added" & "plug-removed" signals for socket */

  gtk_widget_show_all (window);

  gtk_main ();

  return 0;
}
示例#4
0
static gint
luaH_socket_newindex(lua_State *L, luapdf_token_t token)
{
    widget_t *w = luaH_checkwidget(L, 1);
    if (token == L_TK_ID) {
        gint id = luaL_checkint(L, 2);
        gtk_socket_add_id(GTK_SOCKET(w->widget), (GdkNativeWindow) id);
    }
    return 0;
}
示例#5
0
文件: testsocket.c 项目: BYC/gtk
void
add_local_passive_child (GtkWidget *window)
{
  Socket *socket;
  Window xid;

  socket = create_socket ();
  gtk_box_pack_start (GTK_BOX (box), socket->box, TRUE, TRUE, 0);
  gtk_widget_show (socket->box);

  xid = create_child_plug (0, TRUE);
  gtk_socket_add_id (GTK_SOCKET (socket->socket), xid);
}
示例#6
0
/* [gtk thread] */
static gboolean do_create_display_hook(gpointer data)
{
   const ARGS_CREATE *args = _al_gtk_lock_args(data);
   ALLEGRO_DISPLAY *display = (ALLEGRO_DISPLAY *)args->display;
   ALLEGRO_DISPLAY_XGLX *d = args->display;
   const int w = args->w;
   const int h = args->h;

   GtkWidget *window;
   GtkWidget *vbox;
   GtkWidget *socket;

   window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
   d->gtk->gtkwindow = window;
   gtk_window_set_default_size(GTK_WINDOW(window), w, h);

   g_signal_connect(G_OBJECT(window), "delete-event",
      G_CALLBACK(xgtk_quit_callback), display);
   g_signal_connect(G_OBJECT(window), "configure-event",
      G_CALLBACK(xgtk_handle_configure_event), display);

   vbox = gtk_vbox_new(FALSE, 0);
   gtk_container_add(GTK_CONTAINER(window), vbox);

   socket = gtk_socket_new();
   d->gtk->gtksocket = socket;
   gtk_box_pack_end(GTK_BOX(vbox), socket, TRUE, TRUE, 0);
   gtk_socket_add_id(GTK_SOCKET(socket), d->window);
   ALLEGRO_DEBUG("gtk_socket_add_id: window = %ld\n", d->window);

   gtk_window_set_title(GTK_WINDOW(window), args->title);

   gtk_widget_show_all(window);

   if (display->flags & ALLEGRO_RESIZABLE) {
      /* Allow socket widget to be resized smaller than initial size. */
      gtk_widget_set_size_request(socket, -1, -1);
      gtk_window_set_resizable(GTK_WINDOW(window), true);
   }
   else {
      gtk_window_set_resizable(GTK_WINDOW(window), false);
   }

   if (display->flags & ALLEGRO_FULLSCREEN_WINDOW) {
      gtk_window_fullscreen(GTK_WINDOW(window));
   }

   d->overridable_vt = &xgtk_override_vt;

   return _al_gtk_release_args(data);
}
示例#7
0
文件: socket.c 项目: amery/clip-itk
int
clip_GTK_SOCKETADDID(ClipMachine * cm)
{
	C_widget *csocket = _fetch_cw_arg(cm);
        GdkNativeWindow id = _clip_parni(cm, 2);

	CHECKCWID(csocket,GTK_IS_SOCKET);
        CHECKARG(2, NUMERIC_t);

	gtk_socket_add_id(GTK_SOCKET(csocket->widget), id);

	return 0;
err:
	return 1;
}
GdkWindow *
awn_ua_alignment_add_id (AwnUAAlignment *self,GdkNativeWindow native_window)
{
  GdkWindow * plugwin;
  AwnUAAlignmentPrivate *priv;

  priv =  AWN_UA_ALIGNMENT_GET_PRIVATE (self); 
  gtk_socket_add_id (GTK_SOCKET(priv->socket), native_window);
  plugwin = gtk_socket_get_plug_window (GTK_SOCKET(priv->socket));
  g_signal_connect (priv->socket,"plug-removed",
                    G_CALLBACK(awn_ua_alignment_plug_removed),self);
  gtk_widget_realize (priv->socket);
  gtk_widget_show_all (priv->socket);
  return plugwin;
}
示例#9
0
文件: socket.c 项目: zdia/gnocl
/***f* socket/staticFuncs/configure
 * AUTHOR
 *	PGB
 * SOURCE
 */
static int configure ( Tcl_Interp *interp, GtkSocket *socket,
					   GnoclOption options[] )
{
	if ( options[plugIDIdx].status == GNOCL_STATUS_CHANGED )
	{
		long xid;

		if ( Tcl_GetLongFromObj ( interp, options[plugIDIdx].val.obj, &xid )
				!= TCL_OK )
			return TCL_ERROR;

		gtk_socket_add_id ( socket, xid );
	}

	return TCL_OK;
}
static void
realize_cb (GtkWidget *socket, gpointer user_data)
{
    GtkWidget *plug, *w;

    g_warning ("Realize");

    plug = gtk_plug_new (0);
    w = gtk_button_new_with_label ("Baa");
    gtk_widget_show_all (w);
    gtk_widget_show (plug);
    gtk_container_add (GTK_CONTAINER (plug), w);
    GTK_PLUG (plug)->socket_window = GTK_WIDGET (socket)->window;
    gtk_socket_add_id (GTK_SOCKET (socket),
                       gtk_plug_get_id (GTK_PLUG (plug)));
    gdk_window_show (GTK_WIDGET (plug)->window);
}
示例#11
0
static void
na_tray_manager_handle_dock_request (NaTrayManager       *manager,
				     XClientMessageEvent *xevent)
{
  Window icon_window = xevent->data.l[2];
  GtkWidget *child;

  if (g_hash_table_lookup (manager->socket_table,
                           GINT_TO_POINTER (icon_window)))
    {
      /* We already got this notification earlier, ignore this one */
      return;
    }

  child = na_tray_child_new (manager->screen, icon_window);
  if (child == NULL) /* already gone or other error */
    return;

  g_signal_emit (manager, manager_signals[TRAY_ICON_ADDED], 0,
		 child);

  /* If the child wasn't attached, then destroy it */

  if (!GTK_IS_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (child))))
    {
      gtk_widget_destroy (child);
      return;
    }

  g_signal_connect (child, "plug_removed",
		    G_CALLBACK (na_tray_manager_plug_removed), manager);

  gtk_socket_add_id (GTK_SOCKET (child), icon_window);

  if (!GTK_SOCKET (child)->plug_window)
    {
      /* Embedding failed, we won't get a plug-removed signal */
      g_signal_emit (manager, manager_signals[TRAY_ICON_REMOVED], 0, child);
      gtk_widget_destroy (child);
      return;
    }

  g_hash_table_insert (manager->socket_table,
                       GINT_TO_POINTER (icon_window), child);
  gtk_widget_show (child);
}
示例#12
0
文件: testsocket.c 项目: BYC/gtk
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 (box), 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--;
      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;
    }
  
}
示例#13
0
void MCNativeLayerX11::doAttach()
{
    if (m_socket == NULL)
    {
        // Create a new GTK socket to deal with the XEMBED protocol
        GtkSocket *t_socket;
		t_socket = GTK_SOCKET(gtk_socket_new());
        
        // Create a new GTK window to hold the socket
        MCRectangle t_rect;
        t_rect = m_object->getrect();
        m_child_window = GTK_WINDOW(gtk_window_new(GTK_WINDOW_POPUP));
        gtk_widget_set_parent_window(GTK_WIDGET(m_child_window), getStackGdkWindow());
        gtk_widget_realize(GTK_WIDGET(m_child_window));
        gdk_window_reparent(gtk_widget_get_window(GTK_WIDGET(m_child_window)), getStackGdkWindow(), t_rect.x, t_rect.y);
        
        // Add the socket to the window
        gtk_container_add(GTK_CONTAINER(m_child_window), GTK_WIDGET(t_socket));
        
        // The socket needs to be realised before going any further or any
        // operations on it will fail.
        gtk_widget_realize(GTK_WIDGET(t_socket));
        
        // Show the socket (we'll control visibility at the window level)
        gtk_widget_show(GTK_WIDGET(t_socket));
        
        // Create an empty region to act as an input mask while in edit mode
        m_input_shape = gdk_region_new();

		// Retain a reference to the socket
		m_socket = GTK_SOCKET(g_object_ref(G_OBJECT(t_socket)));
    }
    
    // Attach the X11 window to this socket
    if (gtk_socket_get_plug_window(m_socket) == NULL)
        gtk_socket_add_id(m_socket, m_widget_xid);
    //fprintf(stderr, "XID: %u\n", gtk_socket_get_id(m_socket));
    
    // Act as if there were a re-layer to put the widget in the right place
    doRelayer();
    doSetViewportGeometry(m_viewport_rect);
    doSetGeometry(m_rect);
    doSetVisible(ShouldShowLayer());
}
示例#14
0
文件: notebook.c 项目: BunsenLabs/yad
void
notebook_swallow_childs (void)
{
  guint i, n_tabs;

  n_tabs = g_slist_length (options.notebook_data.tabs);

  /* wait until all children are register */
  while (tabs[0].xid != n_tabs)
    usleep (1000);

  for (i = 1; i <= n_tabs; i++)
    {
      GtkWidget *s =
        GTK_WIDGET (g_object_get_data
                    (G_OBJECT (gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook), i - 1)), "socket"));

      if (tabs[i].pid != -1)
        gtk_socket_add_id (GTK_SOCKET (s), tabs[i].xid);
    }
}
示例#15
0
static gboolean
remmina_plugin_nx_start_session (RemminaProtocolWidget *gp)
{
    RemminaPluginNxData *gpdata;
    RemminaFile *remminafile;
    RemminaNXSession *nx;
    const gchar *type, *app;
    gchar *s1, *s2;
    gint port;
    gint ret;
    gboolean is_empty_list;
    gint event_type = 0;
    const gchar *cs;
    gint i;

    gpdata = (RemminaPluginNxData*) g_object_get_data (G_OBJECT (gp), "plugin-data");
    remminafile = remmina_plugin_nx_service->protocol_plugin_get_file (gp);
    nx = gpdata->nx;

    /* Connect */

    remmina_nx_session_set_encryption (nx,
        remmina_plugin_nx_service->file_get_int (remminafile, "disableencryption", FALSE) ? 0 : 1);
    remmina_nx_session_set_localport (nx, remmina_plugin_nx_service->pref_get_sshtunnel_port ());
    remmina_nx_session_set_log_callback (nx, remmina_plugin_nx_service->log_printf);

    s2 = remmina_plugin_nx_service->protocol_plugin_start_direct_tunnel (gp, 22, FALSE);
    if (s2 == NULL)
    {
        return FALSE;
    }
    remmina_plugin_nx_service->get_server_port (s2, 22, &s1, &port);
    g_free (s2);

    if (!remmina_nx_session_open (nx, s1, port,
        remmina_plugin_nx_service->file_get_string (remminafile, "nx_privatekey"),
        remmina_plugin_nx_ssh_auth_callback, gp))
    {
        g_free (s1);
        return FALSE;
    }
    g_free (s1);

    /* Login */

    s1 = g_strdup (remmina_plugin_nx_service->file_get_string (remminafile, "username"));
    THREADS_ENTER
    s2 = remmina_plugin_nx_service->file_get_secret (remminafile, "password");
    THREADS_LEAVE
    if (s1 && s2)
    {
        ret = remmina_nx_session_login (nx, s1, s2);
    }
    else
    {
        g_free (s1);
        g_free (s2);

        THREADS_ENTER
        ret = remmina_plugin_nx_service->protocol_plugin_init_authuserpwd (gp, FALSE);
        THREADS_LEAVE

        if (ret != GTK_RESPONSE_OK) return FALSE;

        s1 = remmina_plugin_nx_service->protocol_plugin_init_get_username (gp);
        s2 = remmina_plugin_nx_service->protocol_plugin_init_get_password (gp);
        ret = remmina_nx_session_login (nx, s1, s2);
    }
    g_free (s1);
    g_free (s2);

    if (!ret) return FALSE;

    THREADS_ENTER
    remmina_plugin_nx_service->protocol_plugin_init_save_cred (gp);
    THREADS_LEAVE

    /* Prepare the session type and application */
    cs = remmina_plugin_nx_service->file_get_string (remminafile, "exec");
    if (!cs || g_strcmp0 (cs, "GNOME") == 0)
    {
        type = "unix-gnome";
        app = NULL;
    }
    else if (g_strcmp0 (cs, "KDE") == 0)
    {
        type = "unix-kde";
        app = NULL;
    }
    else if (g_strcmp0 (cs, "Xfce") == 0)
    {
        /* NX does not know Xfce. So we simply launch the Xfce startup program. */
        type = "unix-application";
        app = "startxfce4";
    }
    else if (g_strcmp0 (cs, "Shadow") == 0)
    {
        type = "shadow";
        app = NULL;
    }
    else
    {
        type = "unix-application";
        app = cs;
    }

    /* List sessions */

    gpdata->attach_session = (g_strcmp0 (type, "shadow") == 0);
    while (1)
    {
        remmina_nx_session_add_parameter (nx, "type", type);
        if (!gpdata->attach_session)
        {
            remmina_nx_session_add_parameter (nx, "user", remmina_plugin_nx_service->file_get_string (remminafile, "username"));
            remmina_nx_session_add_parameter (nx, "status", "suspended,running");
        }

        if (!remmina_nx_session_list (nx))
        {
            return FALSE;
        }

        is_empty_list = !remmina_nx_session_iter_first (nx, &gpdata->iter);
        if (is_empty_list && !gpdata->manager_started && !gpdata->attach_session)
        {
            event_type = REMMINA_NX_EVENT_START;
        }
        else
        {
            remmina_nx_session_manager_start (gp);
            event_type = remmina_plugin_nx_wait_signal (gpdata);
            if (event_type == REMMINA_NX_EVENT_CANCEL)
            {
                return FALSE;
            }
            if (event_type == REMMINA_NX_EVENT_TERMINATE)
            {
                if (!is_empty_list)
                {
                    s1 = remmina_nx_session_iter_get (nx, &gpdata->iter, REMMINA_NX_SESSION_COLUMN_ID);
                    remmina_nx_session_add_parameter (nx, "sessionid", s1);
                    g_free (s1);
                    if (!remmina_nx_session_terminate (nx))
                    {
                        remmina_nx_session_manager_start (gp);
                        remmina_plugin_nx_wait_signal (gpdata);
                    }
                }
                continue;
            }
        }

        break;
    }

    /* Start, Restore or Attach, based on the setting and existing session */
    remmina_nx_session_add_parameter (nx, "type", type);
    i = remmina_plugin_nx_service->file_get_int (remminafile, "quality", 0);
    remmina_nx_session_add_parameter (nx, "link",
        i > 2 ? "lan" :
        i == 2 ? "adsl" :
        i == 1 ? "isdn" : "modem");
    remmina_nx_session_add_parameter (nx, "geometry", "%ix%i",
        remmina_plugin_nx_service->file_get_int (remminafile, "resolution_width", 0),
        remmina_plugin_nx_service->file_get_int (remminafile, "resolution_height", 0));
    remmina_nx_session_add_parameter (nx, "keyboard", remmina_kbtype);
    remmina_nx_session_add_parameter (nx, "client", "linux");
    remmina_nx_session_add_parameter (nx, "media", "0");
    remmina_nx_session_add_parameter (nx, "clipboard",
        remmina_plugin_nx_service->file_get_int (remminafile, "disableclipboard", FALSE) ? "none" : "both");

    switch (event_type)
    {

    case REMMINA_NX_EVENT_START:
        if (app) remmina_nx_session_add_parameter (nx, "application", app);

        remmina_nx_session_add_parameter (nx, "session", remmina_plugin_nx_service->file_get_string (remminafile, "name"));
        remmina_nx_session_add_parameter (nx, "screeninfo", "%ix%ix24+render",
            remmina_plugin_nx_service->file_get_int (remminafile, "resolution_width", 0),
            remmina_plugin_nx_service->file_get_int (remminafile, "resolution_height", 0));

        if (!remmina_nx_session_start (nx)) return FALSE;
        break;

    case REMMINA_NX_EVENT_ATTACH:
        s1 = remmina_nx_session_iter_get (nx, &gpdata->iter, REMMINA_NX_SESSION_COLUMN_ID);
        remmina_nx_session_add_parameter (nx, "id", s1);
        g_free (s1);

        s1 = remmina_nx_session_iter_get (nx, &gpdata->iter, REMMINA_NX_SESSION_COLUMN_DISPLAY);
        remmina_nx_session_add_parameter (nx, "display", s1);
        g_free (s1);

        if (!remmina_nx_session_attach (nx)) return FALSE;
        break;

    case REMMINA_NX_EVENT_RESTORE:
        s1 = remmina_nx_session_iter_get (nx, &gpdata->iter, REMMINA_NX_SESSION_COLUMN_ID);
        remmina_nx_session_add_parameter (nx, "id", s1);
        g_free (s1);

        remmina_nx_session_add_parameter (nx, "session", remmina_plugin_nx_service->file_get_string (remminafile, "name"));

        if (!remmina_nx_session_restore (nx)) return FALSE;
        break;

    default:
        return FALSE;
    }

    if (!remmina_nx_session_tunnel_open (nx)) return FALSE;

    if (!remmina_plugin_nx_start_create_notify (gp)) return FALSE;

    /* nxproxy */
    if (!remmina_nx_session_invoke_proxy (nx, -1, remmina_plugin_nx_on_proxy_exit, gp)) return FALSE;

    /* get the window id of the remote nxagent */
    if (!remmina_plugin_nx_monitor_create_notify (gp, "nxagent")) return FALSE;

    /* embed it */
    THREADS_ENTER
    gtk_socket_add_id (GTK_SOCKET (gpdata->socket), gpdata->window_id);
    THREADS_LEAVE

    return TRUE;
}
static void
na_tray_manager_handle_dock_request (NaTrayManager       *manager,
				     XClientMessageEvent *xevent)
{
  GtkWidget *socket;
  Window *window;
  GtkRequisition req;

  if (g_hash_table_lookup (manager->socket_table, GINT_TO_POINTER (xevent->data.l[2])))
    {
      /* We already got this notification earlier, ignore this one */
      return;
    }
  
  socket = gtk_socket_new ();

  gtk_widget_set_app_paintable (socket, TRUE);
  //FIXME: need to find a theme where this (and expose event) is needed
  gtk_widget_set_double_buffered (socket, FALSE);
  g_signal_connect (socket, "realize",
                    G_CALLBACK (na_tray_manager_make_socket_transparent), NULL);
  g_signal_connect (socket, "expose_event",
                    G_CALLBACK (na_tray_manager_socket_exposed), NULL);
  g_signal_connect_after (socket, "style_set",
                          G_CALLBACK (na_tray_manager_socket_style_set), NULL);
  
  /* We need to set the child window here
   * so that the client can call _get functions
   * in the signal handler
   */
  window = g_new (Window, 1);
  *window = xevent->data.l[2];
      
  g_object_set_data_full (G_OBJECT (socket),
			  "na-tray-child-window",
			  window, g_free);
  g_signal_emit (manager, manager_signals[TRAY_ICON_ADDED], 0,
		 socket);

  /* Add the socket only if it's been attached */
  if (GTK_IS_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (socket))))
    {
      g_signal_connect (socket, "plug_removed",
			G_CALLBACK (na_tray_manager_plug_removed), manager);
      
      gtk_socket_add_id (GTK_SOCKET (socket), *window);

      g_hash_table_insert (manager->socket_table, GINT_TO_POINTER (*window), socket);

      /*
       * Make sure the icons have a meaningfull size ...
       */ 
      req.width = req.height = 1;
      gtk_widget_size_request (socket, &req);
      /*
      if ((req.width < 16) || (req.height < 16))
      {
          gint nw = MAX (24, req.width);
          gint nh = MAX (24, req.height);
          g_warning (_("tray icon has requested a size of (%i x %i), resizing to (%i x %i)"), 
                      req.width, req.height, nw, nh);
          gtk_widget_set_size_request(icon, nw,  nh);
      }
      */
      gtk_widget_show(socket);
    }
  else
    gtk_widget_destroy (socket);
}
示例#17
0
/* phone_embed */
static void _phone_embed(GtkWidget * widget, unsigned long window)
{
	gtk_socket_add_id(GTK_SOCKET(widget), window);
}
示例#18
0
static void
egg_tray_manager_handle_dock_request(EggTrayManager *manager,
    XClientMessageEvent  *xevent)
{
    GtkWidget *socket;
    Window *window;

    ENTER;
    socket = gtk_socket_new ();
    gtk_widget_set_app_paintable (socket, TRUE);
    gtk_widget_set_double_buffered (socket, FALSE);
    gtk_widget_add_events (socket, GDK_EXPOSURE_MASK);
    
    g_signal_connect (socket, "realize",
          G_CALLBACK (egg_tray_manager_make_socket_transparent), NULL);
    g_signal_connect (socket, "expose_event",
          G_CALLBACK (egg_tray_manager_socket_exposed), NULL);
    g_signal_connect_after (socket, "style_set",
          G_CALLBACK (egg_tray_manager_socket_style_set), NULL);
    gtk_widget_show (socket);


    /* We need to set the child window here
     * so that the client can call _get functions
     * in the signal handler
     */
    window = g_new (Window, 1);
    *window = xevent->data.l[2];
    DBG("plug window %lx\n", *window);
    g_object_set_data_full (G_OBJECT (socket), "egg-tray-child-window",
        window, g_free);
    g_signal_emit(manager, manager_signals[TRAY_ICON_ADDED], 0,
        socket);
    /* Add the socket only if it's been attached */
    if (GTK_IS_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(socket)))) {
        GtkRequisition req;
        XWindowAttributes wa;
        
        DBG("socket has window. going on\n");
        gtk_socket_add_id(GTK_SOCKET (socket), xevent->data.l[2]);
        g_signal_connect(socket, "plug_removed",
              G_CALLBACK(egg_tray_manager_plug_removed), manager);

        gdk_error_trap_push();
        XGetWindowAttributes(GDK_DISPLAY(), *window, &wa);
        if (gdk_error_trap_pop()) {
            ERR("can't embed window %lx\n", xevent->data.l[2]);
            goto error;
        }
        g_hash_table_insert(manager->socket_table,
            GINT_TO_POINTER(xevent->data.l[2]), socket);
        req.width = req.height = 1;
        gtk_widget_size_request(socket, &req);
        RET();
    }
error:    
    DBG("socket has NO window. destroy it\n");
    g_signal_emit(manager, manager_signals[TRAY_ICON_REMOVED], 0,
        socket);
    gtk_widget_destroy(socket);
    RET();
}