📄 dock.c
字号:
} while (orig_off_y != off_y); if (slist) { GList *mlist = g_list_copy(slist); /* Remove this widget from the list */ for (node = mlist; node; node = g_list_next(node)) { dw = node->data; if (dw->w == widget) { mlist = g_list_remove_link(mlist, node); g_list_free_1(node); break; } } for (node = mlist; node;) { GList *temp; gint dx, dy, dwidth, dheight; dw = node->data; dock_get_widget_pos(dw->w, &dx, &dy); gdk_window_get_size(dw->w->window, &dwidth,&dheight); /* * Find windows that are directly docked to this window, * move it, and any windows docked to that window again */ if (is_docked(x, y, w, h, dx, dy, dwidth, dheight) && ((dx + dwidth) > x && dx < (x + w))) { mlist = g_list_remove_link(mlist, node); g_list_free_1(node); if (dy > y) temp = shade_move_list(mlist, dw->w, off_y); else if(off_y - (new_h - h) != 0) temp = shade_move_list(mlist, dw->w, off_y - (new_h - h)); else temp = mlist; node = mlist = temp; } else node = g_list_next(node); } g_list_free(mlist); } g_list_free(slist); free_docked_list(docked_list); dock_set_uposition(widget, x, y + off_y - (new_h - h)); dock_window_resize(widget, w, new_h, w, h);}static GList *resize_move_list(GList *list, GtkWidget *widget, gint offset_x, gint offset_y){ gint x,y,w,h; GList *node; DockedWindow *dw; dock_get_widget_pos(widget,&x,&y); gdk_window_get_size(widget->window, &w,&h); for(node = list; node;) { gint dx, dy, dwidth, dheight; dw = node->data; dock_get_widget_pos(dw->w, &dx, &dy); gdk_window_get_size(dw->w->window, &dwidth,&dheight); if(is_docked(x,y,w,h,dx,dy,dwidth,dheight)) { list = g_list_remove_link(list, node); g_list_free_1(node); node = list = resize_move_list(list, dw->w, offset_x, offset_y); } else node = g_list_next(node); } dock_set_uposition(widget, x + offset_x, y + offset_y); return list;}static GList *resize_calc_offset(GList *list, GtkWidget *widget, gint offset_x, gint offset_y, gint *goffset_x, gint *goffset_y){ gint x, y, w, h; GList *node; DockedWindow *dw; dock_get_widget_pos(widget, &x, &y); gdk_window_get_size(widget->window, &w, &h); for(node = list; node;) { gint dx, dy, dwidth, dheight; dw = node->data; dock_get_widget_pos(dw->w, &dx, &dy); gdk_window_get_size(dw->w->window, &dwidth,&dheight); if (is_docked(x, y, w, h, dx, dy, dwidth, dheight)) { if (dx + offset_x + dwidth > gdk_screen_width()) { offset_x -= dx + offset_x + dwidth - gdk_screen_width(); (*goffset_x) -= dx + offset_x + dwidth - gdk_screen_width(); } if (dy + offset_y + dheight > gdk_screen_height()) { offset_y -= dy + offset_y + dheight - gdk_screen_height(); (*goffset_y) -= dy + offset_y + dheight - gdk_screen_height(); } list = g_list_remove_link(list, node); g_list_free_1(node); node = list = resize_calc_offset(list, dw->w, offset_x, offset_y, goffset_x, goffset_y); } else node = g_list_next(node); } return list;}void dock_resize(GList *window_list, GtkWidget *widget, gint new_w, gint new_h){ gint x, y, w, h; gint dx, dy, dwidth, dheight; gint off_x, off_y; GList *list, *dlist = NULL, *tlist = NULL, *mlist = NULL, *node; DockedWindow *dw; dock_get_widget_pos(widget, &x, &y); gdk_window_get_size(widget->window, &w, &h); if (cfg.show_wm_decorations) { dock_window_resize(widget, new_w, new_h, w, h); return; } list = get_docked_list(NULL, window_list,widget,0,0); off_x = 0; off_y = 0; for (node = list; node; node = g_list_next(node)) { dw = node->data; if(dw->w != widget) { dock_get_widget_pos(dw->w, &dx, &dy); gdk_window_get_size(dw->w->window,&dwidth,&dheight); if(is_docked(x, y, w, h, dx, dy, dwidth, dheight)) dlist = g_list_append(dlist, dw); else mlist = g_list_append(mlist, dw); } } tlist = g_list_copy(mlist); for (node = dlist; node; node = g_list_next(node)) { gint doff_x, doff_y; dw = node->data; dock_get_widget_pos(dw->w, &dx, &dy); gdk_window_get_size(dw->w->window,&dwidth,&dheight); if (dx - x - w == 0) doff_x = (x + off_x + new_w) - dx; else doff_x = (x + off_x + (dx - x)) - dx; if (dy - y - h == 0) doff_y = (y + off_y + new_h) - dy; else doff_y = (y + off_y + (dy - y)) - dy; if (dx + doff_x + dwidth > gdk_screen_width()) { off_x -= dx + doff_x + dwidth - gdk_screen_width(); doff_x -= dx + doff_x + dwidth - gdk_screen_width(); } if (dy + doff_y + dheight > gdk_screen_height()) { off_y -= dy + doff_y + dheight - gdk_screen_height(); doff_y -= dy + doff_y + dheight - gdk_screen_height(); } tlist = resize_calc_offset(tlist, dw->w, doff_x, doff_y, &off_x, &off_y); } if((x + off_x + new_w) > gdk_screen_width()) off_x -= x + off_x + new_w - gdk_screen_width(); if((y + off_y + new_h) > gdk_screen_height()) off_y -= y + off_y + new_h - gdk_screen_height(); g_list_free(tlist); for(node = dlist; node; node = g_list_next(node)) { gint doff_x, doff_y; dw = node->data; dock_get_widget_pos(dw->w, &dx, &dy); if(dx - x - w == 0) doff_x = (x + off_x + new_w) - dx; else doff_x = (x + off_x + (dx - x)) - dx; if(dy - y - h == 0) doff_y = (y + off_y + new_h) - dy; else doff_y = (y + off_y + (dy - y)) - dy; mlist = resize_move_list(mlist, dw->w, doff_x, doff_y); dock_set_uposition(dw->w, dx + doff_x, dy + doff_y); } dock_set_uposition(widget, x + off_x, y + off_y); dock_window_resize(widget, new_w, new_h, w, h);} void dock_move_press(GList *window_list, GtkWidget *w, GdkEventButton *event, gboolean move_list){ gint mx,my; DockedWindow *dwin; if (cfg.show_wm_decorations) return; gdk_window_raise(w->window); gdk_window_get_pointer(w->window, &mx, &my, NULL); gtk_object_set_data(GTK_OBJECT(w), "move_offset_x", GINT_TO_POINTER(mx)); gtk_object_set_data(GTK_OBJECT(w), "move_offset_y", GINT_TO_POINTER(my)); if (move_list) gtk_object_set_data(GTK_OBJECT(w),"docked_list", get_docked_list(NULL,window_list,w,0,0)); else { dwin = g_malloc0(sizeof(DockedWindow)); dwin->w = w; gtk_object_set_data(GTK_OBJECT(w),"docked_list", g_list_append(NULL, dwin)); } gtk_object_set_data(GTK_OBJECT(w), "window_list", window_list); gtk_object_set_data(GTK_OBJECT(w), "is_moving", GINT_TO_POINTER(1));}void dock_move_motion(GtkWidget *w, GdkEventMotion *event){ gint offset_x, offset_y, win_x, win_y, x, y, mx, my; GList *dlist; GList *window_list; XEvent ev; gdk_flush(); while (XCheckTypedEvent(GDK_DISPLAY(), MotionNotify, &ev)); if (!gtk_object_get_data(GTK_OBJECT(w), "is_moving")) return; offset_x = GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(w), "move_offset_x")); offset_y = GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(w), "move_offset_y")); dlist = gtk_object_get_data(GTK_OBJECT(w), "docked_list"); window_list = gtk_object_get_data(GTK_OBJECT(w), "window_list"); dock_get_widget_pos(w, &win_x, &win_y); gdk_window_get_pointer(NULL, &mx, &my, NULL); x = mx - offset_x; y = my - offset_y; calc_snap_offset(dlist, window_list, x, y, &offset_x, &offset_y); x += offset_x; y += offset_y; docked_list_move(dlist, x, y);}void dock_move_release(GtkWidget *w){ GList *dlist; gtk_object_remove_data(GTK_OBJECT(w), "is_moving"); gtk_object_remove_data(GTK_OBJECT(w), "move_offset_x"); gtk_object_remove_data(GTK_OBJECT(w), "move_offset_y"); if ((dlist = gtk_object_get_data(GTK_OBJECT(w), "docked_list")) != NULL) free_docked_list(dlist); gtk_object_remove_data(GTK_OBJECT(w), "docked_list"); gtk_object_remove_data(GTK_OBJECT(w), "window_list");}gboolean dock_is_moving(GtkWidget *w){ if(gtk_object_get_data(GTK_OBJECT(w),"is_moving")) return TRUE; return FALSE;}static gboolean configure_event(GtkWidget *w, GdkEventConfigure *event, gpointer data){ gint x, y; if (!GTK_WIDGET_VISIBLE(w)) return FALSE; gdk_window_get_deskrelative_origin(w->window, &x, &y); gtk_object_set_data(GTK_OBJECT(w), "window_x", GINT_TO_POINTER(x)); gtk_object_set_data(GTK_OBJECT(w), "window_y", GINT_TO_POINTER(y)); return FALSE;} GList *dock_add_window(GList *list, GtkWidget *w){ list = g_list_append(list, w); gtk_signal_connect(GTK_OBJECT(w), "configure_event", GTK_SIGNAL_FUNC(configure_event), NULL); return list;} void dock_set_uposition(GtkWidget *w, gint x, gint y){ gtk_widget_set_uposition(w, x, y); gtk_object_set_data(GTK_OBJECT(w), "window_x", GINT_TO_POINTER(x)); gtk_object_set_data(GTK_OBJECT(w), "window_y", GINT_TO_POINTER(y));}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -