diff options
author | Alexander Larsson <alexl@redhat.com> | 2001-06-25 23:01:36 +0000 |
---|---|---|
committer | Alexander Larsson <alexl@src.gnome.org> | 2001-06-25 23:01:36 +0000 |
commit | 75fd7f09af9de7691ef46e12cad6ac243298c16e (patch) | |
tree | 1da19b6e074adcbbf53cbfdf4b88f803cc42a33f /gdk/linux-fb/gdkfbswitch.c | |
parent | 4168b4780317921000f88d2e58f2b66ae6ce7038 (diff) | |
download | gtk+-75fd7f09af9de7691ef46e12cad6ac243298c16e.tar.gz |
Added --enable-fbmanager. This is some experimental code that lets several
2001-06-25 Alexander Larsson <alexl@redhat.com>
* configure.in:
Added --enable-fbmanager. This is some experimental code
that lets several GtkFB apps coordinate their access to the
framebuffer.
* acconfig.h:
Added ENABLE_FB_MANAGER.
* gdk/linux-fb/Makefile.am:
Added gdkfbmanager and gdkfbswitch.
* gdk/linux-fb/gdkkeyboard-fb.c:
* gdk/linux-fb/gdkmouse-fb.c:
* gdk/linux-fb/gdkprivate-fb.h:
Split device init and open so that
they can be opened and closed while switched
away.
* gdk/linux-fb/gdkmain-fb.c:
Add the basic manager communication.
* gdk/linux-fb/gdkrender-fb.c:
Don't update to the shadow fb if we're
blocked by the fb manager.
Diffstat (limited to 'gdk/linux-fb/gdkfbswitch.c')
-rw-r--r-- | gdk/linux-fb/gdkfbswitch.c | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/gdk/linux-fb/gdkfbswitch.c b/gdk/linux-fb/gdkfbswitch.c new file mode 100644 index 0000000000..707325f8f2 --- /dev/null +++ b/gdk/linux-fb/gdkfbswitch.c @@ -0,0 +1,75 @@ +#include <glib.h> + +#include <sys/types.h> +#include <sys/socket.h> +#include <sys/un.h> + +#include "gdkfbmanager.h" + +int +main (int argc, char *argv[]) +{ + int fd; + struct sockaddr_un addr; + struct msghdr msg = {0}; + struct cmsghdr *cmsg; + struct ucred credentials; + struct FBManagerMessage init_msg; + struct iovec iov; + char buf[CMSG_SPACE (sizeof (credentials))]; /* ancillary data buffer */ + int *fdptr; + int res; + + if (argc != 2) + { + g_print ("usage: fbswitch <pid>\n"); + return 1; + } + + fd = socket (PF_UNIX, SOCK_STREAM, 0); + + if (fd < 0) + return 1; + + addr.sun_family = AF_UNIX; + strcpy (addr.sun_path, "/tmp/.fb.manager"); + + if (connect(fd, (struct sockaddr *)&addr, sizeof (addr)) < 0) + { + g_print ("connect failed\n"); + close (fd); + return 1; + } + + credentials.pid = getpid (); + credentials.uid = geteuid (); + credentials.gid = getegid (); + + init_msg.msg_type = FB_MANAGER_NEW_CLIENT; + iov.iov_base = &init_msg; + iov.iov_len = sizeof (init_msg); + + msg.msg_name = NULL; + msg.msg_namelen = 0; + msg.msg_iov = &iov; + msg.msg_iovlen = 1; + msg.msg_control = buf; + msg.msg_controllen = sizeof buf; + cmsg = CMSG_FIRSTHDR(&msg); + cmsg->cmsg_level = SOL_SOCKET; + cmsg->cmsg_type = SCM_CREDENTIALS; + cmsg->cmsg_len = CMSG_LEN (sizeof (credentials)); + /* Initialize the payload: */ + fdptr = (int *)CMSG_DATA (cmsg); + memcpy (fdptr, &credentials, sizeof (credentials)); + /* Sum of the length of all control messages in the buffer: */ + msg.msg_controllen = cmsg->cmsg_len; + + res = sendmsg (fd, &msg, 0); + + init_msg.msg_type = FB_MANAGER_REQUEST_SWITCH_TO_PID; + init_msg.data = atoi (argv[1]); + /* Request a switch-to */ + send (fd, &init_msg, sizeof (init_msg), 0); + g_print ("requested a switch to pid %d\n", init_msg.data); +} |