|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
>
|
|
Packit Service |
fb6fa5 |
>
|
|
Packit Service |
fb6fa5 |
>Why does this strange 'x io error' occur when I
|
|
Packit Service |
fb6fa5 |
fork() in my GTK+ app? [GTK 2.x]
|
|
Packit Service |
fb6fa5 |
>
|
|
Packit Service |
fb6fa5 |
NAME="GENERATOR"
|
|
Packit Service |
fb6fa5 |
CONTENT="Modular DocBook HTML Stylesheet Version 1.79">
|
|
Packit Service |
fb6fa5 |
REL="HOME"
|
|
Packit Service |
fb6fa5 |
TITLE="GTK+ FAQ"
|
|
Packit Service |
fb6fa5 |
HREF="book1.html">
|
|
Packit Service |
fb6fa5 |
REL="UP"
|
|
Packit Service |
fb6fa5 |
TITLE="Development with GTK+: general questions"
|
|
Packit Service |
fb6fa5 |
HREF="c466.html">
|
|
Packit Service |
fb6fa5 |
REL="PREVIOUS"
|
|
Packit Service |
fb6fa5 |
TITLE="What's an easy way to run a function in the thread with
|
|
Packit Service |
fb6fa5 |
the main loop? [GTK 2.x]"
|
|
Packit Service |
fb6fa5 |
HREF="x490.html">
|
|
Packit Service |
fb6fa5 |
REL="NEXT"
|
|
Packit Service |
fb6fa5 |
TITLE="Why don't the contents of a button move when the button
|
|
Packit Service |
fb6fa5 |
is pressed? Here's a patch to make it work that way... [GTK 2.x]"
|
|
Packit Service |
fb6fa5 |
HREF="x509.html">
|
|
Packit Service |
fb6fa5 |
>
|
|
Packit Service |
fb6fa5 |
CLASS="SECT1"
|
|
Packit Service |
fb6fa5 |
BGCOLOR="#FFFFFF"
|
|
Packit Service |
fb6fa5 |
TEXT="#000000"
|
|
Packit Service |
fb6fa5 |
LINK="#0000FF"
|
|
Packit Service |
fb6fa5 |
VLINK="#840084"
|
|
Packit Service |
fb6fa5 |
ALINK="#0000FF"
|
|
Packit Service |
fb6fa5 |
>
|
|
Packit Service |
fb6fa5 |
CLASS="NAVHEADER"
|
|
Packit Service |
fb6fa5 |
>
|
|
Packit Service |
fb6fa5 |
SUMMARY="Header navigation table"
|
|
Packit Service |
fb6fa5 |
WIDTH="100%"
|
|
Packit Service |
fb6fa5 |
BORDER="0"
|
|
Packit Service |
fb6fa5 |
CELLPADDING="0"
|
|
Packit Service |
fb6fa5 |
CELLSPACING="0"
|
|
Packit Service |
fb6fa5 |
>
|
|
Packit Service |
fb6fa5 |
>
|
|
Packit Service |
fb6fa5 |
COLSPAN="3"
|
|
Packit Service |
fb6fa5 |
ALIGN="center"
|
|
Packit Service |
fb6fa5 |
>GTK+ FAQ
|
|
Packit Service |
fb6fa5 |
>
|
|
Packit Service |
fb6fa5 |
>
|
|
Packit Service |
fb6fa5 |
>
|
|
Packit Service |
fb6fa5 |
WIDTH="10%"
|
|
Packit Service |
fb6fa5 |
ALIGN="left"
|
|
Packit Service |
fb6fa5 |
VALIGN="bottom"
|
|
Packit Service |
fb6fa5 |
>
|
|
Packit Service |
fb6fa5 |
HREF="x490.html"
|
|
Packit Service |
fb6fa5 |
ACCESSKEY="P"
|
|
Packit Service |
fb6fa5 |
><<< Previous
|
|
Packit Service |
fb6fa5 |
>
|
|
Packit Service |
fb6fa5 |
>
|
|
Packit Service |
fb6fa5 |
WIDTH="80%"
|
|
Packit Service |
fb6fa5 |
ALIGN="center"
|
|
Packit Service |
fb6fa5 |
VALIGN="bottom"
|
|
Packit Service |
fb6fa5 |
>Development with GTK+: general questions
|
|
Packit Service |
fb6fa5 |
>
|
|
Packit Service |
fb6fa5 |
WIDTH="10%"
|
|
Packit Service |
fb6fa5 |
ALIGN="right"
|
|
Packit Service |
fb6fa5 |
VALIGN="bottom"
|
|
Packit Service |
fb6fa5 |
>
|
|
Packit Service |
fb6fa5 |
HREF="x509.html"
|
|
Packit Service |
fb6fa5 |
ACCESSKEY="N"
|
|
Packit Service |
fb6fa5 |
>Next >>>
|
|
Packit Service |
fb6fa5 |
>
|
|
Packit Service |
fb6fa5 |
>
|
|
Packit Service |
fb6fa5 |
>
|
|
Packit Service |
fb6fa5 |
>
|
|
Packit Service |
fb6fa5 |
ALIGN="LEFT"
|
|
Packit Service |
fb6fa5 |
WIDTH="100%">
|
|
Packit Service |
fb6fa5 |
>
|
|
Packit Service |
fb6fa5 |
CLASS="SECT1"
|
|
Packit Service |
fb6fa5 |
>
|
|
Packit Service |
fb6fa5 |
CLASS="SECT1"
|
|
Packit Service |
fb6fa5 |
>
|
|
Packit Service |
fb6fa5 |
NAME="AEN496"
|
|
Packit Service |
fb6fa5 |
>Why does this strange 'x io error' occur when I
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
CLASS="LITERAL"
|
|
Packit Service |
fb6fa5 |
>fork()
|
|
Packit Service |
fb6fa5 |
> in my GTK+ app?
|
|
Packit Service |
fb6fa5 |
CLASS="EMPHASIS"
|
|
Packit Service |
fb6fa5 |
>[GTK 2.x]
|
|
Packit Service |
fb6fa5 |
>
|
|
Packit Service |
fb6fa5 |
>
|
|
Packit Service |
fb6fa5 |
>
|
|
Packit Service |
fb6fa5 |
>This is not really a GTK+ problem, and the problem is
|
|
Packit Service |
fb6fa5 |
not related to
|
|
Packit Service |
fb6fa5 |
CLASS="LITERAL"
|
|
Packit Service |
fb6fa5 |
>fork()
|
|
Packit Service |
fb6fa5 |
> either. If the 'x io
|
|
Packit Service |
fb6fa5 |
error' occurs then you probably use the
|
|
Packit Service |
fb6fa5 |
CLASS="LITERAL"
|
|
Packit Service |
fb6fa5 |
>exit()
|
|
Packit Service |
fb6fa5 |
> function
|
|
Packit Service |
fb6fa5 |
in order to exit from the child process.
|
|
Packit Service |
fb6fa5 |
>
|
|
Packit Service |
fb6fa5 |
>When GDK opens an X display, it creates a socket file
|
|
Packit Service |
fb6fa5 |
descriptor. When you use the
|
|
Packit Service |
fb6fa5 |
CLASS="LITERAL"
|
|
Packit Service |
fb6fa5 |
>exit()
|
|
Packit Service |
fb6fa5 |
>
|
|
Packit Service |
fb6fa5 |
function, you implicitly close all the open file descriptors,
|
|
Packit Service |
fb6fa5 |
and the underlying X library really doesn't like this.
|
|
Packit Service |
fb6fa5 |
>
|
|
Packit Service |
fb6fa5 |
>The right function to use here is
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
CLASS="LITERAL"
|
|
Packit Service |
fb6fa5 |
>_exit()
|
|
Packit Service |
fb6fa5 |
>.
|
|
Packit Service |
fb6fa5 |
>
|
|
Packit Service |
fb6fa5 |
>Erik Mouw contributed the following code example to
|
|
Packit Service |
fb6fa5 |
illustrate handling fork() and exit().
|
|
Packit Service |
fb6fa5 |
>
|
|
Packit Service |
fb6fa5 |
BORDER="0"
|
|
Packit Service |
fb6fa5 |
BGCOLOR="#E0E0E0"
|
|
Packit Service |
fb6fa5 |
WIDTH="100%"
|
|
Packit Service |
fb6fa5 |
>
|
|
Packit Service |
fb6fa5 |
>
|
|
Packit Service |
fb6fa5 |
>
|
|
Packit Service |
fb6fa5 |
CLASS="PROGRAMLISTING"
|
|
Packit Service |
fb6fa5 |
>/*-------------------------------------------------------------------------
|
|
Packit Service |
fb6fa5 |
* Filename: gtk-fork.c
|
|
Packit Service |
fb6fa5 |
* Version: 0.99.2
|
|
Packit Service |
fb6fa5 |
* Copyright: Copyright (C) 1999, Erik Mouw
|
|
Packit Service |
fb6fa5 |
* Author: Erik Mouw <J.A.K.Mouw@its.tudelft.nl>
|
|
Packit Service |
fb6fa5 |
* Description: GTK+ fork example
|
|
Packit Service |
fb6fa5 |
* Created at: Thu Sep 23 21:37:55 1999
|
|
Packit Service |
fb6fa5 |
* Modified by: Erik Mouw <J.A.K.Mouw@its.tudelft.nl>
|
|
Packit Service |
fb6fa5 |
* Modified at: Thu Sep 23 22:39:39 1999
|
|
Packit Service |
fb6fa5 |
* Modified by: Tony Gale <gale@gtk.org>
|
|
Packit Service |
fb6fa5 |
* Modified at: Wed Jan 14 12:38:00 2004
|
|
Packit Service |
fb6fa5 |
*-----------------------------------------------------------------------*/
|
|
Packit Service |
fb6fa5 |
/*
|
|
Packit Service |
fb6fa5 |
* Compile with:
|
|
Packit Service |
fb6fa5 |
*
|
|
Packit Service |
fb6fa5 |
* cc -o gtk-fork gtk-fork.c `pkg-config gtk+-2.0 --cflags --libs`
|
|
Packit Service |
fb6fa5 |
*
|
|
Packit Service |
fb6fa5 |
*/
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
#include <stdio.h>
|
|
Packit Service |
fb6fa5 |
#include <stdlib.h>
|
|
Packit Service |
fb6fa5 |
#include <signal.h>
|
|
Packit Service |
fb6fa5 |
#include <sys/types.h>
|
|
Packit Service |
fb6fa5 |
#include <sys/wait.h>
|
|
Packit Service |
fb6fa5 |
#include <unistd.h>
|
|
Packit Service |
fb6fa5 |
#include <gtk/gtk.h>
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
void sigchld_handler(int num)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
sigset_t set, oldset;
|
|
Packit Service |
fb6fa5 |
pid_t pid;
|
|
Packit Service |
fb6fa5 |
int status, exitstatus;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
/* block other incoming SIGCHLD signals */
|
|
Packit Service |
fb6fa5 |
sigemptyset(&set);
|
|
Packit Service |
fb6fa5 |
sigaddset(&set, SIGCHLD);
|
|
Packit Service |
fb6fa5 |
sigprocmask(SIG_BLOCK, &set, &oldset);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
/* wait for child */
|
|
Packit Service |
fb6fa5 |
while((pid = waitpid((pid_t)-1, &status, WNOHANG)) > 0)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
if(WIFEXITED(status))
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
exitstatus = WEXITSTATUS(status);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
fprintf(stderr,
|
|
Packit Service |
fb6fa5 |
"Parent: child exited, pid = %d, exit status = %d\n",
|
|
Packit Service |
fb6fa5 |
(int)pid, exitstatus);
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
else if(WIFSIGNALED(status))
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
exitstatus = WTERMSIG(status);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
fprintf(stderr,
|
|
Packit Service |
fb6fa5 |
"Parent: child terminated by signal %d, pid = %d\n",
|
|
Packit Service |
fb6fa5 |
exitstatus, (int)pid);
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
else if(WIFSTOPPED(status))
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
exitstatus = WSTOPSIG(status);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
fprintf(stderr,
|
|
Packit Service |
fb6fa5 |
"Parent: child stopped by signal %d, pid = %d\n",
|
|
Packit Service |
fb6fa5 |
exitstatus, (int)pid);
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
else
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
fprintf(stderr,
|
|
Packit Service |
fb6fa5 |
"Parent: child exited magically, pid = %d\n",
|
|
Packit Service |
fb6fa5 |
(int)pid);
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
/* re-install the signal handler (some systems need this) */
|
|
Packit Service |
fb6fa5 |
signal(SIGCHLD, sigchld_handler);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
/* and unblock it */
|
|
Packit Service |
fb6fa5 |
sigemptyset(&set);
|
|
Packit Service |
fb6fa5 |
sigaddset(&set, SIGCHLD);
|
|
Packit Service |
fb6fa5 |
sigprocmask(SIG_UNBLOCK, &set, &oldset);
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
gint delete_event(GtkWidget *widget, GdkEvent *event, gpointer data)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
return(FALSE);
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
void destroy(GtkWidget *widget, gpointer data)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
gtk_main_quit();
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
void fork_me(GtkWidget *widget, gpointer data)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
pid_t pid;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
pid = fork();
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
if(pid == -1)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
/* ouch, fork() failed */
|
|
Packit Service |
fb6fa5 |
perror("fork");
|
|
Packit Service |
fb6fa5 |
exit(-1);
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
else if(pid == 0)
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
/* child */
|
|
Packit Service |
fb6fa5 |
fprintf(stderr, "Child: pid = %d\n", (int)getpid());
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
execlp("ls", "ls", "-CF", "/", NULL);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
/* if exec() returns, there is something wrong */
|
|
Packit Service |
fb6fa5 |
perror("execlp");
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
/* exit child. note the use of _exit() instead of exit() */
|
|
Packit Service |
fb6fa5 |
_exit(-1);
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
else
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
/* parent */
|
|
Packit Service |
fb6fa5 |
fprintf(stderr, "Parent: forked a child with pid = %d\n", (int)pid);
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
int main(int argc, char *argv[])
|
|
Packit Service |
fb6fa5 |
{
|
|
Packit Service |
fb6fa5 |
GtkWidget *window;
|
|
Packit Service |
fb6fa5 |
GtkWidget *button;
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
gtk_init(&argc, &argv);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
/* the basic stuff: make a window and set callbacks for destroy and
|
|
Packit Service |
fb6fa5 |
* delete events
|
|
Packit Service |
fb6fa5 |
*/
|
|
Packit Service |
fb6fa5 |
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
g_signal_connect(G_OBJECT (window), "delete_event",
|
|
Packit Service |
fb6fa5 |
G_CALLBACK(delete_event), NULL);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
g_signal_connect(G_OBJECT (window), "destroy",
|
|
Packit Service |
fb6fa5 |
G_CALLBACK(destroy), NULL);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
#if (GTK_MAJOR_VERSION == 1) && (GTK_MINOR_VERSION == 0)
|
|
Packit Service |
fb6fa5 |
gtk_container_border_width(GTK_CONTAINER (window), 10);
|
|
Packit Service |
fb6fa5 |
#else
|
|
Packit Service |
fb6fa5 |
gtk_container_set_border_width(GTK_CONTAINER (window), 10);
|
|
Packit Service |
fb6fa5 |
#endif
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
/* add a button to do something useful */
|
|
Packit Service |
fb6fa5 |
button = gtk_button_new_with_label("Fork me!");
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
g_signal_connect(G_OBJECT (button), "clicked",
|
|
Packit Service |
fb6fa5 |
G_CALLBACK(fork_me), NULL);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
gtk_container_add(GTK_CONTAINER(window), button);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
/* show everything */
|
|
Packit Service |
fb6fa5 |
gtk_widget_show (button);
|
|
Packit Service |
fb6fa5 |
gtk_widget_show (window);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
/* install a signal handler for SIGCHLD signals */
|
|
Packit Service |
fb6fa5 |
signal(SIGCHLD, sigchld_handler);
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
/* main loop */
|
|
Packit Service |
fb6fa5 |
gtk_main ();
|
|
Packit Service |
fb6fa5 |
|
|
Packit Service |
fb6fa5 |
exit(0);
|
|
Packit Service |
fb6fa5 |
}
|
|
Packit Service |
fb6fa5 |
>
|
|
Packit Service |
fb6fa5 |
>
|
|
Packit Service |
fb6fa5 |
>
|
|
Packit Service |
fb6fa5 |
>
|
|
Packit Service |
fb6fa5 |
>
|
|
Packit Service |
fb6fa5 |
CLASS="NAVFOOTER"
|
|
Packit Service |
fb6fa5 |
>
|
|
Packit Service |
fb6fa5 |
ALIGN="LEFT"
|
|
Packit Service |
fb6fa5 |
WIDTH="100%">
|
|
Packit Service |
fb6fa5 |
SUMMARY="Footer navigation table"
|
|
Packit Service |
fb6fa5 |
WIDTH="100%"
|
|
Packit Service |
fb6fa5 |
BORDER="0"
|
|
Packit Service |
fb6fa5 |
CELLPADDING="0"
|
|
Packit Service |
fb6fa5 |
CELLSPACING="0"
|
|
Packit Service |
fb6fa5 |
>
|
|
Packit Service |
fb6fa5 |
>
|
|
Packit Service |
fb6fa5 |
WIDTH="33%"
|
|
Packit Service |
fb6fa5 |
ALIGN="left"
|
|
Packit Service |
fb6fa5 |
VALIGN="top"
|
|
Packit Service |
fb6fa5 |
>
|
|
Packit Service |
fb6fa5 |
HREF="x490.html"
|
|
Packit Service |
fb6fa5 |
ACCESSKEY="P"
|
|
Packit Service |
fb6fa5 |
><<< Previous
|
|
Packit Service |
fb6fa5 |
>
|
|
Packit Service |
fb6fa5 |
>
|
|
Packit Service |
fb6fa5 |
WIDTH="34%"
|
|
Packit Service |
fb6fa5 |
ALIGN="center"
|
|
Packit Service |
fb6fa5 |
VALIGN="top"
|
|
Packit Service |
fb6fa5 |
>
|
|
Packit Service |
fb6fa5 |
HREF="book1.html"
|
|
Packit Service |
fb6fa5 |
ACCESSKEY="H"
|
|
Packit Service |
fb6fa5 |
>Home
|
|
Packit Service |
fb6fa5 |
>
|
|
Packit Service |
fb6fa5 |
>
|
|
Packit Service |
fb6fa5 |
WIDTH="33%"
|
|
Packit Service |
fb6fa5 |
ALIGN="right"
|
|
Packit Service |
fb6fa5 |
VALIGN="top"
|
|
Packit Service |
fb6fa5 |
>
|
|
Packit Service |
fb6fa5 |
HREF="x509.html"
|
|
Packit Service |
fb6fa5 |
ACCESSKEY="N"
|
|
Packit Service |
fb6fa5 |
>Next >>>
|
|
Packit Service |
fb6fa5 |
>
|
|
Packit Service |
fb6fa5 |
>
|
|
Packit Service |
fb6fa5 |
>
|
|
Packit Service |
fb6fa5 |
>
|
|
Packit Service |
fb6fa5 |
WIDTH="33%"
|
|
Packit Service |
fb6fa5 |
ALIGN="left"
|
|
Packit Service |
fb6fa5 |
VALIGN="top"
|
|
Packit Service |
fb6fa5 |
>What's an easy way to run a function in the thread with
|
|
Packit Service |
fb6fa5 |
the main loop?
|
|
Packit Service |
fb6fa5 |
CLASS="EMPHASIS"
|
|
Packit Service |
fb6fa5 |
>[GTK 2.x]
|
|
Packit Service |
fb6fa5 |
>
|
|
Packit Service |
fb6fa5 |
>
|
|
Packit Service |
fb6fa5 |
WIDTH="34%"
|
|
Packit Service |
fb6fa5 |
ALIGN="center"
|
|
Packit Service |
fb6fa5 |
VALIGN="top"
|
|
Packit Service |
fb6fa5 |
>
|
|
Packit Service |
fb6fa5 |
HREF="c466.html"
|
|
Packit Service |
fb6fa5 |
ACCESSKEY="U"
|
|
Packit Service |
fb6fa5 |
>Up
|
|
Packit Service |
fb6fa5 |
>
|
|
Packit Service |
fb6fa5 |
>
|
|
Packit Service |
fb6fa5 |
WIDTH="33%"
|
|
Packit Service |
fb6fa5 |
ALIGN="right"
|
|
Packit Service |
fb6fa5 |
VALIGN="top"
|
|
Packit Service |
fb6fa5 |
>Why don't the contents of a button move when the button
|
|
Packit Service |
fb6fa5 |
is pressed? Here's a patch to make it work that way...
|
|
Packit Service |
fb6fa5 |
CLASS="EMPHASIS"
|
|
Packit Service |
fb6fa5 |
>[GTK 2.x]
|
|
Packit Service |
fb6fa5 |
>
|
|
Packit Service |
fb6fa5 |
>
|
|
Packit Service |
fb6fa5 |
>
|
|
Packit Service |
fb6fa5 |
>
|
|
Packit Service |
fb6fa5 |
>
|
|
Packit Service |
fb6fa5 |
>
|
|
Packit Service |
fb6fa5 |
>
|