*** empty log message ***
authorroot <root>
Fri, 20 Jan 2006 13:32:29 +0000 (13:32 +0000)
committerroot <root>
Fri, 20 Jan 2006 13:32:29 +0000 (13:32 +0000)
src/perl/tabbed
src/rxvtperl.xs

index fc7fe68dc98b3e2515344c251a42dcd8df623802..a049432cb618bab254c6b6f9e459edcb1fffc2e5 100644 (file)
@@ -51,12 +51,10 @@ sub new_tab {
 sub configure {
    my ($self) = @_;
 
-   my $tabheight = $self->int_bwidth + $self->fheight + $self->lineSpace;
-
    $self->{cur}->XMoveResizeWindow (
       $self->{cur}->parent,
-      0, $tabheight,
-      $self->width, $self->height - $tabheight
+      0, $self->{tabheight},
+      $self->width, $self->height - $self->{tabheight}
    );
 }
 
@@ -72,8 +70,18 @@ sub make_current {
 
    $self->configure;
 
-   for my $atom ($tab->XListProperties) {
-      warn "$atom\n";
+   my $wm_normal_hints = $self->XInternAtom ("WM_NORMAL_HINTS");
+
+   for my $atom ($tab->XListProperties ($tab->parent)) {
+      my ($type, $format, $items) = $self->XGetWindowProperty ($tab->parent, $atom);
+
+      if ($atom == $wm_normal_hints) {
+         my (@hints) = unpack "l!*", $items;
+         $hints[ 4] += $self->{tabheight};
+         $hints[16] += $self->{tabheight};
+         $items = pack "l!*", @hints;
+      }
+      $self->XChangeWindowProperty ($self->parent, $atom, $type, $format, $items);
    }
 
    $tab->XMapWindow ($tab->parent);
@@ -130,6 +138,8 @@ sub on_init {
 sub on_start {
    my ($self) = @_;
 
+   $self->{tabheight} = $self->int_bwidth + $self->fheight + $self->lineSpace;
+
    $self->cmd_parse ("\x1b[?25l\x1b[?7l");
    $self->new_tab;
    $self->new_tab;
index 947feea7bdb72d80110dc4a72328d90ae93fcf2e..db75a99341b98c17a504d221dad65b20ad507a07 100644 (file)
@@ -1652,15 +1652,21 @@ rxvt_term::XGetWindowProperty (Window window, Atom property)
         unsigned long nitems;
         unsigned long bytes_after;
         unsigned char *prop;
+
        XGetWindowProperty (THIS->display->display, window, property,
-                            0, 1<<30, 0, AnyPropertyType,
+                            0, 1<<24, 0, AnyPropertyType,
                             &type, &format, &nitems, &bytes_after, &prop);
+
         if (type != None)
           {
+            int elemsize = format == 16 ? sizeof (short)
+                         : format == 32 ? sizeof (long)
+                         :                1;
+
             EXTEND (SP, 3);
             PUSHs (newSVuv ((U32)type));
             PUSHs (newSViv (format));
-            PUSHs (newSVpvn ((char *)prop, nitems * format / 8));
+            PUSHs (newSVpvn ((char *)prop, nitems * elemsize));
             XFree (prop);
           }
 }
@@ -1672,11 +1678,26 @@ rxvt_term::XChangeWindowProperty (Window window, Atom property, Atom type, int f
        STRLEN len;
         char *data_ = SvPVbyte (data, len);
 
+        int elemsize = format == 16 ? sizeof (short)
+                     : format == 32 ? sizeof (long)
+                     :                1;
+
        XChangeProperty (THIS->display->display, window, property,
                          type, format, PropModeReplace,
-                         (unsigned char *)data, len * 8 / format);
+                         (unsigned char *)data_, len / elemsize);
+        XSync (THIS->display->display, 0);
 }
 
+Atom
+XInternAtom (rxvt_term *term, char *atom_name, int only_if_exists = FALSE)
+       C_ARGS: term->display->display, atom_name, only_if_exists
+
+char *
+XGetAtomName (rxvt_term *term, Atom atom)
+       C_ARGS: term->display->display, atom
+        CLEANUP:
+        XFree (RETVAL);
+
 void
 XDeleteProperty (rxvt_term *term, Window window, Atom property)
        C_ARGS: term->display->display, window, property
@@ -1688,6 +1709,8 @@ rxvt_term::DefaultRootWindow ()
         OUTPUT:
         RETVAL
 
+#if 0
+
 Window
 XCreateSimpleWindow (rxvt_term *term, Window parent, int x, int y, unsigned int width, unsigned int height)
        C_ARGS: term->display->display, (Window)parent,
@@ -1695,6 +1718,8 @@ XCreateSimpleWindow (rxvt_term *term, Window parent, int x, int y, unsigned int
                 term->pix_colors_focused[Color_border],
                 term->pix_colors_focused[Color_border]
 
+#endif
+
 void
 XReparentWindow (rxvt_term *term, Window window, Window parent, int x = 0, int y = 0)
        C_ARGS: term->display->display, window, parent, x, y