Fwd: Re: Patch for xembed (updated for resize) FIXED!!

podarcis <[email protected]>
Newsgroups gmane.comp.web.dillo.devel
Message-ID <[email protected]>
Damn,
something went wrong with pasting in the patch.
Here the complete patch, sorry.

---
diff -r 52633c6c3fc6 src/xembed.cc
--- a/src/xembed.cc    Wed Dec 12 19:40:33 2012 +0000
+++ b/src/xembed.cc    Sat Dec 15 11:49:23 2012 +0100
@@ -21,93 +21,49 @@

  #ifdef X_PROTOCOL

-typedef enum {
-  XEMBED_EMBEDDED_NOTIFY        = 0,
-  XEMBED_WINDOW_ACTIVATE        = 1,
-  XEMBED_WINDOW_DEACTIVATE      = 2,
-  XEMBED_REQUEST_FOCUS          = 3,
-  XEMBED_FOCUS_IN               = 4,
-  XEMBED_FOCUS_OUT              = 5,
-  XEMBED_FOCUS_NEXT             = 6,
-  XEMBED_FOCUS_PREV             = 7,
-  XEMBED_GRAB_KEY               = 8,
-  XEMBED_UNGRAB_KEY             = 9,
-  XEMBED_MODALITY_ON            = 10,
-  XEMBED_MODALITY_OFF           = 11,
-} XEmbedMessageType;
-
-void
-Xembed::setXembedInfo(unsigned long flags)
-{
-  unsigned long buffer[2];
-
-  Atom xembed_info_atom = XInternAtom (fl_display, "_XEMBED_INFO", false);
-
-  buffer[0] = 1;
-  buffer[1] = flags;
-
-  XChangeProperty (fl_display,
-     xid,
-     xembed_info_atom, xembed_info_atom, 32,
-     PropModeReplace,
-     (unsigned char *)buffer, 2);
+void Xembed::update_size() {
+   XWindowAttributes winAttributes;
+   XGetWindowAttributes( fl_display, xid, &winAttributes );
+   int width = winAttributes.width;
+   int height = winAttributes.height;
+   update_size(width, height);
  }

-void
-Xembed::sendXembedEvent(uint32_t message) {
-   XClientMessageEvent xclient;
-
-   memset (&xclient, 0, sizeof (xclient));
-   xclient.window = xid;
-   xclient.type = ClientMessage;
-   xclient.message_type = XInternAtom (fl_display, "_XEMBED", false);
-   xclient.format = 32;
-   xclient.data.l[0] = fl_event_time;
-   xclient.data.l[1] = message;
-
-   XSendEvent(fl_display, xid, False, NoEventMask, (XEvent *)&xclient);
-   XSync(fl_display, False);
+void Xembed::update_size(int width, int height) {
+   if (w() != width || h() != height)
+   {
+      resize(x(), y(), width, height);
+      redraw();
+   }
  }

-int
-Xembed::handle(int e) {
-   if (e == FL_PUSH)
-      sendXembedEvent(XEMBED_REQUEST_FOCUS);
-
-   return Fl_Window::handle(e);
-}
-
+static Xembed *xembed = 0;
  static int event_handler(int e, Fl_Window *w) {
-   Atom xembed_atom = XInternAtom (fl_display, "_XEMBED", false);
-
-   if (fl_xevent->type == ClientMessage) {
-      if (fl_xevent->xclient.message_type == xembed_atom) {
-         long message = fl_xevent->xclient.data.l[1];
-
-         switch (message) {
-            case XEMBED_WINDOW_ACTIVATE:
-               // Force a ConfigureNotify message so fltk can get the new
-               // coordinates after a move of the embedder window.
-               if (w)
-                  w->resize(0,0, w->w(), w->h());
-               break;
-            case XEMBED_WINDOW_DEACTIVATE:
-               break;
-            default:
-               break;
-         }
+   if ( fl_xevent->type == ConfigureNotify )
+   {
+      XConfigureEvent *xcfg = (XConfigureEvent *)fl_xevent;
+      uint32_t xid = xcfg->window;
+      if (xembed && xembed->myxid() == xid)
+      {
+         xembed->update_size(xcfg->width, xcfg->height);
        }
     }
-
     return Fl::handle_(e, w);
  }

  // TODO: Implement more XEMBED support;

+void Xembed::create() {
+   xembed = this;
+   createInternal(xid);
+   long mask( StructureNotifyMask );
+   XSelectInput(fl_display, xid, mask);
+   Fl::event_dispatch(event_handler);
+}
+
  void Xembed::show() {
-   createInternal(xid);
-   setXembedInfo(1);
-   Fl::event_dispatch(event_handler);
+   Fl_Window::show();
+   update_size();
  }

  void Xembed::createInternal(uint32_t parent) {
diff -r 52633c6c3fc6 src/xembed.hh
--- a/src/xembed.hh    Wed Dec 12 19:40:33 2012 +0000
+++ b/src/xembed.hh    Sat Dec 15 11:49:23 2012 +0100
@@ -9,15 +9,16 @@
     private:
        uint32_t xid;
        void createInternal(uint32_t parent);
-      void setXembedInfo(unsigned long flags);
-      void sendXembedEvent(uint32_t message);

     public:
        Xembed(uint32_t xid, int _w, int _h) : Fl_Window(_w, _h) {
-         this->xid = xid;
+         this->xid = xid; create();
        };
+      uint32_t myxid() const { return xid; }
+      void create();
        void show();
-      int handle(int event);
+      void update_size();
+      void update_size( int, int );
  };

  #endif
---
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.