pkgsrc/multimedia/fxtv/patches/patch-bf
dholland 6ed83acafe Patch LP64 problems, add patch comments, fix some pkglint.
This may or may not fully run on LP64 platforms but it's much more
likely to now than previously.
2011-07-05 03:27:22 +00:00

96 lines
2.7 KiB
Text

$NetBSD: patch-bf,v 1.2 2011/07/05 03:27:22 dholland Exp $
Handle always-on-top.
Fix LP64 problems.
--- xutil.c.orig 1999-11-05 00:38:54.000000000 +0000
+++ xutil.c
@@ -44,6 +44,7 @@
#include <X11/Shell.h>
#include <X11/Xaw/Dialog.h>
#include <X11/xpm.h>
+#include "glob.h"
#include "tvdefines.h"
#include "xutil.h"
#include "app_rsrc.h"
@@ -63,6 +64,10 @@ void XawScrollbarSetThumb( Widget w, flo
#define WM_BORDER_PAD 40
+#define _NET_WM_STATE_REMOVE 0
+#define _NET_WM_STATE_ADD 1
+#define _NET_WM_STATE_TOGGLE 2
+
typedef struct {
pid_t cmd_pid;
TVUTIL_PIPE_END end[3];
@@ -371,7 +376,7 @@ TV_BOOL XUTILPixmapLoad( char *pixmap
XFreePixmap( XtDisplay( wgt ), pixmap_depth1 );
XFreeGC ( XtDisplay( wgt ), gc );
if ( pixmap_mask != NULL )
- *pixmap_mask = NULL;
+ *pixmap_mask = 0;
}
else {
@@ -406,11 +411,12 @@ TV_BOOL XUTILPixmapLoad( char *pixmap
}
*pixmap = pix_returned;
- if ( pix_mask_returned )
+ if ( pix_mask_returned ) {
if ( pixmap_mask != NULL )
*pixmap_mask = pix_mask_returned;
else
XFreePixmap( XtDisplay( wgt ), pix_mask_returned );
+ }
}
if ( pixmap_path != NULL )
@@ -1543,3 +1549,46 @@ void XUTILDetermineFrameBufferVisual( Di
}
}
}
+
+static void
+change_state (Display *d, Screen * screen, Window xwindow, int add,
+ Atom state1, Atom state2)
+{
+ XEvent xev;
+
+ xev.xclient.type = ClientMessage;
+ xev.xclient.serial = 0;
+ xev.xclient.send_event = True;
+ xev.xclient.display = d;
+ xev.xclient.window = xwindow;
+ xev.xclient.message_type = XInternAtom (d, "_NET_WM_STATE", FALSE);
+ xev.xclient.format = 32;
+ xev.xclient.data.l[0] = add ? _NET_WM_STATE_ADD : _NET_WM_STATE_REMOVE;
+ xev.xclient.data.l[1] = state1;
+ xev.xclient.data.l[2] = state2;
+
+ XSendEvent (d, RootWindowOfScreen (screen), False,
+ SubstructureRedirectMask | SubstructureNotifyMask, &xev);
+}
+
+void XUTILSetAlwaysOnTop(TV_BOOL status)
+{
+ Display *d = TVDISPLAY;
+ Screen *screen = XtScreen ( TVTOPLEVEL );
+ Window win = XtWindow ( TVTOPLEVEL );
+ static Atom xa_ABOVE = 0;
+ static Atom xa_BELOW = 0;
+
+ if (!xa_ABOVE)
+ {
+ xa_ABOVE = XInternAtom (d, "_NET_WM_STATE_ABOVE", FALSE);
+ xa_BELOW = XInternAtom (d, "_NET_WM_STATE_BELOW", FALSE);
+ }
+
+ if (status) {
+ change_state (d, screen, win, FALSE, xa_ABOVE, xa_BELOW);
+ change_state (d, screen, win, TRUE, xa_ABOVE, None);
+ } else {
+ change_state (d, screen, win, FALSE, xa_ABOVE, xa_BELOW);
+ }
+}