summaryrefslogtreecommitdiff
path: root/gdk/linux-fb/gdkfbswitch.c
diff options
context:
space:
mode:
authorAlexander Larsson <alexl@redhat.com>2001-06-25 23:01:36 +0000
committerAlexander Larsson <alexl@src.gnome.org>2001-06-25 23:01:36 +0000
commit75fd7f09af9de7691ef46e12cad6ac243298c16e (patch)
tree1da19b6e074adcbbf53cbfdf4b88f803cc42a33f /gdk/linux-fb/gdkfbswitch.c
parent4168b4780317921000f88d2e58f2b66ae6ce7038 (diff)
downloadgtk+-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.c75
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);
+}