X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fframe.c;h=6248db7c0639e157fd923fb05618f2bc768a885b;hb=d3ecb7c127edc6fd16059f786818bde71b9540a7;hp=dd24f5cac98dea95a568edc312c987fea6049c44;hpb=7f262bc2a0733a77ae5a30752aecdcf4ba35f223;p=chaz%2Fopenbox diff --git a/openbox/frame.c b/openbox/frame.c index dd24f5ca..6248db7c 100644 --- a/openbox/frame.c +++ b/openbox/frame.c @@ -34,7 +34,7 @@ #define FRAME_EVENTMASK (EnterWindowMask | LeaveWindowMask | \ ButtonPressMask | ButtonReleaseMask) #define ELEMENT_EVENTMASK (ButtonPressMask | ButtonReleaseMask | \ - ButtonMotionMask | \ + ButtonMotionMask | PointerMotionMask | \ EnterWindowMask | LeaveWindowMask) /* The inner window does not need enter/leave events. If it does get them, then it needs its own context for enter events @@ -184,19 +184,6 @@ ObFrame *frame_new(ObClient *client) static void set_theme_statics(ObFrame *self) { /* set colors/appearance/sizes for stuff that doesn't change */ - XSetWindowBorder(ob_display, self->window, - RrColorPixel(ob_rr_theme->frame_b_color)); - XSetWindowBorder(ob_display, self->inner, - RrColorPixel(ob_rr_theme->frame_b_color)); - XSetWindowBorder(ob_display, self->title, - RrColorPixel(ob_rr_theme->frame_b_color)); - XSetWindowBorder(ob_display, self->handle, - RrColorPixel(ob_rr_theme->frame_b_color)); - XSetWindowBorder(ob_display, self->rgrip, - RrColorPixel(ob_rr_theme->frame_b_color)); - XSetWindowBorder(ob_display, self->lgrip, - RrColorPixel(ob_rr_theme->frame_b_color)); - XResizeWindow(ob_display, self->max, ob_rr_theme->button_size, ob_rr_theme->button_size); XResizeWindow(ob_display, self->iconify, @@ -576,9 +563,6 @@ void frame_grab_client(ObFrame *self) /* map the client so it maps when the frame does */ XMapWindow(ob_display, self->client->window); - /* adjust the frame to the client's size */ - frame_adjust_area(self, FALSE, TRUE, FALSE); - /* set all the windows for the frame in the window_map */ g_hash_table_insert(window_map, &self->window, self->client); g_hash_table_insert(window_map, &self->plate, self->client); @@ -683,7 +667,7 @@ static gboolean is_button_present(ObFrame *self, const gchar *lc, gint dir) { static void layout_title(ObFrame *self) { gchar *lc; - gint i, x; + gint i; const gint bwidth = ob_rr_theme->button_size + ob_rr_theme->paddingx + 1; /* position of the left most button */ @@ -695,6 +679,7 @@ static void layout_title(ObFrame *self) self->icon_on = self->desk_on = self->shade_on = self->iconify_on = self->max_on = self->close_on = self->label_on = FALSE; self->label_width = self->width - (ob_rr_theme->paddingx + 1) * 2; + self->leftmost = self->rightmost = OB_FRAME_CONTEXT_NONE; /* figure out what's being show, find each element's position, and the width of the label @@ -703,16 +688,21 @@ static void layout_title(ObFrame *self) i will be +1 the first time through when working to the left, and -1 the second time through when working to the right */ for (i = 1; i >= -1; i-=2) { + gint x; + ObFrameContext *firstcon; + if (i > 0) { x = left; lc = config_title_layout; + firstcon = &self->leftmost; } else { x = right; lc = config_title_layout + strlen(config_title_layout)-1; + firstcon = &self->rightmost; } /* stop at the end of the string (or the label, which calls break) */ - for (; *lc != '\0' && lc >= config_title_layout; lc+=i) + for (; *lc != '\0' && lc >= config_title_layout; lc+=i) { if (*lc == 'L') { if (i > 0) { self->label_on = TRUE; @@ -720,43 +710,52 @@ static void layout_title(ObFrame *self) } break; /* break the for loop, do other side of label */ } else if (*lc == 'N') { + if (firstcon) *firstcon = OB_FRAME_CONTEXT_ICON; if ((self->icon_on = is_button_present(self, lc, i))) { - /* icon gets extra padding */ + /* icon is bigger than buttons */ self->label_width -= bwidth + 2; - self->icon_x = x + (i * 1); + self->icon_x = x; x += i * (bwidth + 2); } } else if (*lc == 'D') { + if (firstcon) *firstcon = OB_FRAME_CONTEXT_ALLDESKTOPS; if ((self->desk_on = is_button_present(self, lc, i))) { self->label_width -= bwidth; self->desk_x = x; x += i * bwidth; } } else if (*lc == 'S') { + if (firstcon) *firstcon = OB_FRAME_CONTEXT_SHADE; if ((self->shade_on = is_button_present(self, lc, i))) { self->label_width -= bwidth; self->shade_x = x; x += i * bwidth; } } else if (*lc == 'I') { + if (firstcon) *firstcon = OB_FRAME_CONTEXT_ICONIFY; if ((self->iconify_on = is_button_present(self, lc, i))) { self->label_width -= bwidth; self->iconify_x = x; x += i * bwidth; } } else if (*lc == 'M') { + if (firstcon) *firstcon = OB_FRAME_CONTEXT_MAXIMIZE; if ((self->max_on = is_button_present(self, lc, i))) { self->label_width -= bwidth; self->max_x = x; x += i * bwidth; } } else if (*lc == 'C') { + if (firstcon) *firstcon = OB_FRAME_CONTEXT_CLOSE; if ((self->close_on = is_button_present(self, lc, i))) { self->label_width -= bwidth; self->close_x = x; x += i * bwidth; } - } + } else + continue; /* don't set firstcon */ + firstcon = NULL; + } } /* position and map the elements */ @@ -848,7 +847,7 @@ ObFrameContext frame_context_from_string(const gchar *name) return OB_FRAME_CONTEXT_NONE; } -ObFrameContext frame_context(ObClient *client, Window win) +ObFrameContext frame_context(ObClient *client, Window win, gint x, gint y) { ObFrame *self; @@ -875,8 +874,30 @@ ObFrameContext frame_context(ObClient *client, Window win) return OB_FRAME_CONTEXT_CLIENT; } + if (win == self->title) { + /* when the user clicks in the corners of the titlebar and the client + is fully maximized, then treat it like they clicked in the + button that is there */ + if (self->client->max_horz && self->client->max_vert && + y < ob_rr_theme->paddingy + 1 + ob_rr_theme->button_size) + { + if (x < ((ob_rr_theme->paddingx + 1) * 2 + + ob_rr_theme->button_size)) { + if (self->leftmost != OB_FRAME_CONTEXT_NONE) + return self->leftmost; + } + else if (x > (self->width - + (ob_rr_theme->paddingx + 1 + + ob_rr_theme->button_size))) + { + if (self->rightmost != OB_FRAME_CONTEXT_NONE) + return self->rightmost; + } + } + return OB_FRAME_CONTEXT_TITLEBAR; + } + if (win == self->window) return OB_FRAME_CONTEXT_FRAME; - if (win == self->title) return OB_FRAME_CONTEXT_TITLEBAR; if (win == self->label) return OB_FRAME_CONTEXT_TITLEBAR; if (win == self->handle) return OB_FRAME_CONTEXT_HANDLE; if (win == self->lgrip) return OB_FRAME_CONTEXT_BLCORNER;