From: Ken H. <kh...@so...> - 2004-04-20 14:11:37
|
I've read your patch comments and am wondering about some things. It seems to me that when an applet starts, if it does not send a size_request its main widget gets sized (W & H) to the current panel height so that it is square. Right? So can you simply change your W after getting the H from your base widget? Or does that still trigger the +2, +4 issue? On my screen (not using your patch) I see a border around the widget that shows the screen contents. This certainly appears to my eye to be about 2-4 pixels. Could it be that you are size_requesting the wrong widget? If there is a container around it with its own frame/border (2 pixels) could that be upsetting your calculations? Just my 2p Tony Houghton wrote: > There were some problems with the old patch eg the Pager applet refusing > to allow the panel to shrink and sometimes making it grow > uncontrollably, so I've tried to fix them. This patch is cumulative ie > it applies over the top of the previous one. > > I'm still scratching my head over why I'm having these problems. See > also my message "Panel size allocation weirdness". I'd be grateful if > someone who knows a lot more about GTK+ could look at the above message > and the comments I've made in my patch and come up with an explanation > and/or a better way of sizing the widget. Am I doing something wrong? > AFAICT ROX-Filer itself uses size_request [1] signals rather than > size-allocate for its panel icons. It's all very well for that because > it has access to o_panel_width, but an applet doesn't! Does it? > > [1] Does it not matter whether the signal name has a hyphen or > underscore? The code uses both. > > > > ------------------------------------------------------------------------ > > diff -u -r ./src/configure.in /home/tony/Apps/Pager/src/configure.in > --- ./src/configure.in 2004-04-17 21:30:28.000000000 +0100 > +++ /home/tony/Apps/Pager/src/configure.in 2004-04-17 21:21:52.000000000 +0100 > @@ -81,7 +81,6 @@ > dnl Checks for typedefs, structures, and compiler characteristics. > AC_C_CONST > AC_TYPE_SIZE_T > -AC_C_INLINE > > dnl Extract version info from AppInfo.xml > AC_MSG_CHECKING(extracting version information) > diff -u -r ./src/main.c /home/tony/Apps/Pager/src/main.c > --- ./src/main.c 2004-04-17 21:30:28.000000000 +0100 > +++ /home/tony/Apps/Pager/src/main.c 2004-04-17 21:32:43.000000000 +0100 > @@ -236,72 +236,79 @@ > return panel_orient; > } > > -static void work_out_size(int old_width, int old_height, > +static void work_out_size(int alloc_width, int alloc_height, > int *width, int *height) > { > double aspect; > int orient = panel_get_orient(); > + int n_screens = wnck_screen_get_workspace_count( > + wnck_screen_get_default()); > > + *width = alloc_width; > + *height = alloc_height; > if (orient == ORIENT_UNKNOWN) > - { > - *width = old_width; > - *height = old_height; > return; > - } > + /* Been occasionally getting 0 here for some reason */ > + g_return_if_fail(n_screens > 0); > > + /* FIXME: Aspect ratio always looks slightly wrong to me (TH) so we > + * probably need to take borders and workspace dividers into account or > + * something > + */ > aspect = ((double) gdk_screen_width() / (double) gdk_screen_height() > - * (double) wnck_screen_get_workspace_count( > - wnck_screen_get_default())) > + * (double) n_screens) > / (double) n_rows.int_value / (double) n_rows.int_value; > - /* Windows in pager always seem to look too wide to me for some reason, > - * so use 1.2 squash factor */ > if (orient == ORIENT_HORIZ) > { > - *height = old_height; > - *width = (int) ((double) *height * (aspect / 1.2)); > + *height = alloc_height; > + *width = (int) ((double) *height * aspect); > } > else > { > - *width = old_width; > - *height = (int) ((double) *width / (aspect / 1.2)); > + *width = alloc_width; > + *height = (int) ((double) *width / aspect); > } > } > > -inline static int abs_int(int a) > -{ > - return a >= 0 ? a : -a; > -} > - > -inline static int abs_diff(int a, int b) > -{ > - return abs_int(a - b); > -} > - > -static void set_size_request(GtkWidget *widget, int old_width, int old_height) > +static void set_size_request(GtkWidget *widget, int alloc_width, int > + alloc_height) > { > int width, height; > + /* For some reason we get allocated 2 more pixels (this changes to 4 > + * when user logs out) across the width of the panel than we ask for, > + * which causes the panel to grow unless we do something about it; so > + * we have to remember old size. > + */ > + static int old_width = 0; > + static int old_height = 0; > > /* If not in a panel do nothing */ > if (!socket) > return; > - > - /* For some reason we get allocated 2 more pixels across the width of > - * the panel than we ask for, which causes the panel to grow unless we > - * do something about it; start by subtracting those 2 pixels... */ > + > + /* If we don't subtract that 2 to start with the panel will grow by 2 > + * pixels when the Pager gets added. But we actually need to subtract > + * 4, otherwise we don't get size-allocate events when the user is > + * trying to shrink the panel and it can't shrink after all. This is > + * another mystery to me. > + */ > if (panel_get_orient() == ORIENT_VERT) > - old_width -= 2; > + alloc_width -= 4; > else > - old_height -= 2; > - work_out_size(old_width, old_height, &width, &height); > - /* Whatever we request, we still get allocated 2 pixels extra, and the > - * panel also has a tendency to grow by 4 pixels at a time when user > - * logs out, so avoid issuing a new size request unless there's been a > - * significant change > + alloc_height -= 4; > + /* Don't do anything if the size change appears to be a result of the > + * above "feature" > */ > - if (abs_diff(old_width, width) > 4 || abs_diff(old_height, height) > 4) > + work_out_size(alloc_width, alloc_height, &width, &height); > + if ((panel_get_orient() == ORIENT_VERT && alloc_width >= old_width && > + alloc_width - old_width <= 2) || > + (alloc_height >= old_height && alloc_height - old_height <= 2)) > { > - gtk_widget_set_size_request(widget, width, height); > + return; > } > + old_width = width; > + old_height = height; > + gtk_widget_set_size_request(widget, width, height); > } > > static void resize_handler(GtkWidget *widget, GtkAllocation *allocation, > @@ -341,7 +348,7 @@ > /* Send errors to stdout. Prevents bugs in OpenOffice flooding the > * error stream. > */ > - /*dup2(1, 2);*/ > + dup2(1, 2); > > screen = wnck_screen_get_default(); > -- Ken Hayber (kh...@so...) Huntington Beach, CA |